Механизм правил в системе линтинга построен вокруг строгого разграничения идентификаторов, где каждое правило существует в рамках определённого пространства имён. Это необходимо для предотвращения конфликтов, обеспечения расширяемости и корректной интеграции сторонних пакетов.
Каждое правило в ESLint имеет строковый идентификатор. В простейшем случае это одиночное имя:
no-unused-varseqeqeqno-consoleТакие правила относятся к ядру и не требуют указания источника. Однако при подключении внешних расширений появляется необходимость различать происхождение правил.
Плагин вводит составной формат идентификатора:
plugin-name/rule-name
Разделение через символ / формирует две логические
части:
Примеры:
react/jsx-uses-reactimport/no-unresolvednode/no-missing-requireТакой подход позволяет нескольким плагинам определять правила с одинаковыми внутренними именами без пересечений.
Пространство имён выполняет роль контейнера, который связывает правило с его источником. Оно не является частью логики проверки, но критично для:
При интерпретации конфигурации линтер рассматривает строку до слеша как ключ к загрузке соответствующего модуля плагина.
Существует принципиальное разделение:
Это различие позволяет ядру оставаться стабильным, а экосистеме расширяться независимо.
Пример сравнения:
| Тип | Пример |
|---|---|
| Ядро | no-debugger |
| Плагин | @typescript-eslint/no-explicit-any |
Во втором случае используется расширенное пространство имён с поддержкой scoped-пакетов npm.
В экосистеме npm часто используются scoped-пакеты, что добавляет дополнительный уровень структуры:
@scope/plugin-name/rule-name
Пример:
@typescript-eslint/no-unused-varsЗдесь присутствуют три уровня:
@typescript-eslint — npm scope;typescript-eslint — плагин;no-unused-vars — правило.Такое вложение усиливает уникальность идентификаторов и отражает происхождение пакета.
При обработке конфигурационных файлов правило интерпретируется как строковый ключ. Логика загрузки включает:
/.Если плагин не подключён, правило считается неизвестным и приводит к ошибке конфигурации.
Без пространств имён возникла бы ситуация, при которой разные плагины могли бы объявлять одинаковые имена правил:
no-shadow в одном плагинеno-shadow в другомИспользование префиксов устраняет неоднозначность:
plugin-a/no-shadowplugin-b/no-shadowТаким образом, конфликт превращается в управляемую коллизию на уровне конфигурации, а не выполнения.
В современных конфигурациях ESLint пространство имён сохраняется как основной механизм идентификации правил, но используется совместно с объектной структурой конфигурации.
Пример логики:
Несмотря на изменение формата конфигурации, принцип разделения через
/ остаётся неизменным.
Внутри одного плагина правила часто структурируются по тематическим подпространствам:
import/extensionsimport/orderimport/no-cycleХотя формально они находятся в одном пространстве имён
import, внутреннее разделение отражает категории
проверок:
Это позволяет поддерживать масштабируемость плагина без усложнения внешнего API.
С точки зрения архитектуры линтера пространство имён выполняет три функции:
Эти функции разделены логически, но реализуются через одну строковую конструкцию.
Использование пространств имён обеспечивает возможность параллельного развития множества плагинов без централизованного контроля за именами. Это особенно важно для крупных экосистем, где количество правил исчисляется сотнями.
Структура plugin/rule становится минимальной единицей
совместимости между независимыми разработками и ядром линтера, сохраняя
предсказуемость поведения при росте числа расширений.