Расширение конфигураций в ESLint основано на композиционной модели, при которой одна конфигурация может наследовать правила, плагины и параметры из другой. Такой подход позволяет строить многоуровневые системы настроек, где базовые правила определяются централизованно, а специализированные — дополняют или переопределяют их.
Основные механизмы расширения включают:
extends в legacy-конфигурацииrules и
overridesВ классическом формате ESLint (eslintrc) ключевую роль играет
свойство extends. Оно позволяет подключать готовые наборы
правил.
Пример базового использования:
{
"extends": "eslint:recommended"
}
Подключение может происходить из нескольких источников:
eslint:recommended — набор рекомендованных правилeslint:all — полный набор доступных правил{
"extends": ["eslint:recommended", "eslint:all"]
}
При объединении нескольких конфигураций они применяются последовательно.
Часто используются сторонние или внутренние shareable-конфигурации. Они публикуются как npm-пакеты и подключаются без указания путей.
Примеры:
{
"extends": [
"airbnb",
"plugin:@typescript-eslint/recommended"
]
}
Механизм разрешения имени:
eslint-config-<name> →
extends: "<name>"@scope/eslint-config →
extends: "@scope"Также допускается указание конкретных файлов:
{
"extends": "./configs/base-eslint.json"
}
Конфигурации в extends обрабатываются слева направо.
Каждая последующая конфигурация может переопределять предыдущую.
Принцип приоритета:
rulesoverrides (самый высокий приоритет в своей
области)Пример:
{
"extends": ["eslint:recommended", "airbnb"],
"rules": {
"no-console": "off"
}
}
В данном случае правило no-console перекрывает настройки
всех подключённых конфигураций.
ESLint поддерживает массив конфигураций в extends, что
позволяет строить цепочки наследования:
{
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended",
"prettier"
]
}
Композиция используется для разделения ответственности:
Любая расширенная конфигурация может быть модифицирована через
локальный блок rules. Переопределение происходит по ключу
правила.
{
"extends": "eslint:recommended",
"rules": {
"eqeqeq": "error",
"curly": "warn",
"no-unused-vars": "off"
}
}
Типы значений:
"off" — отключение"warn" — предупреждение"error" — ошибкаТакже допускается объектная конфигурация:
{
"rules": {
"quotes": ["error", "single"],
"semi": ["error", "always"]
}
}
Механизм overrides позволяет применять расширение и
переопределение правил для отдельных наборов файлов.
{
"extends": "eslint:recommended",
"overrides": [
{
"files": ["*.test.js"],
"rules": {
"no-unused-expressions": "off"
}
},
{
"files": ["src/**/*.ts"],
"extends": "plugin:@typescript-eslint/recommended"
}
]
}
Особенности:
extendsShareable configs представляют собой npm-пакеты, экспортирующие объект ESLint-конфигурации.
Типовая структура пакета:
eslint-config-company/
index.js
package.json
Пример index.js:
module.exports = {
rules: {
"no-console": "warn",
"prefer-const": "error"
}
};
Использование:
{
"extends": "company"
}
Для scoped-пакетов:
{
"extends": "@company/eslint-config"
}
В новых версиях ESLint (flat config) механизм наследования
изменяется. Вместо extends используется явное объединение
конфигурационных объектов.
Пример:
export default [
baseConfig,
reactConfig,
{
rules: {
"no-console": "error"
}
}
];
Особенности flat config:
При миграции часто встречается параллельное использование:
extendsОднако модели не смешиваются напрямую: каждая работает в своей системе обработки.
Итоговая конфигурация формируется по следующим уровням:
extendsrulesoverrides для конкретных файловПри конфликте значений выигрывает более поздний и более специфичный источник.
Часто встречающиеся проблемы связаны с неправильной интерпретацией наследования:
extendsoffОсобенно критичным является порядок подключения конфигов форматирования и линтинга, поскольку они могут взаимно переопределять правила стиля кода.
Расширение конфигураций используется для построения иерархических систем:
Такая структура позволяет централизовать правила и снижать количество дублирования при сопровождении множества репозиториев.