В процессе анализа файла ESLint формирует итоговую конфигурацию не из одного источника, а из нескольких слоёв, которые могут располагаться в разных местах файловой системы и иметь различный приоритет. Основная идея заключается в том, что конфигурации наследуются, уточняются и переопределяются по мере продвижения от общих правил к более специфичным.
В классическом (legacy) режиме используются следующие источники:
.eslintrc.* (JSON, YAML,
JS)eslintConfig в package.jsonextendsВ современном режиме Flat Config используется единый массив конфигураций, где порядок элементов сам по себе задаёт приоритет.
При анализе конкретного файла ESLint начинает поиск конфигурации, ориентируясь на его расположение. В legacy-режиме применяется восходящий обход директорий.
Алгоритм поиска выглядит следующим образом:
Определяется директория анализируемого файла.
В текущей директории проверяются конфигурационные сущности:
.eslintrc.js.eslintrc.cjs.eslintrc.json.eslintrc.yaml / .ymlpackage.json (поле eslintConfig)Если конфигурация не найдена, происходит переход на уровень выше.
Процесс повторяется до достижения корня файловой системы.
Результатом является цепочка конфигураций, каждая из которых потенциально вносит изменения в итоговый набор правил.
В Flat Config подходе поиск как таковой отсутствует: конфигурация
задаётся явно через массив, обычно в eslint.config.js, и
применяется целиком.
ESLint не заменяет конфигурации целиком при обнаружении новой, а выполняет глубокое слияние объектов. При этом учитываются разные типы полей:
Общий принцип:
более специфичная конфигурация переопределяет более общую
Правила являются ключевым элементом конфигурации. При слиянии действует строгая система приоритетов:
extends) —
порядок имеет значениеПример логики:
базовая конфигурация:
rules: {
semi: "error",
quotes: "warn"
}расширяющая конфигурация:
rules: {
quotes: "error"
}Итог:
rules: {
semi: "error",
quotes: "error"
}
extendsПоле extends формирует цепочку наследования
конфигураций. Каждая запись в extends может указывать:
eslint-config-airbnb)Разбор массива extends слева направо.
Для каждого элемента выполняется загрузка конфигурации.
Конфигурации рекурсивно разворачиваются, если они сами содержат
extends.
Результаты объединяются в порядке:
overridesoverrides вводит контекстное переопределение
конфигурации для конкретных файлов.
Алгоритм применения:
files, применяется
соответствующий override.Пример логики приоритета:
extendsoverrides (самый высокий приоритет в legacy)settings и parserOptionsПоля settings и parserOptions объединяются
рекурсивно.
Пример:
settings: {
react: {
version: "detect"
}
}
и
settings: {
react: {
pragma: "React"
}
}
результат:
settings: {
react: {
version: "detect",
pragma: "React"
}
}
В legacy-модели итоговый порядок влияния выглядит следующим образом:
extends)overrides--rule)/* eslint-disable */)Inline-директивы имеют наивысший приоритет, поскольку действуют на уровне конкретной строки или блока.
Комментарии внутри исходного кода модифицируют результат после основного этапа слияния.
Типы директив:
eslint-disableeslint-enableeslint-disable-next-lineeslint-envАлгоритм:
Перед применением конфигурации ESLint проверяет, должен ли файл анализироваться.
Источники игнорирования:
.eslintignoreignorePatternsАлгоритм:
.eslintignoreignorePatternsВ Flat Config модель конфигурация представлена массивом объектов:
export default [
baseConfig,
reactConfig,
{
files: ["**/*.test.js"],
rules: { "no-unused-expressions": "off" }
}
]
extends в привычном
видеfilesПри конфликте одинаковых правил ESLint применяет детерминированный подход:
override перекрывает глобальный
контекстДля ускорения повторного анализа ESLint использует кеширование:
extendsАлгоритм:
Внутренний процесс можно представить как последовательность этапов:
extends)overrides