Configuración de ESLint para Next.js
Configura ESLint con el formato de configuración plana para un proyecto Next.js utilizando presets integrados.
Busca en todas las páginas de la documentación
Configura ESLint con el formato de configuración plana para un proyecto Next.js utilizando presets integrados.
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥
Tarjeta de referencia rápida - lista para copiar y pegar.
# Instala ESLint (incluido con create-next-app)
npm install --save-dev eslint eslint-config-next
# Ejecuta linting a través de la CLI de Next.js
npx next lint
# Lint y auto-fix
npx next lint --fix
# Lint de directorios específicos
npx next lint --dir src --dir appCuándo usarlo: Cada proyecto de Next.js debe tener ESLint configurado desde el primer día.
// eslint.config.mjs
import { FlatCompat } from "@eslint/eslintrc";
import { dirname } from "path";
import { fileURLToPath } from "url";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({
baseDirectory: __dirname,
});
const eslintConfig = [
...compat.extends("next/core-web-vitals", "next/typescript"),
{
rules: {
// Personaliza las reglas aquí
"@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
],
"react/no-unescaped-entities": "off",
},
},
{
ignores: [
"node_modules/",
".next/",
"out/",
"public/",
"coverage/",
],
},
];
export default eslintConfig;Lo que esto demuestra:
eslint.config.mjsFlatCompat para vincular configuraciones de Next.js (que aún usan el formato heredado) en configuración plananext/core-web-vitals (incluye reglas de React, hooks e import) y next/typescriptnpx next lintnext/core-web-vitals agrupa eslint-plugin-react, eslint-plugin-react-hooks, eslint-plugin-next y eslint-plugin-import con defaults estrictosnext/typescript agrega reglas de @typescript-eslint/eslint-plugin ajustadas para Next.jseslint.config.mjs) en lugar del formato .eslintrc heredadoFlatCompat es un puente que te permite usar configuraciones de estilo extends heredado dentro de la configuración plana - necesario porque los presets de Next.js aún no han migrado completamenteESLint Independiente (sin next lint):
# Ejecuta ESLint directamente
npx eslint . --fix
# O a través de script en package.json{
"scripts": {
"lint": "next lint",
"lint:fix": "next lint --fix",
"lint:strict": "next lint --strict"
}
}Modo estricto (trata advertencias como errores):
npx next lint --strictIgnorar archivos:
// En eslint.config.mjs - bloque ignores
{
ignores: [
"**/*.config.js",
"**/*.config.mjs",
"migrations/",
"generated/",
],
}# El preset next/typescript maneja estos automáticamente:
# - @typescript-eslint/parser está configurado
# - Las reglas conscientes de TypeScript están habilitadas
# - Los archivos .ts y .tsx se incluyen por defectoCosas que te harán tropezar. Cada problema incluye qué sale mal, por qué sucede y la solución.
Configuración plana no detectada - Si ESLint ignora tu eslint.config.mjs, es posible que tengas un archivo .eslintrc.* antiguo. ESLint 9 prefiere la configuración plana pero vuelve a la heredada si ambas existen. Solución: Elimina todos los archivos .eslintrc.* cuando uses configuración plana.
La primera ejecución solicita configuración - Ejecutar npx next lint por primera vez muestra un asistente de configuración. Solución: Elige "Strict" para next/core-web-vitals o crea el archivo de configuración manualmente de antemano.
Los ignores deben ser un objeto separado - En la configuración plana, el array ignores solo funciona como un ignore global cuando es la única clave en su objeto de configuración. Mezclar ignores con rules en el mismo objeto lo convierte en un filtro, no en un ignore global. Solución: Siempre pon los ignores globales en su propio objeto { ignores: [...] }.
Rendimiento en proyectos grandes - npx next lint solo realiza linting en app/, pages/, components/, lib/ y src/ por defecto. Los directorios personalizados necesitan --dir. Solución: Agrega flags --dir o configura eslint.dirs en next.config.js.
Otras formas de resolver el mismo problema - y cuándo cada una es la mejor opción.
| Alternativa | Úsalo Cuando | No lo Uses Cuando |
|---|---|---|
| Biome | Quieres una única herramienta rápida para linting y formateo | Necesitas el ecosistema completo de plugins de ESLint |
oxlint | Quieres linting extremadamente rápido escrito en Rust | Necesitas reglas personalizadas o específicas de Next.js |
CLI eslint directamente | Necesitas control total sobre qué archivos se someten a linting | Quieres defaults conscientes de Next.js fuera de la caja |
next/core-web-vitals, next/typescript) aún usan el formato heredado extends internamente.FlatCompat vincula estas configuraciones heredadas en la configuración plana de ESLint 9.FlatCompat ya no será necesario.next/core-web-vitals agrupa reglas de React, hooks, import y Next.js-specific con defaults estrictos.next/typescript agrega reglas de @typescript-eslint/eslint-plugin ajustadas para Next.js.eslint.config.mjs)..eslintrc.* como eslint.config.mjs, ESLint vuelve al archivo heredado..eslintrc.* al migrar a configuración plana para evitar confusión.# Next.js solo realiza linting en app/, pages/, components/, lib/, src/ por defecto
npx next lint --dir src --dir utils --dir services"warn" ahora fallará la ejecución de lint.ignores solo funciona como un ignore global cuando es la única clave en su objeto de configuración.ignores con rules en el mismo objeto, actúa como un filtro de archivo, no como un ignore global.{ ignores: [...] }."@typescript-eslint/no-unused-vars": [
"error",
{ argsIgnorePattern: "^_", varsIgnorePattern: "^_" },
]Prefija parámetros no utilizados con _ y serán ignorados.
__filename o __dirname.fileURLToPath(import.meta.url) y dirname() los recrean.FlatCompat requiere baseDirectory para resolver rutas de configuración relativas.eslint.config.mjs es JavaScript plano, no TypeScript.// @ts-check al principio y usar anotaciones JSDoc para type checking básico.eslint.config.ts con soporte experimental de configuración TypeScript en ESLint 9.eslint.config.mjs antes de ejecutar npx next lint.next/core-web-vitals.# ESLint directo (omite los defaults de directorio de Next.js)
npx eslint . --fix
# next lint (respeta los defaults de directorio de Next.js)
npx next lint --fixUsa npx eslint . cuando necesites control total sobre qué archivos se someten a linting.
next/typescript configura el parser de TypeScript automáticamente.@/* definidos en tsconfig.json se resuelven mediante el parser.Revisado por Chris St. John·Última actualización: 16 jul 2026
🤖 Read the SystemsArchitect.io Blog for over 100+ cloud architecture articles 🔥