ESLint
Flat config в ESLint представляет собой отказ от каскадной системы
.eslintrc в пользу явного, линейного массива
конфигурационных объектов. Основное изменение заключается в том, что
конфигурация перестаёт наследовать поведение через цепочку
extends, env, overrides в
привычном виде и становится полностью декларативной структурой, где
порядок элементов определяет итоговое состояние правил.
Ключевая идея flat config — устранение неявности. Каждое правило, плагин, парсер и область применения определяются напрямую в одном или нескольких объектах конфигурации.
Flat config реализуется через файл eslint.config.js,
который экспортирует массив:
export default [
configObject1,
configObject2,
];
Каждый объект представляет собой автономный блок конфигурации, содержащий:
files — область применения (glob-шаблоны)ignores — исключенияlanguageOptions — настройки языка (parser, ecmaVersion,
globals)plugins — подключение плагиновrules — набор правилsettings — общие настройки плагиновПример базовой структуры:
export default [
{
files: ["**/*.js"],
languageOptions: {
ecmaVersion: "latest",
sourceType: "module"
},
rules: {
"no-console": "warn"
}
}
];
В классической системе .eslintrc конфигурация строилась
на:
extendsenvoverridesFlat config заменяет это линейной моделью:
Это устраняет неоднозначности, возникавшие при сложных цепочках
extends из нескольких пакетов.
В legacy-конфигурации overrides использовался как
вложенная структура. В flat config он заменяется отдельными объектами с
files.
Было:
{
"overrides": [
{
"files": ["*.test.js"],
"rules": {
"no-unused-expressions": "off"
}
}
]
}
Стало:
export default [
{
files: ["**/*.test.js"],
rules: {
"no-unused-expressions": "off"
}
}
];
Каждый блок становится самостоятельным слоем конфигурации.
Flat config полностью зависит от порядка массива. Конфигурации применяются последовательно:
Поздние объекты перезаписывают ранние при совпадении ключей.
Пример приоритетов:
export default [
{
rules: {
semi: "error"
}
},
{
rules: {
semi: "off"
}
}
];
Итоговое значение semi будет off.
Одним из ключевых изменений становится отказ от env.
В flat config используется:
languageOptions.ecmaVersionlanguageOptions.sourceTypelanguageOptions.globalsПример:
export default [
{
languageOptions: {
ecmaVersion: 2022,
sourceType: "module",
globals: {
window: "readonly",
document: "readonly"
}
}
}
];
Это делает окружение более явным и независимым от внутренних preset-ов.
В legacy-модели плагины подключались строками в extends.
В flat config плагины импортируются как объекты:
import js from "@eslint/js";
export default [
js.configs.recommended,
{
rules: {
"no-unused-vars": "warn"
}
}
];
Плагины больше не “магически” резолвятся по имени — они становятся частью JavaScript-логики конфигурации.
extends теряет центральную роль. Вместо него
используются:
Пример:
import js from "@eslint/js";
export default [
js.configs.recommended
];
Конфигурации перестают быть строковыми ссылками и становятся объектами.
Flat config переносит игнорирование в сам конфиг:
export default [
{
ignores: ["dist/**", "node_modules/**"]
}
];
Файл .eslintignore становится необязательным и
постепенно вытесняется.
Для проектов, зависящих от старых конфигураций, используется compatibility слой:
@eslint/eslintrc как мостЭто позволяет постепенно мигрировать крупные кодовые базы без полной переписки конфигурации.
В flat config:
languageOptions.parsernode_modules через
строки конфигурацииПример:
import babelParser from "@babel/eslint-parser";
export default [
{
languageOptions: {
parser: babelParser
}
}
];
Ранее глобальные переменные определялись через env.
Теперь они задаются явно:
languageOptions: {
globals: {
React: "readonly",
process: "readonly"
}
}
Это исключает скрытые наборы глобальных переменных, зависящие от окружения.
Legacy .eslintrc:
Flat config:
При переходе на flat config в ESLint часто возникают следующие сложности:
envFlat config усиливает модульность:
Пример:
const isProd = process.env.NODE_ENV === "production";
export default [
{
rules: {
"no-console": isProd ? "error" : "warn"
}
}
];
Каждый конфиг блок теперь имеет:
Это устраняет необходимость в сложной диагностике, какой именно слой
.eslintrc применился к конкретному файлу.
Flat config в ESLint переводит систему из декларативно-иерархической модели в программируемую конфигурацию. Это сближает линтер с инструментами сборки, где конфигурация является кодом, а не набором JSON-правил.
Поведение становится предсказуемым: одинаковый массив конфигураций всегда даёт одинаковый результат без скрытых внешних факторов.