Архитектура
В целом, ESLint состоит из нескольких ключевых частей:
-
bin/eslint.js— это файл, который фактически выполняется с помощью утилиты командной строки. Это простая обёртка, которая ничего не делает, кроме загрузки ESLint и передачи аргументов командной строки вcli. Она умышленно простая, чтобы не требовать интенсивного тестирования. -
lib/api.js— это точка входа вrequire("eslint"). Этот файл экспонирует объект, содержащий публичные классыLinter,ESLint,RuleTester, иSourceCode. -
lib/cli.js— это сердце ESLint CLI. Она принимает массив аргументов и затем используетeslintдля выполнения команд. Разделение этой утилиты позволяет другим программам эффективно вызывать ESLint изнутри другой программы Node.js, как будто это делается из командной строки. Главный вызов —cli.execute(). Это также та часть, которая выполняет чтение файлов, обход каталогов, ввод и вывод. -
lib/cli-engine/— этот модуль — это классCLIEngine, который находит файлы исходного кода и конфигурации, а затем выполняет проверку кода с помощью классаLinter. Это включает логику загрузки файлов конфигурации, парсеров, плагинов и форматировщиков. -
lib/linter/— этот модуль — это основной классLinter, который выполняет проверку кода на основе параметров конфигурации. Этот файл не выполняет ввод-вывод файлов и никак не взаимодействует сconsole. Другие программы Node.js, имеющие JavaScript-текст для проверки, могут напрямую использовать этот интерфейс. -
lib/rule-tester/— этот модуль — это классRuleTester, который является обёрткой вокруг Mocha, чтобы правила могли быть протестированы. Этот класс позволяет нам писать тесты для каждого реализованного правила с последовательным форматом и быть уверенными, что каждое правило работает. Интерфейс RuleTester был смоделирован по Mocha и работает с глобальными методами тестирования Mocha. RuleTester также можно модифицировать для работы с другими фреймворками тестирования. -
lib/source-code/— этот модуль — это классSourceCode, который используется для представления разобранного исходного кода. Он принимает исходный код и узел Program из AST, представляющего код. -
lib/rules/— это содержит встроенные правила, которые проверяют исходный код.
Объект cli
Объект cli — это API для интерфейса командной строки. Файл bin/eslint.js просто передаёт аргументы объекту cli и устанавливает process.exitCode в возвращённый код выхода.
Основной метод — cli.execute(), который принимает массив строк, представляющих параметры командной строки (как будто process.argv был передан без первых двух аргументов). Если вы хотите запустить ESLint изнутри другой программы и заставить его работать как CLI, то используйте объект cli.
Функции этого объекта включают:
- Интерпретацию аргументов командной строки
- Чтение из файловой системы
- Вывод на консоль
- Вывод в файловую систему
- Использование форматировщика
- Возврат правильного кода выхода
Этот объект не должен:
- Вызывать
process.exit()напрямую - Выполнять какие-либо асинхронные операции
Объект CLIEngine
Тип CLIEngine представляет собой основную функциональность CLI, но не читает ничего из командной строки и по умолчанию ничего не выводит. Вместо этого он принимает многие (но не все) аргументы, которые передаются в CLI. Он читает файлы конфигурации и исходные файлы, а также управляет средой, передаваемой в объект Linter.
Основной метод объекта CLIEngine — executeOnFiles(), который принимает массив имён файлов и каталогов для запуска линтера.
Функции этого объекта включают:
- Управление средой выполнения для
Linter - Чтение из файловой системы
- Чтение информации о конфигурации из файлов конфигурации (включая
.eslintrcиpackage.json)
Этот объект не должен:
- Вызывать
process.exit()напрямую - Выполнять какие-либо асинхронные операции
- Выводить на консоль
- Использовать форматировщики
Объект Linter
Основной метод объекта Linter — verify() и принимает два аргумента: текст исходного кода для проверки и объект конфигурации (заготовленная конфигурация заданного файла конфигурации плюс параметры командной строки). Метод сначала разбирает заданный текст с помощью espree (или любого настроенного парсера) и получает AST. AST создаётся с использованием местоположений строк/столбцов и диапазонов, которые полезны для отчётности о местоположении проблем и извлечения текста исходного кода, связанного с узлом AST, соответственно.
После получения AST, estraverse используется для обхода AST сверху вниз. На каждом узле объект Linter излучает событие с тем же именем, что и тип узла (например, «Identifier», «WithStatement» и т.д.). При возвращении вверх по поддереву излучается событие с именем типа AST и суффиксом «:exit», например «Identifier:exit» — это позволяет правилам действовать как при движении вниз, так и при движении вверх по дереву обхода. Каждое событие излучается с соответствующим узлом AST.
Функции этого объекта включают:
- Просмотр строк JavaScript-кода
- Создание AST для кода
- Выполнение правил на AST
- Возврат результатов выполнения
Этот объект не должен:
- Вызывать
process.exit()напрямую - Выполнять какие-либо асинхронные операции
- Использовать специфичные для Node.js функции
- Доступ к файловой системе
- Вызывать
console.log()или любой другой аналогичный метод
Правила
Индивидуальные правила — самая специализированная часть архитектуры ESLint. Правила могут делать очень немногое; они просто набор инструкций, выполняемых над AST, который предоставляется. Они получают некоторую контекстную информацию, но основная функция правила — просмотреть AST и сообщить о предупреждениях.
Функции этих объектов включают:
- Просмотр AST на предмет конкретных шаблонов
- Сообщать о предупреждениях при обнаружении определённых шаблонов
Эти объекты не должны:
- Вызывать
process.exit()напрямую - Выполнять какие-либо асинхронные операции
- Использовать специфичные для Node.js функции
- Доступ к файловой системе
- Вызывать
console.log()или любой другой аналогичный метод
© OpenJS Foundation and other contributors
Licensed under the MIT License.
https://eslint.org/docs/latest/contribute/architecture