JavaScript

JavaScript

Tutorial JavaScript: ESLint y calidad de código

JavaScript linting con ESLint: optimiza tu código y detecta errores antes de la ejecución. Herramienta esencial para desarrolladores.

Aprende JavaScript y certifícate

Importancia del linting: Beneficios clave

El linting es un proceso de análisis estático del código que identifica patrones problemáticos y errores potenciales antes de que el código se ejecute. En el ecosistema JavaScript, donde la flexibilidad del lenguaje puede conducir fácilmente a errores sutiles, el linting se convierte en una herramienta esencial para cualquier desarrollador profesional.

¿Por qué necesitamos linting en JavaScript?

JavaScript, al ser un lenguaje de tipado dinámico y con muchas peculiaridades sintácticas, permite escribir código que funciona pero que puede contener problemas ocultos. Un linter como ESLint actúa como un primer filtro de calidad, señalando estos problemas antes de que lleguen a producción.

Beneficios principales del linting

  • 1. Detección temprana de errores:
// Sin linting, este error podría pasar desapercibido
function calculateTotal(items) {
  let total = 0;
  for (let i = 0; i < items.lenght; i++) { // Error tipográfico: "lenght" en lugar de "length"
    total += items[i].price;
  }
  return total;
}

Un linter detectaría inmediatamente el error tipográfico en items.lenght, evitando un comportamiento inesperado durante la ejecución.

  • 2. Consistencia en el código:

Cuando trabajamos en equipos de desarrollo, cada programador puede tener su propio estilo de escritura. ESLint permite establecer reglas comunes para todo el equipo:

// Estilo inconsistente
const getUserData = function(userId) { return fetchData(userId); }
function displayUserInfo(data) {
    console.log(`Nombre: ${data.name}`)
}

Con reglas de linting, se puede estandarizar el uso de funciones flecha, espaciado, indentación y otros aspectos estilísticos.

  • 3. Aplicación de mejores prácticas:
// Código con potenciales problemas
if (user.isAdmin)
  deleteAllRecords();
  notifyUser(); // Este código siempre se ejecuta, independientemente de la condición

ESLint advertiría sobre la falta de llaves en el bloque if, evitando un error lógico común donde la indentación visual no coincide con la estructura real del código.

  • 4. Mejora de la mantenibilidad:

El linting fomenta prácticas que hacen que el código sea más legible y mantenible a largo plazo:

// Variables no utilizadas o redundantes
const userData = fetchUserData();
const userProfile = fetchUserProfile(); // Nunca se utiliza en el código
return formatUserData(userData);

ESLint identificaría userProfile como una variable declarada pero nunca utilizada, ayudando a mantener el código limpio.

  • 5. Prevención de vulnerabilidades de seguridad:
// Código potencialmente inseguro
eval(userInput); // Ejecuta código proporcionado por el usuario

// O uso de innerHTML con contenido no sanitizado
element.innerHTML = userGeneratedContent;

Un linter configurado adecuadamente advertiría sobre estas prácticas que pueden introducir vulnerabilidades como inyección de código.

  • 6. Optimización del rendimiento:

ESLint puede identificar patrones que afectan negativamente al rendimiento:

// Patrón ineficiente
const items = [];
for (let i = 0; i < 1000; i++) {
  items.push({ id: i });
  document.getElementById('container').innerHTML += `<div>${i}</div>`; // Causa múltiples reflows
}

El linter señalaría la manipulación repetida del DOM dentro de un bucle como una práctica a evitar.

  • 7. Facilita la adopción de nuevas características del lenguaje:
// Código antiguo
var self = this;
element.addEventListener('click', function() {
  self.handleClick();
});

// Con características modernas
element.addEventListener('click', () => {
  this.handleClick();
});

ESLint puede configurarse para sugerir el uso de características modernas de JavaScript, ayudando a mantener el código actualizado.

  • 8. Reducción del tiempo de depuración:

Al detectar problemas antes de ejecutar el código, el tiempo dedicado a la depuración se reduce significativamente. Los errores sintácticos y muchos errores lógicos se identifican inmediatamente, en lugar de manifestarse durante las pruebas o, peor aún, en producción.

  • 9. Documentación implícita:

