Переход на ESLint 8 сопровождается ужесточением требований к среде выполнения. Основное изменение связано с поддержкой Node.js: минимальная версия среды повышена, и использование устаревших релизов приводит к невозможности установки или запуска линтера.
Ключевые изменения:
В проектах с CI/CD необходимо синхронизировать версии Node.js во всех окружениях: локальная разработка, сборка, тестирование, деплой.
Обновление ESLint до восьмой версии выполняется через замену пакета:
npm install eslint@8 --save-dev
или
yarn add eslint@8 -D
После обновления требуется проверить все связанные пакеты:
Многие плагины ESLint 7 продолжают работать, однако часть из них требует обновления из-за изменений peerDependencies.
Одним из ключевых архитектурных изменений становится окончательное
удаление CLIEngine.
CLIEngine полностью удалён из APIESLintconst { CLIEngine } = require("eslint");
const cli = new CLIEngine({
fix: true
});
const report = cli.executeOnFiles(["src"]);
const { ESLint } = require("eslint");
const eslint = new ESLint({ fix: true });
const results = await eslint.lintFiles(["src"]);
await ESLint.outputFixes(results);
async/await или
промисовESLint 8 продолжает использовать eslintrc как
стандартную модель конфигурации, однако усиливается консистентность
поведения.
extendsПример структуры:
{
"env": {
"browser": true,
"node": true
},
"extends": ["eslint:recommended"],
"rules": {
"no-unused-vars": "warn"
}
}
Изменена приоритетность применения правил в сложных конфигурациях:
{
"overrides": [
{
"files": ["*.test.js"],
"rules": {
"no-unused-expressions": "off"
}
}
]
}
Теперь порядок применения overrides становится более детерминированным, особенно при глубокой вложенности конфигов.
Одной из частых проблем миграции является несовместимость экосистемы плагинов.
eslint-plugin-*@typescript-eslint старых версий@typescript-eslint/parser версии 5+@typescript-eslint/eslint-plugin версии 5+npm install @typescript-eslint/parser@latest @typescript-eslint/eslint-plugin@latest -D
В ESLint 8 часть правил получила корректировки поведения, направленные на уменьшение ложных срабатываний и улучшение согласованности.
no-constant-conditionno-loss-of-precision при работе с
большими числамиno-unused-vars в сложных
деструктуризацияхconst { a, b } = obj;
// ранее могли возникать ложные предупреждения
// теперь анализ учитывает контекст использования
CLI-интерфейс ESLint 8 подвергся оптимизации и частичной переработке.
--fixnpx eslint "src/**/*.{js,ts}" --fix
Переход от синхронного CLIEngine к асинхронному API ESLint приводит к необходимости пересмотра архитектуры инструментов.
async function runLint() {
const eslint = new ESLint({ fix: true });
const results = await eslint.lintFiles(["src"]);
await ESLint.outputFixes(results);
}
Ситуации, при которых ESLint 8 установлен, но плагины остаются на ESLint 7 API, приводят к ошибкам загрузки:
ESLint version mismatchCannot read property 'defineRule'context.parserServices undefinedПри неправильной настройке extends или
overrides возможны:
Наиболее частые ошибки:
typescript-estreeproject в parserOptionsПроцесс миграции обычно разбивается на несколько этапов.
ESLint 8 демонстрирует улучшения производительности на крупных кодовых базах.
Основные факторы:
Особенно заметен прирост при работе с монорепозиториями и TypeScript-проектами.
Кэширование стало более стабильным и предсказуемым.
npx eslint src --cache
Переход на ESLint 8 приводит к структурным изменениям в архитектуре линтинга: