Обработка файла в ESLint представляет собой последовательность детерминированных этапов, в ходе которых исходный текст JavaScript-кода превращается в структурированное представление (AST), затем анализируется набором правил, после чего формируется отчёт о проблемах и, при необходимости, выполняется автоматическое исправление. Каждый этап строго изолирован, но обменивается данными через промежуточные структуры — конфигурацию, абстрактное синтаксическое дерево и контекст линтинга.
Первый уровень обработки связан не с самим кодом, а с решением о том, должен ли файл вообще попадать в анализ.
ESLint применяет механизмы исключения ещё до чтения содержимого:
.eslintignore (в классической конфигурации)ignores в flat-конфигурацииnode_modulesФильтрация выполняется на уровне путей. Если путь файла совпадает с игнорирующим паттерном, дальнейшая обработка полностью прекращается. Это позволяет избежать затрат на парсинг больших зависимостей и сборочных артефактов.
На этом же этапе определяется, какая конфигурация применяется к файлу:
eslint-disable
комментарии (учитываются позже, но метаданные подготавливаются
заранее)Результатом становится финальная «эффективная конфигурация» для конкретного файла, объединяющая все источники правил и настроек parser/options.
После определения применимости файла ESLint формирует конфигурационный контекст.
Конфигурация может поступать из нескольких источников:
eslint.config.js).eslintrcextends)Происходит глубокое слияние:
"off",
"warn", "error" → 0, 1, 2)Внутренне ESLint преобразует список правил в структуру:
no-unused-vars)Это позволяет обеспечить O(1)-доступ к правилу во время обхода AST.
После подготовки конфигурации ESLint загружает содержимое файла.
На этом этапе выполняется:
Важно, что ESLint не интерпретирует код — он работает исключительно с текстом, передавая его парсеру.
Один из ключевых этапов — преобразование кода в абстрактное синтаксическое дерево (AST).
ESLint делегирует парсинг внешним или встроенным парсерам:
Парсер возвращает:
AST строится по ESTree-совместимой модели:
Каждый узел содержит:
typerange (начало и конец в исходном тексте)loc (строка и колонка)После парсинга создаётся контекст выполнения правил.
Контекст включает:
context.report,
context.getSourceCode)Также создаётся объект SourceCode, который предоставляет:
Основная фаза анализа — traversal AST с применением правил.
Каждое правило экспортирует объект вида:
Identifier(node),
CallEx * pression(node)create(context) → возвращает visitorsESLint строит единый visitor-map, объединяя все активные правила.
AST обходится в глубину (depth-first traversal):
Каждый узел обрабатывается всеми релевантными правилами независимо.
Когда правило обнаруживает нарушение, оно вызывает:
context.report()Внутренне создаётся объект проблемы:
Сообщения могут использовать шаблоны:
"Unexpected var '{{name}}'"подстановка выполняется на этапе формирования результата.
Все сообщения собираются в единый массив проблем.
На этом этапе выполняются дополнительные операции:
Также учитываются inline-disable комментарии:
eslint-disableeslint-disable-next-lineeslint-enableЭти директивы могут полностью исключать отдельные сообщения из итогового набора.
Если включён режим --fix, ESLint запускает
дополнительный этап.
Правила могут возвращать объект fix:
Каждый фикс описывает:
Фиксы агрегируются и применяются с учётом конфликтов:
После применения фиксов ESLint может:
Это важно для правил, которые взаимно корректируют код.
После завершения анализа формируется итоговая структура:
Результат готов к форматированию в CLI, IDE или CI-инструментах.
Для оптимизации ESLint использует кэширование:
Если файл не изменился, этапы парсинга и анализа могут быть пропущены, и результат берётся из кэша.
Кэш особенно эффективен в больших проектах, где повторный анализ идентичных файлов встречается часто.
На всех этапах обработки файла плагины могут вмешиваться:
Таким образом, ESLint работает как расширяемая система анализа, где базовый pipeline остаётся неизменным, а логика анализа дополняется внешними модулями.
Архитектура обработки файла разделена на строгие уровни:
Такое разделение обеспечивает предсказуемость и повторяемость анализа, независимо от размера проекта и количества подключённых правил.