ESLint претерпел серьёзные изменения за последние два года. В 2026-м flat config — уже стандарт, а старый .eslintrc официально устарел. Разберём, как правильно настроить линтер в Next.js проекте с нуля.
Что изменилось
С ESLint 9 единственным поддерживаемым форматом конфига стал flat config — файл eslint.config.mjs в корне проекта. Вместо массива extends теперь массив объектов-конфигураций.
npm install -D eslint @eslint/js typescript-eslint eslint-config-next
Базовая настройка
// eslint.config.mjs
import { dirname } from "path";
import { fileURLToPath } from "url";
import { FlatCompat } from "@eslint/eslintrc";
import tseslint from "typescript-eslint";
const __filename = fileURLToPath(import.meta.url);
const __dirname = dirname(__filename);
const compat = new FlatCompat({ baseDirectory: __dirname });
export default tseslint.config(
...compat.extends("next/core-web-vitals", "next/typescript"),
{
rules: {
"@typescript-eslint/no-unused-vars": ["error", { argsIgnorePattern: "^_" }],
"@typescript-eslint/no-explicit-any": "warn",
"prefer-const": "error",
},
}
);
Правила специфичные для App Router
В App Router есть паттерны, которые стандартные правила не понимают. Добавьте:
{
rules: {
// Server Actions — async функции в "use server" файлах
"@typescript-eslint/require-await": "off",
}
}
Интеграция с Prettier
Prettier и ESLint не конфликтуют, если использовать eslint-config-prettier:
npm install -D prettier eslint-config-prettier
import prettierConfig from "eslint-config-prettier";
export default tseslint.config(
...compat.extends("next/core-web-vitals", "next/typescript"),
prettierConfig, // всегда последним
);
Скрипты в package.json
{
"scripts": {
"lint": "next lint",
"lint:fix": "next lint --fix",
"format": "prettier --write ."
}
}
VS Code интеграция
Добавьте в .vscode/settings.json:
{
"editor.codeActionsOnSave": {
"source.fixAll.eslint": "explicit"
},
"eslint.useFlatConfig": true
}
Итог
Flat config поначалу непривычен, но он гибче и быстрее — ESLint больше не загружает конфиги из node_modules по цепочке extends. Для нового проекта на Next.js 16+ именно этот подход является правильным стартом.