Механизм extends в ESLint определяет порядок
наследования и объединения конфигураций из нескольких источников,
позволяя строить многоуровневую систему правил на основе базовых
пресетов, плагинов и локальных настроек проекта. Он является ключевым
инструментом масштабирования линтинга в проектах среднего и крупного
размера, где единый набор правил формируется из нескольких слоёв:
стандартов языка, командных соглашений, доменных требований и частных
исключений.
Конфигурация ESLint в формате .eslintrc может
наследовать другие конфигурации через поле:
{
"extends": ["eslint:recommended"]
}
или в упрощённой форме:
{
"extends": "eslint:recommended"
}
Каждый элемент в extends представляет собой ссылку на
внешний конфигурационный пакет или встроенный пресет. ESLint
последовательно загружает указанные конфигурации и объединяет их с
локальной конфигурацией.
ESLint предоставляет несколько встроенных конфигураций:
{
"extends": [
"eslint:recommended",
"eslint:all"
]
}
eslint:recommended — набор базовых правил, считающихся
безопасными для большинства проектовeslint:all — включает все доступные правила ESLint в
строгом режимеЭти конфигурации не требуют установки дополнительных пакетов.
Наиболее распространённый вариант наследования — использование
пакетов вида eslint-config-*.
{
"extends": [
"airbnb",
"standard",
"prettier"
]
}
Фактическое разрешение имён происходит по правилам:
airbnb → eslint-config-airbnb@company/eslint-config → scoped пакет@company/eslint-config-base →
@company/eslint-config-baseЕсли пакет установлен в node_modules, ESLint
автоматически подхватывает его конфигурацию.
Плагины ESLint могут экспортировать готовые наборы правил:
{
"extends": [
"plugin:react/recommended",
"plugin:@typescript-eslint/recommended"
]
}
Формат:
plugin:<plugin-name>/<config-name>
Такие конфигурации позволяют подключать стандартизированные правила для конкретных технологий без ручной настройки.
Можно наследовать конфигурации из локальных файлов:
{
"extends": "./configs/base-eslint.json"
}
или через директории:
{
"extends": "./eslint/shared.js"
}
Это позволяет разделять конфигурацию проекта на логические уровни.
ESLint обрабатывает массив extends слева
направо, что критически важно для понимания приоритетов.
{
"extends": [
"eslint:recommended",
"airbnb",
"prettier"
]
}
Порядок означает:
eslint:recommendedairbnbprettierИтоговое правило: последний источник имеет наивысший приоритет.
ESLint не просто заменяет конфигурации, а выполняет частичное слияние (merge).
Поле rules объединяется по принципу:
{
"extends": ["eslint:recommended"],
"rules": {
"eqeqeq": "off"
}
}
Если в eslint:recommended правило eqeqeq
включено, локальная конфигурация его отключит.
Поле env объединяется логически:
{
"env": {
"browser": true
},
"extends": ["some-config"]
}
Если в some-config указано:
{
"env": {
"node": true
}
}
итог:
{
"env": {
"browser": true,
"node": true
}
}
Значения не перезаписываются, а дополняются.
parserOptions работает по принципу поверхностного
переопределения:
{
"parserOptions": {
"ecmaVersion": 2022
}
}
Если базовая конфигурация содержит:
{
"parserOptions": {
"sourceType": "module"
}
}
итог будет:
{
"parserOptions": {
"ecmaVersion": 2022
}
}
Поле не сливается глубоко, а заменяется целиком.
Массив плагинов объединяется:
{
"plugins": ["react"]
}
и
{
"plugins": ["import"]
}
результат:
{
"plugins": ["react", "import"]
}
При наследовании часто возникают конфликты между наборами правил.
{
"extends": ["airbnb", "prettier"],
"rules": {
"semi": "error"
}
}
airbnb может требовать обязательные точки с
запятойprettier может отключать контроль форматированияИтог зависит от порядка:
prettier последним — он переопределяет
форматирующие правилаairbnb последним — форматирование может
конфликтовать с PrettierНекоторые пакеты сами используют extends внутри
себя.
Пример цепочки:
project config
→ airbnb
→ eslint:recommended
→ базовые правила ESLint
Каждый уровень может:
Плагины могут предоставлять несколько уровней конфигураций:
{
"extends": [
"plugin:vue/base",
"plugin:vue/vue3-recommended",
"plugin:vue/strongly-recommended"
]
}
Каждый последующий уровень усиливает набор правил:
base — минимальный наборrecommended — стандарт индустрииstrongly-recommended — строгий режимПри указании:
{
"extends": "airbnb"
}
ESLint выполняет:
eslint-config-airbnbnode_modulespackage.json пакетаeslintConfig или экспортируемого
объектаДля scoped-пакетов:
{
"extends": "@company"
}
ESLint ищет:
@company/eslint-config
Локальная конфигурация всегда имеет приоритет:
{
"extends": ["eslint:recommended"],
"rules": {
"no-console": "off"
}
}
Даже если базовая конфигурация включает строгие ограничения, локальные настройки могут их отключить или изменить.
В монорепозиториях часто используется единая базовая конфигурация:
/config/eslint/base.json
/packages/app/.eslintrc
/packages/ui/.eslintrc
Каждый пакет:
{
"extends": "../. ./config/eslint/base.json"
}
или:
{
"extends": ["@company/eslint-config-base"]
}
Это обеспечивает единый стандарт качества кода.
В реальных проектах часто комбинируются разные источники:
{
"extends": [
"eslint:recommended",
"plugin:react/recommended",
"airbnb",
"prettier"
],
"rules": {
"react/react-in-jsx-scope": "off",
"no-unused-vars": "warn"
}
}
Такой подход формирует многоуровневую модель:
Механизм extends имеет ряд технических ограничений:
Если конфигурации наследуют друг друга циклически:
A → B → C → A
ESLint обнаруживает цикл и прекращает загрузку, предотвращая бесконечную рекурсию. Такие конфигурации считаются некорректными и требуют ручного исправления структуры наследования.
Механизм можно представить как последовательное наложение слоёв:
базовая конфигурация
+ встроенные пресеты
+ shareable configs
+ plugin configs
+ локальная конфигурация
= итоговые правила ESLint
Каждый слой способен:
Именно эта модель делает extends центральным
инструментом организации сложных конфигураций ESLint в масштабируемых
JavaScript-проектах.