Las reglas de linting actúan como una forma de documentación implícita para el proyecto. Un nuevo desarrollador que se une al equipo puede entender rápidamente las convenciones del proyecto simplemente observando las reglas de ESLint configuradas.

El linting no es solo una herramienta para encontrar errores, sino un componente fundamental en el flujo de trabajo moderno de desarrollo JavaScript que mejora la calidad del código, reduce los costos de mantenimiento y fomenta prácticas consistentes en todo el equipo de desarrollo.

Configuración básica: Instalación y primeros pasos

Para comenzar a utilizar ESLint en tus proyectos JavaScript, necesitas configurarlo correctamente. El proceso es sencillo pero requiere algunos pasos específicos que te permitirán adaptar la herramienta a las necesidades de tu proyecto.

Instalación de ESLint

Lo primero es instalar ESLint en tu proyecto. Para ello, necesitas tener Node.js y npm instalados en tu sistema. La instalación se realiza a través de la línea de comandos:

# Instalación local (recomendada para proyectos)
npm install eslint --save-dev

# O con yarn
yarn add eslint --dev

Es preferible instalar ESLint como una dependencia de desarrollo para cada proyecto, en lugar de instalarlo globalmente, ya que esto permite tener diferentes versiones y configuraciones para distintos proyectos.

Inicialización y configuración

Una vez instalado, puedes inicializar ESLint en tu proyecto mediante el asistente de configuración:

npx eslint --init

Este comando iniciará un asistente interactivo que te hará preguntas sobre tu proyecto para generar un archivo de configuración adecuado. Algunas de las opciones que te presentará son:

  • Cómo quieres usar ESLint (verificar sintaxis, encontrar problemas, aplicar estilo)
  • Qué tipo de módulos usa tu proyecto (ES modules, CommonJS, etc.)
  • Qué framework utilizas (React, Vue, ninguno)
  • Si usas TypeScript
  • Dónde se ejecuta tu código (navegador, Node.js)
  • Qué formato prefieres para el archivo de configuración (JavaScript, JSON, YAML)

Archivo de configuración

Después de responder las preguntas, ESLint creará un archivo de configuración (.eslintrc.js, .eslintrc.json o .eslintrc.yml, según tu elección). Este archivo contiene todas las reglas y ajustes que ESLint utilizará para analizar tu código.

Un ejemplo básico de un archivo .eslintrc.json podría verse así:

