Экосистема ESLint опирается на семантическое версионирование
(SemVer), где версия представляется в формате
MAJOR.MINOR.PATCH. Эта модель определяет характер изменений
и их влияние на совместимость.
MAJOR-версия изменяется при внесении несовместимых изменений. Такие обновления затрагивают публичные API, формат конфигураций, поведение правил или архитектуру плагинов. MINOR-версия включает обратимо совместимые улучшения: новые правила, расширения возможностей, дополнительные опции. PATCH-версия фиксирует ошибки, не изменяя поведение системы в ожидаемом контракте.
В контексте линтера важным аспектом становится не только API, но и поведение анализа кода, поскольку даже изменение диагностики может считаться потенциально разрушающим совместимость.
Совместимость ESLint определяется сразу на нескольких уровнях:
Каждый уровень может независимо стать источником несовместимости при обновлении версии. Поэтому версия ESLint часто влияет не только на сам пакет, но и на всю цепочку зависимостей инструмента качества кода.
Исторически ESLint использовал формат .eslintrc, который
поддерживал JSON, YAML и JavaScript-конфигурации. Этот формат долгое
время оставался стандартом, но с развитием системы возникла новая модель
— flat config.
Переход на flat config в новых версиях стал одним из ключевых факторов изменения мажорной версии:
Изменение модели конфигурации напрямую влияет на совместимость, так как плагины и пресеты должны адаптироваться к новому формату экспорта.
В переходных версиях ESLint поддерживаются оба подхода, но с различиями в поведении:
.eslintrc работает через каскадное объединение
конфигураций;Это приводит к ситуации, когда одинаковые конфигурации могут давать разные результаты анализа в зависимости от режима.
Плагины являются ключевым элементом расширения функциональности ESLint. Каждый плагин экспортирует набор правил, конфигураций и иногда парсеров.
Совместимость плагинов зависит от нескольких факторов:
При мажорных обновлениях меняется контракт между ядром и плагинами, что требует обновления зависимостей.
Особое значение имеет поле peerDependencies, которое
задаёт допустимые диапазоны версий ESLint для конкретного плагина.
Несовпадение этих диапазонов часто приводит к неработоспособности правил
или предупреждениям пакетного менеджера.
ESLint сам по себе не парсит современный JavaScript без внешних парсеров. Для этого используются:
Совместимость парсера и версии ESLint определяется:
Например, изменения в структуре AST или расширение поддержки TypeScript требуют обновления парсера, даже если сам ESLint не меняет ядро.
Каждая мажорная версия ESLint устанавливает минимальную версию Node.js.
Эта зависимость влияет на:
При повышении минимальной версии Node.js часто упрощается внутренняя архитектура ESLint, но одновременно нарушается обратная совместимость с устаревшими средами CI/CD.
Правила ESLint представляют собой функции анализа AST с определённым контрактом. Изменения в правилах могут быть:
Даже при сохранении API изменение поведения правила считается потенциально ломающее совместимость, так как влияет на результаты линтинга.
Особенно чувствительны правила, связанные с:
no-implicit-coercion);Пресеты (shareable configs) формируют слой абстракции поверх правил. Их совместимость зависит от:
При изменении мажорной версии часто требуется обновление пресетов, поскольку устаревшие правила удаляются или заменяются.
Переход между версиями ESLint обычно затрагивает несколько слоёв одновременно:
Типичная проблема миграции — несовпадение версий плагинов и ядра, когда часть правил уже использует новый API, а часть остаётся в старом формате.
В реальных проектах управление версиями ESLint включает несколько механизмов:
package-lock.json или
pnpm-lock.yaml;package.json;Особое значение имеет согласование версий между:
На практике несовместимость возникает в нескольких сценариях:
Каждый из этих сценариев приводит к либо частичной деградации анализа, либо полной невозможности запуска линтера.
Мажорные версии ESLint часто сопровождаются изменением внутренних API:
Эти изменения затрагивают не только пользователей, но и разработчиков плагинов, что делает экосистему чувствительной к версии ядра.
В больших кодовых базах управление совместимостью ESLint строится через:
Такой подход снижает риск разнородного поведения линтинга в разных частях системы и уменьшает вероятность конфликтов зависимостей.