Desarrollo Web / Mobile
& Visual Studio Code
Camilo Martínez
La regla de oro para legibilidad y entendimiento del código.
Todo el equipo de trabajo debe usar la misma regla para evitar el desastre de falsos positivos en los merge.
Espacios o tabulaciones, NUNCA ambos. Si son espacios definir la cantidad de espacios a usar (recomendado 2).
Lo importante es que el equipo haga un consenso y todos se apeguen a esa regla.
Recomendado espacios sobre tabulaciones, debido a que cada IDE o Editor puede interpretarlos de forma diferente. Ademas porque...
Developer Survey 2017
Let's make some money!
"beautify.config": {
"end_with_newline": true,
"indent_size": 2,
"indent_char": " ",
"css": {
"indent_size": 2
},
"html": {
"wrap_attributes": "auto"
}
},
"editor.autoIndent": true,
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
"editor.renderWhitespace": "boundary",
"eslint.enable": true,
"eslint.options": {
"rules": {
"indent": [
"error",
2,
{
"SwitchCase": 1
}
]
}
},
Extensiones:
Configuracion:
ESLint requiere ser instalado, con el package manager de su preferencia
npm i -g eslint
yarn global add eslint
Yo ya me las leí
Neo no las usaba y se salvó
Eso es pa novatos
Me las se de memoria ¿pregunteme?
¿Y eso donde está?
En la capacitación no me dijeron
¿Había que usarlas?
Solucionan uno de los retos más complejos en un proyecto de software: nombrar cosas.
Aléjese de estas situaciones.
Las etiquetas en HTML van en minúsculas y los atributos deben ir con con " (comilla doble). Los strings en JavaScript deben ir con ' (comilla sencilla).
Los símbolos de operación deben tener espacios antes y después.
<div class='color'>
var foo="bar";
var sum=a+b;
var html = '<div class="color">'
var sum = a + b;
Bien:
Mal:
Como cada petición de un archivo es bloqueante ¿Cúal es el mejor lugar para las etiquetas sctipt y link rel?
Los scripts, que no son indispensables, también se pueden incluir en el body con un uso consiente de las propiedades async y defer cambiando el comportamiento de carga.
Aprenderse todas esas reglas es difícil y el ser humanos comete herrores errores.
Es una herramienta que permite identificar bugs, fallos de seguridad, reglas, code smell, code coverage y hasta código duplicado.
Pero no se puede confiar dejándole toda la tarea a una maquina, ellas son buenas para hacer y como no comprenden se puede engañar fácilmente.
"beautify.config": {
"end_with_newline": true,
"indent_size": 2,
"indent_char": " ",
"css": {
"indent_size": 2
},
"html": {
"wrap_attributes": "auto"
}
},
"cSpell.language": "en,es",
"cSpell.userWords": [],
"editor.autoIndent": true,
"editor.formatOnPaste": false,
"editor.formatOnSave": true,
"editor.renderWhitespace": "boundary",
"editor.codeActionsOnSave": {
"source.organizeImports": true
},
"eslint.enable": true,
"eslint.options": {
"env": {
"browser": true,
"commonjs": true,
"es6": true,
"jquery": true
},
"extends": [
"eslint:recommended"
],
"parserOptions": {
"sourceType": "module"
},
"rules": {
"eqeqeq": [
2,
"allow-null"
],
"indent": [
"error",
2,
{
"SwitchCase": 1
}
],
"no-console": "off"
}
},
"eslint.packageManager": "yarn",
Extensiones (Linters):
Configuracion:
Algunas extensiones requieren una instalación adicional con npm.
Verifique la documentación.
Henry Ford descubrió hace muchos, que un espacio de trabajo organizado y limpio mejora la productividad.
¿Qué tan ordenado está tu proyecto?
¿Están definidos claramente los espacios?
¿Usted contribuye con el ordenamiento del proyecto?
¿Ha visto alguna vez la carpeta de imágenes, librerías, script, css o los archivos de utilidades?
¿Cuando crea un método busca si ya existe y lo ubica en el lugar correcto?
¿Sabe donde encontrar claramente una imagen o función?
Estandarizar la misma ruta de trabajo para todo el equipo, evita perdidas de tiempo de configuración, puesta a punto, permisos, rutas o hasta diferencias en los repositorios.
Se deben agrupar los objetos en carpetas (el infierno de las imágenes), así como los métodos en clases y ellas en namespaces.
Se recomienda usar las siguientes carpetas:
Aún puedes aprender mas sobre buenas practicas y guías de estilo.
Es una herramienta muy poderosa pero exponencialmente compleja.
La especificidad genera un puntaje dependiendo del tipo de selector. El valor acumulado, se aplica o no la declaración:
Puntos | Selector |
---|---|
1 | Type selectors (h1, a, p), pseudo-elementos (::before) |
10 | Class selectors (.hola), attributes selectors ([type="radio"]) y pseudo-classes (:hover) |
100 | ID selectors (#chao) |
1000 | inline styles ( style={color: grey;} ) |
∞ | important! |
¿Prueba tú conocimiento?
Si calcula el mismo puntaje, gana la que esté más abajo.
ITCSS es una arquitectura de CSS sana, escalable y administrada. Un crecimiento progresivo indica mayor mantenibilidad.
¿tu proyecto que tan saludable está?
Mal:
Bien:
Más que nombrar clases, generar cultura en el equipo.
Lectura Recomendada:
Se puede hacer una especie de herencia, jugando con la precedencia que sobrescribe las reglas con las ultimas que cargue, en otro archivo o mas abajo.
color: red
text-align: center
text-align: left
text-align: right
General
Android
General
iOS
color: red
text-align: center
text-align: left
color: red
text-align: center
text-align: right
Playground: CSS Dependencies
Es preferible crear estilos .nombre en vez de #id. Un id en HTML es único, por lo que un estilo tipo id no se puede re-utilizar ni combinar con otros id.
#cuerpo {
background-color: blue;
}
.cuerpo {
background-color: blue;
}
Bien:
Mal:
No se deben definir estilos dentro de los HTML, se deben usar las clases.
<div style="background-color: blue;">
<div class="cuerpo">
Bien:
Mal:
No se deben usar clases inexistentes para operar los selectores. Para eso existen los data-atributos.
<div class="required">
let required = $('element .required');
let value = $('element').val();
if (required && !value){
alert('Campo Requerido')
}
<div data-enabled="true">
let required = $('element').data('required');
let value = $('element').val();
if (required && !value){
alert('Campo Requerido')
}
Bien:
Mal:
Suponiendo que la clase required no existe en los archivos css
Dicen los que saben de CSS que si lo estas usando, algo estas haciendo mal.
Una forma de evitarlo es incluir primero los estilos de las librerías y luego los nuestros para que se sobrescriban por precedencia.
Es una atentado directo a la especificidad.
Hágase un favor (y a su equipo de desarrollo) aprenda y use herramientas como Sass.
Sigan una guía de estilos (si, otras mas) y el patrón 7-1.
Por su propio beneficio, es estrictamente necesario conocer Truthy & Falsy. La mayoría de validaciones se pueden resolver con ellas.
if (value !== undefined && value !== null && value !== '')
if (!value)
Bien:
Mal:
Le podemos sacar el jugo a Truthy y Falsy para disminuir la cantidad de código y mejorar la legibilidad.
var foo = bar ? bar : 'value';
var foo = bar || 'value';
Bien:
Mal:
if (foo.isEnabled){
function();
}
foo.isEnabled && function();
if (result === true){
return true;
} else {
return false;
}
return !!result;
No se deben modificar elementos adicionando estilos en linea. Lo recomendado es des/asignar clases.
element.setAttribute("style", "background-color: red;");
element.classList.add('mystyle');
element.classList.toggle('mystyle');
element.classList.remove('mystyle');
Bien:
Mal:
JSON por naturaleza es un objeto JS, sáquele el jugo y conozca manipularlo a través de propiedades dinámicas.
{
"one": {"pId": "foo1", "cId": "bar1"},
"two": {"pId": "foo2", "cId": "bar2"},
"three": {"pId": "foo3", "cId": "bar3"}
}
id = "one"; // Or whatever
var entry = objJsonResp[id];
objJsonResp[id] = /* value */;
delete objJsonResp[id];
Buscar
Actualizar
Eliminar
No se debe usar .length en la condición de los ciclos, excepto si es un string. Causa que se calcule en cada iteración.
let foo = [0, 1, 2, 3];
for (let i = 0; i < foo.length; i++)
let foo = [0, 1, 2, 3];
let len = foo.length;
for (let i = 0; i < len; i++)
let bar = "0123";
for (let i = 0; i < bar.length; i++)
Bien:
Mal:
Es muy fácil introducir Memory Leaks y consumir mas memoria de la necesaria. Debe asignar un valor para iniciarla y no usar varios tipos de datos, esto ultimo genera varias instancias de la misma variable.
let foo;
foo=0;
foo="bar"
let foo = "";
foo = "bar";
Bien:
Mal:
Los valores de fuentes desconocidas deben ser saneados (HTML Entities) para evitar XSS.
$('<div/>' + data.name + '</div>');
$('#evil').html(data.name);
$('<div/>', { 'class': "header" }).text(data.name);
$('#saint').text(data.name);
Bien:
Mal:
Playground: jQuery XSS
Se pueden sobre escribir métodos. Igual que la dependencia de CSS, si se define la misma funciona usa la última que cargo.
function hello() {
console.log('Hello World');
}
function hello() {
console.log('Hola Mundo');
}
main-es.js
main.js
<script src="main.js"></script>
<script src="main-es.js"></script>
index.html
Se deben usar operadores de comparación estrictos, que validen tipo de dato y valor.
0 == "0"
0 != "0"
0 === "0"
0 !== "0"
Bien:
Mal:
La mantenibilidad del código no es negociable. Los if, inclusive lo de una línea deben incluir las llaves.
if (value)
foo()
else
bar()
if (value) {
foo()
} else {
bar()
}
Bien:
Mal:
Se evita introducir errores al pensar que la lógica se determina por la tabulación.
Por dificultades de lectura, no se recomienda su uso. En caso de necesitarlo solo para asignaciones de valores.
(
(esValido) ?
'foo'
:
'bar'
)
valor = (esValido ? (esFoo ? 'foo' : '') : 'bar')
valor = (esValido ? 'foo' : 'bar')
Bien:
Mal:
Si llevan mas de una línea, implican algún tipo de lógica o se anidan varias condiciones se debe usar if-else.
Lastimosamente no todos usan Promises o Async/Await No nos vamos a salvar de los callback, así que tratemos de hacer mas legible su consumo.
foo(
value,
function(){
console.log('success');
},
function(){
console.log('failure');
}
);
function success(){
console.log('success');
}
function failure(){
console.log('failure');
}
foo(value, success, failure);
Bien:
Mal (fx anónimas):
function foo (bar, success, failure){
if (bar){
success();
} else {
failure();
}
}
Para evitar anidamiento de if...else se pueden usar guardias, validando al. Se basan en truthy/falsy y jugar con return para mejorar la legibilidad.
function userIsAdmin(user) {
if (user.role == 'admin') {
if (user.manager == true) {
return true;
}
else {
return false;
}
}
else {
return false;
}
}
function userIsAdmin(user) {
if (user.role != 'admin') {
return false;
}
if (user.manager != true) {
return false;
}
return true;
}
Bien:
Mal:
No, en JavaScript aún queda mucho que aprender. Alimente su conocimiento, aprendiendo algo nuevo cada día...
JavaScript Resumido ¿está listo para una entrevista?
Existe un lugar peligroso llamado, el infierno de los callback.
Cuando repita mas de 5 veces una tarea busque como automatizarla.
Siempre hay tiempo para mejorar, no permita que el día a día lo enceguezca.
No se acostumbre a que un problema se convierta en paisaje aceptado por todos.
No hay nada mas aburridor que repetir la misma tarea una y otra vez. Instale extensiones de ayuda.
Snippets:
Aprenda Emmet, sus falanges se lo agradecerán.
Productividad:
Chromebook podrá ser un vampiro chupa memoria, pero sin duda siempre están pensando en hacerle la vida mas fácil a los desarrolladores.
¿Sabia que puede bloquear los request desde el mismo navegador para probar su sitio cuando está offline?
Aprenda a usarlas le facilitará enormemente su vida.
Aprenda de los mejores. Ya hay muchas formas de acceder a las mejores prácticas de la industria.