{
  "env": {
    "browser": true,
    "es2021": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "rules": {
    "indent": ["error", 2],
    "quotes": ["warn", "single"],
    "semi": ["error", "always"]
  }
}

En este ejemplo:

  • env define los entornos donde se ejecutará el código
  • extends permite heredar configuraciones predefinidas
  • parserOptions configura cómo ESLint interpreta tu código
  • rules define reglas específicas y su severidad

Ignorando archivos

Es común que quieras excluir ciertos archivos o directorios del análisis. Para ello, crea un archivo .eslintignore en la raíz de tu proyecto:

# Archivos y directorios a ignorar
node_modules/
dist/
build/
coverage/
*.min.js

Ejecutando ESLint

Para analizar tu código, ejecuta ESLint desde la línea de comandos:

# Analizar un archivo específico
npx eslint archivo.js

# Analizar todos los archivos JavaScript en un directorio
npx eslint src/

# Analizar y corregir automáticamente problemas (cuando sea posible)
npx eslint src/ --fix

Integración con el editor de código

Para maximizar la eficiencia, es recomendable integrar ESLint con tu editor de código. La mayoría de los editores populares tienen extensiones disponibles:

  • VS Code: ESLint extension
  • WebStorm: Soporte integrado
  • Sublime Text: SublimeLinter-eslint
  • Atom: linter-eslint

Estas extensiones proporcionan retroalimentación en tiempo real mientras escribes código, subrayando los problemas directamente en el editor:

// El editor mostrará un error aquí debido a la regla "semi"
const greeting = "Hello world"  // Falta punto y coma

Configuración en package.json

Para facilitar el uso de ESLint, puedes añadir scripts en tu package.json:

{
  "scripts": {
    "lint": "eslint .",
    "lint:fix": "eslint . --fix"
  }
}

Esto te permite ejecutar ESLint con comandos simples:

npm run lint
npm run lint:fix

Primeras pruebas

Para verificar que tu configuración funciona correctamente, crea un archivo JavaScript con algunos errores intencionales:

// test.js - Archivo con errores para probar ESLint
function suma(a,b){
var resultado=a+b
  if(resultado>10)
console.log("El resultado es mayor que 10")
  return resultado
}

Al ejecutar npx eslint test.js, deberías ver varios errores reportados, como espaciado incorrecto, uso de var, falta de punto y coma, etc.

Personalización progresiva

A medida que te familiarices con ESLint, puedes ir ajustando la configuración según las necesidades específicas de tu proyecto. Comienza con reglas básicas y ve añadiendo más a medida que el equipo se adapte a ellas.

La configuración de ESLint es un proceso iterativo que evoluciona con tu proyecto, permitiéndote mantener un equilibrio entre la rigurosidad de las reglas y la productividad del equipo de desarrollo.

Reglas fundamentales: Configuración recomendada para principiantes

Cuando empiezas a utilizar ESLint, la cantidad de reglas disponibles puede resultar abrumadora. Para desarrolladores que se inician en el mundo del linting, es recomendable comenzar con un conjunto básico pero efectivo de reglas que mejoren la calidad del código sin generar demasiada fricción en el proceso de desarrollo.

Conjuntos de reglas preconfigurados

ESLint ofrece varios conjuntos de reglas predefinidos que puedes utilizar como punto de partida:

{
  "extends": [
    "eslint:recommended"
  ]
}

El conjunto eslint:recommended activa automáticamente un grupo de reglas que detectan errores comunes y patrones problemáticos. Es un excelente punto de partida que no resulta demasiado estricto.

Reglas esenciales para principiantes

A continuación, veremos las reglas más importantes que todo desarrollador JavaScript debería considerar:

  • 1. Errores de sintaxis y problemas potenciales:
{
  "rules": {
    "no-unused-vars": "warn",
    "no-undef": "error",
    "no-unreachable": "error",
    "no-constant-condition": "warn"
  }
}

Estas reglas detectan problemas fundamentales como variables no utilizadas, variables no definidas, código inalcanzable y condiciones que siempre evalúan al mismo valor.

  • 2. Consistencia en el estilo de código:
{
  "rules": {
    "indent": ["error", 2],
    "quotes": ["warn", "single"],
    "semi": ["error", "always"],
    "comma-dangle": ["warn", "never"]
  }
}

Estas reglas garantizan que todo el código mantenga un estilo uniforme, lo que facilita enormemente la lectura y mantenimiento.

  • 3. Mejores prácticas básicas:
{
  "rules": {
    "eqeqeq": ["warn", "always"],
    "no-eval": "error",
    "curly": ["error", "all"],
    "no-multi-spaces": "warn"
  }
}

Estas reglas fomentan prácticas como usar === en lugar de ==, evitar el uso de eval(), utilizar llaves en todas las estructuras de control y mantener un espaciado consistente.

Ejemplo de archivo de configuración completo

Combinando estas reglas, un archivo .eslintrc.json recomendado para principiantes podría verse así:

{
  "env": {
    "browser": true,
    "es2021": true,
    "node": true
  },
  "extends": "eslint:recommended",
  "parserOptions": {
    "ecmaVersion": "latest",
    "sourceType": "module"
  },
  "rules": {
    // Errores y problemas potenciales
    "no-unused-vars": "warn",
    "no-undef": "error",
    "no-unreachable": "error",
    
    // Estilo de código
    "indent": ["error", 2],
    "quotes": ["warn", "single"],
    "semi": ["error", "always"],
    "comma-spacing": ["warn", { "before": false, "after": true }],
    
    // Mejores prácticas
    "eqeqeq": ["warn", "always"],
    "no-eval": "error",
    "curly": ["error", "all"],
    "no-console": ["warn", { "allow": ["warn", "error"] }]
  }
}

Explicación de reglas clave

  • no-unused-vars: Detecta variables declaradas pero nunca utilizadas, lo que puede indicar código olvidado o errores lógicos.
// ESLint advertirá sobre 'data' ya que nunca se usa
function processUser(user) {
  const data = fetchUserData(user.id);
  return user.name;
}
  • eqeqeq: Requiere el uso de operadores de igualdad estricta (=== y !==) en lugar de los operadores de igualdad abstracta (== y !=).
// Incorrecto - puede causar comportamientos inesperados
if (userId == 123) { /* ... */ }

// Correcto - comparación de tipo y valor
if (userId === 123) { /* ... */ }
  • curly: Exige el uso de llaves en bloques de control, incluso para declaraciones de una sola línea, evitando errores comunes.
// Incorrecto - propenso a errores cuando se añaden más líneas
if (isAdmin)
  deleteRecord();

// Correcto - explícito y menos propenso a errores
if (isAdmin) {
  deleteRecord();
}
  • no-console: Advierte sobre el uso de console.log() en el código, que a menudo se deja accidentalmente después de la depuración.
// ESLint advertirá sobre esto
console.log('Datos del usuario:', userData);

// Pero permitirá estos si se configura con { "allow": ["warn", "error"] }
console.warn('Advertencia: datos incompletos');
console.error('Error al procesar la solicitud');

Ajustando la severidad de las reglas

ESLint permite tres niveles de severidad para cada regla:

  • "off" o 0: Desactiva la regla
  • "warn" o 1: Activa la regla como advertencia (no afecta al código de salida)
  • "error" o 2: Activa la regla como error (el código de salida será 1)

Para principiantes, es recomendable configurar como "warn" las reglas de estilo y como "error" las que pueden causar problemas funcionales:

{
  "rules": {
    "no-undef": "error",      // Error crítico - variable no definida
    "quotes": "warn"          // Preferencia de estilo - menos crítica
  }
}

Reglas específicas para ECMAScript moderno

Si estás trabajando con JavaScript moderno, estas reglas adicionales pueden ser útiles:

{
  "rules": {
    "prefer-const": "warn",
    "arrow-body-style": ["warn", "as-needed"],
    "no-var": "warn"
  }
}

Estas reglas fomentan el uso de características modernas como const en lugar de let cuando una variable no se reasigna, funciones flecha simplificadas y evitar el uso de var.

Configuración para proyectos en crecimiento

A medida que tu proyecto crece, puedes considerar extender tu configuración con conjuntos de reglas más completos:

{
  "extends": [
    "eslint:recommended",
    "plugin:import/errors",
    "plugin:import/warnings"
  ],
  "plugins": [
    "import"
  ]
}

El plugin eslint-plugin-import añade reglas para verificar la correcta importación y exportación de módulos, algo especialmente útil en proyectos que crecen en complejidad.

Adaptación gradual

La clave para una adopción exitosa de ESLint es la gradualidad. Comienza con pocas reglas esenciales y ve añadiendo más a medida que el equipo se familiariza con ellas:

# Ejecuta ESLint solo con las reglas más críticas al principio
npx eslint src/ --quiet --rule 'no-undef: error' --rule 'eqeqeq: warn'

Con el tiempo, puedes ir incorporando más reglas a tu configuración permanente en .eslintrc.json.

La configuración de ESLint debe evolucionar con tu proyecto y equipo, encontrando el equilibrio entre mantener un código de alta calidad y no obstaculizar el proceso de desarrollo con reglas excesivamente estrictas.

CONSTRUYE TU CARRERA EN IA Y PROGRAMACIÓN SOFTWARE

Accede a +1000 lecciones y cursos con certificado. Mejora tu portfolio con certificados de superación para tu CV.

30 % DE DESCUENTO

Plan mensual

19.00 /mes

13.30 € /mes

Precio normal mensual: 19 €
63 % DE DESCUENTO

Plan anual

10.00 /mes

7.00 € /mes

Ahorras 144 € al año
Precio normal anual: 120 €
Aprende JavaScript online

Ejercicios de esta lección ESLint y calidad de código

Evalúa tus conocimientos de esta lección ESLint y calidad de código con nuestros retos de programación de tipo Test, Puzzle, Código y Proyecto con VSCode, guiados por IA.

Funciones flecha

JavaScript
Puzzle

Polimorfismo

JavaScript
Test

Array

JavaScript
Código

Transformación con map()

JavaScript
Test

Gestor de tareas con JavaScript

JavaScript
Proyecto

Manipulación DOM

JavaScript
Test

Funciones

JavaScript
Test

Funciones flecha

JavaScript
Código

Async / Await

JavaScript
Código

Creación y uso de variables

JavaScript
Test

Excepciones

JavaScript
Puzzle

Promises

JavaScript
Código

Funciones cierre (closure)

JavaScript
Test

Herencia

JavaScript
Puzzle

Herencia

JavaScript
Test

Estructuras de control

JavaScript
Código

Selección de elementos DOM

JavaScript
Test

Modificación de elementos DOM

JavaScript
Test

Filtrado con filter() y find()

JavaScript
Test

Funciones cierre (closure)

JavaScript
Puzzle

Funciones

JavaScript
Puzzle

Mapas con Map

JavaScript
Test

Reducción con reduce()

JavaScript
Test

Callbacks

JavaScript
Puzzle

Manipulación DOM

JavaScript
Puzzle

Promises

JavaScript
Test

Async / Await

JavaScript
Test

Eventos del DOM

JavaScript
Puzzle

Async / Await

JavaScript
Puzzle

Promises

JavaScript
Puzzle

Filtrado con filter() y find()

JavaScript
Código

Callbacks

JavaScript
Test

Creación de clases y objetos Restaurante

JavaScript
Código

Reducción con reduce()

JavaScript
Código

Filtrado con filter() y find()

JavaScript
Puzzle

Reducción con reduce()

JavaScript
Puzzle

Conjuntos con Set

JavaScript
Puzzle

Herencia de clases

JavaScript
Código

Eventos del DOM

JavaScript
Test

Clases y objetos

JavaScript
Puzzle

Modificación de elementos DOM

JavaScript
Puzzle

Mapas con Map

JavaScript
Puzzle

Introducción a JavaScript

JavaScript
Test

Funciones

JavaScript
Código

Tipos de datos

JavaScript
Test

Clases y objetos

JavaScript
Test

Array

JavaScript
Test

Conjuntos con Set

JavaScript
Test

Array

JavaScript
Puzzle

Encapsulación

JavaScript
Puzzle

Clases y objetos

JavaScript
Código

Uso de operadores

JavaScript
Puzzle

Uso de operadores

JavaScript
Test

Estructuras de control

JavaScript
Test

Excepciones

JavaScript
Test

Transformación con map()

JavaScript
Puzzle

Funciones flecha

JavaScript
Test

Selección de elementos DOM

JavaScript
Puzzle

Encapsulación

JavaScript
Test

Mapas con Map

JavaScript
Código

Creación y uso de variables

JavaScript
Puzzle

Polimorfismo

JavaScript
Puzzle

Tipos de datos

JavaScript
Puzzle

Estructuras de control

JavaScript
Puzzle

Todas las lecciones de JavaScript

Accede a todas las lecciones de JavaScript y aprende con ejemplos prácticos de código y ejercicios de programación con IDE web sin instalar nada.

Accede GRATIS a JavaScript y certifícate

Certificados de superación de JavaScript

Supera todos los ejercicios de programación del curso de JavaScript y obtén certificados de superación para mejorar tu currículum y tu empleabilidad.

En esta lección

Objetivos de aprendizaje de esta lección

  • Comprender qué es el linting y su importancia en JavaScript.
  • Aprender a detectar y corregir errores típicos de JavaScript con ESLint.
  • Mejorar la consistencia y legibilidad del código en proyectos colaborativos.
  • Configurar reglas de ESLint para mantener buenas prácticas de programación.
  • Aplicar el linting para prevenir vulnerabilidades de seguridad.
  • Optimizar el rendimiento del código mediante el uso eficiente de ESLint.