ESLint предоставляет наборы предустановленных правил, позволяющих
быстро подключить готовую конфигурацию без необходимости вручную
перечислять десятки или сотни правил. Наиболее известными встроенными
конфигурациями являются eslint:recommended и
eslint:all.
Обе конфигурации решают разные задачи и предназначены для различных сценариев использования. Понимание различий между ними позволяет правильно организовать процесс статического анализа кода и избежать излишнего количества предупреждений или, наоборот, недостаточного контроля качества.
По умолчанию ESLint не включает никакие правила автоматически. После установки линтер требует явного указания правил или подключения готовых конфигураций.
Встроенные конфигурации позволяют:
Подключение встроенной конфигурации выглядит значительно проще, чем ручное описание большого количества правил.
Пример для классической конфигурации:
module.exports = {
extends: ["eslint:recommended"]
};
Для Flat Config:
import js from "@eslint/js";
export default [
js.configs.recommended
];
eslint:recommendedeslint:recommended представляет собой набор правил,
рекомендуемых командой ESLint для большинства проектов.
В данную конфигурацию включены правила, которые:
Основная цель конфигурации — выявление дефектов, способных привести к некорректной работе программы.
eslint:recommendedКонкретный список правил может изменяться между версиями ESLint, однако обычно в него входят проверки следующих категорий:
function calculate() {
return total;
}
Ошибка:
'total' is not defined
Правило:
no-undef
function test() {
return true;
console.log("never executed");
}
Правило:
no-unreachable
Такой код никогда не будет выполнен.
if (value === 1) {
console.log("one");
} else if (value === 1) {
console.log("again");
}
Правило:
no-dupe-else-if
Условие никогда не достигнет второй ветки.
let count = 1;
let count = 2;
Правило:
no-redeclare
for (
let i = 0;
i < 10;
) {
console.log(i);
}
Некорректная структура цикла будет обнаружена соответствующими правилами синтаксической проверки.
new Symbol("id");
Правило:
no-new-native-nonconstructor
Некоторые встроенные объекты не предназначены для вызова через
new.
if (value = 10) {
console.log("test");
}
Здесь используется присваивание вместо сравнения.
Правило:
no-cond-assign
eslint:recommendedПравила включаются только после длительного обсуждения и анализа практического опыта использования ESLint.
Поэтому большинство предупреждений действительно указывают на ошибки.
Достаточно подключить одну строку:
extends: ["eslint:recommended"]
После этого проект получает десятки полезных проверок.
Команда ESLint старается включать в рекомендуемую конфигурацию только те правила, которые считаются стабильными и полезными для большинства проектов.
Конфигурация почти не затрагивает вопросы оформления кода:
Благодаря этому её можно использовать вместе с любым кодстайлом.
eslint:recommendedКонфигурация подходит практически для всех проектов:
Очень часто она становится основой всей конфигурации ESLint.
Пример:
module.exports = {
extends: ["eslint:recommended"],
rules: {
"no-console": "warn",
"eqeqeq": "error"
}
};
Здесь используются рекомендации ESLint и дополнительно подключаются собственные требования проекта.
eslint:alleslint:all включает абсолютно все правила, доступные в
текущей версии ESLint.
Подключение:
module.exports = {
extends: ["eslint:all"]
};
Для Flat Config:
import js from "@eslint/js";
export default [
js.configs.all
];
В отличие от eslint:recommended, данная конфигурация
активирует не только правила поиска ошибок, но и:
eslint:allПосле подключения будут активированы все встроенные правила ESLint.
Например:
const name = "John";
Могут появиться предупреждения, связанные с:
Количество предупреждений способно достигать сотен или даже тысяч в существующем проекте.
eslint:allНапример:
if (isReady)
start();
Некоторые правила могут требовать обязательных фигурных скобок:
if (isReady) {
start();
}
Некоторые команды предпочитают один стиль программирования, другие — противоположный.
Например:
const fn = () => {};
или
function fn() {}
Обе записи корректны, однако часть правил может навязывать определённый вариант.
Это одна из самых важных особенностей.
После обновления ESLint:
npm update eslint
в конфигурацию автоматически попадут новые правила.
В результате проект может неожиданно получить большое количество новых предупреждений.
eslint:allПредположим, в версии ESLint добавлено новое правило:
new-rule
После обновления оно автоматически включится в проект.
Поведение линтера изменится даже без редактирования конфигурации.
Даже небольшой проект может получить десятки или сотни сообщений:
120 warnings
34 errors
Часть из них будет связана исключительно со стилем оформления.
Для реального проекта часто приходится отключать большое количество правил:
module.exports = {
extends: ["eslint:all"],
rules: {
"rule-a": "off",
"rule-b": "off",
"rule-c": "off",
"rule-d": "off",
"rule-e": "off"
}
};
Со временем такой файл становится трудным для сопровождения.
eslint:allНа практике конфигурация применяется значительно реже.
Типичные сценарии:
Конфигурация позволяет увидеть полный набор доступных правил:
extends: ["eslint:all"]
После запуска линтера становится понятно, какие проверки существуют.
Иногда проект начинает работу с eslint:all, после чего
постепенно отключаются ненужные правила.
В результате формируется собственный набор требований.
Полная проверка позволяет выявить:
eslint:recommended и eslint:all| Характеристика | eslint:recommended | eslint:all |
|---|---|---|
| Поиск ошибок | Да | Да |
| Проверка стиля | Частично | Полностью |
| Подходит для большинства проектов | Да | Нет |
| Стабильность между версиями | Высокая | Низкая |
| Количество предупреждений | Умеренное | Очень большое |
| Простота внедрения | Высокая | Низкая |
| Требует дополнительной настройки | Минимально | Значительно |
| Использование в production | Рекомендуется | Обычно не рекомендуется |
Для большинства проектов предпочтительным вариантом считается следующая схема:
module.exports = {
extends: ["eslint:recommended"],
rules: {
"eqeqeq": "error",
"no-console": "warn",
"curly": "error"
}
};
Такой подход обеспечивает:
Использование eslint:all обычно оправдано лишь как
временный инструмент анализа или источник для построения собственной
конфигурации.
Часто eslint:recommended выступает базовым уровнем
проверки, поверх которого подключаются дополнительные конфигурации.
Пример:
module.exports = {
extends: [
"eslint:recommended",
"plugin:import/recommended",
"plugin:promise/recommended"
]
};
В этом случае:
Такой подход обеспечивает постепенное расширение набора правил без
необходимости использовать агрессивную конфигурацию
eslint:all.
Разница в скорости работы между двумя конфигурациями может быть заметна на крупных проектах.
eslint:recommended активирует ограниченный набор
наиболее важных правил, поэтому проверка выполняется быстрее.
eslint:all запускает каждое встроенное правило ESLint,
что увеличивает:
На небольших проектах различия могут быть незаметны, однако на кодовых базах из тысяч файлов использование полного набора правил способно существенно замедлить процесс линтинга.
Для подавляющего большинства производственных проектов оптимальным
выбором является eslint:recommended.
Конфигурация обеспечивает баланс между количеством проверок и удобством разработки, выявляет реальные ошибки и остаётся относительно стабильной при обновлениях ESLint.
eslint:all следует рассматривать как инструмент
исследования возможностей линтера, аудита кода или построения
собственной конфигурации. Использование её в качестве постоянной основы
проекта приводит к избыточному количеству предупреждений, усложняет
сопровождение конфигурации и делает поведение линтера зависимым от
изменений в новых версиях ESLint.