ESLint работает поверх абстрактного синтаксического дерева (AST), которое строится на основе исходного кода JavaScript. Именно парсер отвечает за преобразование текста программы в структуру, пригодную для анализа правилами линтинга. По умолчанию используется парсер Espree, поддерживающий стандартный JavaScript и часть современных возможностей ECMAScript.
Парсер является фундаментальным компонентом цепочки обработки:
исходный код → парсер → AST → правила ESLint → отчёт о проблемах
Любое расширение синтаксиса языка, будь то TypeScript, JSX или экспериментальные предложения ECMAScript, требует использования альтернативного парсера, способного корректно интерпретировать соответствующий синтаксис.
В конфигурации ESLint выбор парсера задаётся через поле
parser. Оно может указывать как на встроенный, так и на
сторонний модуль.
Базовая структура конфигурации:
module.exports = {
parser: "имя-пакета-парсера",
rules: {
semi: "error"
}
};
При установке альтернативного парсера ESLint делегирует ему построение AST, после чего применяет стандартный механизм проверки правил.
Важно учитывать, что не каждый парсер совместим со всеми правилами ESLint. Совместимость зависит от структуры AST, которую он генерирует.
Использование альтернативного парсера требуется в случаях, когда стандартный Espree не способен корректно обработать синтаксис проекта:
Каждый из этих сценариев требует специализированного анализа синтаксиса.
Один из наиболее распространённых вариантов — использование Babel-парсера, который интегрируется с экосистемой Babel и поддерживает широкий спектр экспериментального синтаксиса.
Установка:
npm install --save-dev @babel/eslint-parser
Конфигурация:
module.exports = {
parser: "@babel/eslint-parser",
parserOptions: {
requireConfigFile: false,
babelOptions: {
presets: ["@babel/preset-env"]
}
}
};
@babel/eslint-parser не выполняет трансформацию кода, а только строит AST через Babel. Это означает:
При отсутствии корректных настроек Babel возможны ошибки разбора или неполное дерево AST.
Для проектов на TypeScript применяется специализированный парсер:
npm install --save-dev @typescript-eslint/parser
Конфигурация:
module.exports = {
parser: "@typescript-eslint/parser",
parserOptions: {
ecmaVersion: 2022,
sourceType: "module",
project: "./tsconfig.json"
}
};
Парсер выполняет не только синтаксический разбор TypeScript-кода, но и формирует расширенную модель AST, включающую типовую информацию. Это позволяет правилам ESLint анализировать типы данных, интерфейсы и generics.
Поле project включает режим семантического анализа через
TypeScript Compiler API. В этом режиме:
При отсутствии project парсер работает в упрощённом
режиме без полноценной типизации.
JSX не является частью стандартного JavaScript, поэтому требует либо Babel-парсера, либо TypeScript-парсера с включённой поддержкой JSX.
Для Babel:
parser: "@babel/eslint-parser",
parserOptions: {
babelOptions: {
presets: ["@babel/preset-react"]
}
}
Для TypeScript:
parserOptions: {
ecmaFeatures: {
jsx: true
}
}
JSX трансформируется в вызовы функций, но на уровне AST сохраняет структуру компонентов, что позволяет правилам анализировать дерево UI-элементов.
Каждый парсер поддерживает собственный набор опций через
parserOptions. Эти параметры влияют на интерпретацию
кода.
Ключевые параметры:
Определяет версию ECMAScript:
parserOptions: {
ecmaVersion: 2022
}
Более высокая версия включает поддержку новых синтаксических
конструкций, таких как ??, ?., top-level
await.
Определяет модульную систему:
"script" — классический скрипт"module" — ES ModulesНеправильное значение приводит к ошибкам разбора import/export.
Дополнительные возможности синтаксиса:
parserOptions: {
ecmaFeatures: {
jsx: true
}
}
Используется для включения JSX или других расширений.
ESLint-правила опираются на структуру AST. При смене парсера возможны следующие ситуации:
Например, правила, работающие с типами переменных, требуют TypeScript-парсера, иначе информация о типах отсутствует.
Некоторые плагины явно зависят от конкретного парсера и указывают его в документации.
В сложных проектах часто требуется использование разных парсеров для разных типов файлов:
module.exports = {
overrides: [
{
files: ["*.ts"],
parser: "@typescript-eslint/parser"
},
{
files: ["*.jsx"],
parser: "@babel/eslint-parser"
}
]
};
Такой подход позволяет объединять несколько языков и синтаксических диалектов в рамках одного линтингового конвейера.
Плагины ESLint могут требовать определённого парсера. Например:
@typescript-eslint/eslint-plugin требует
@typescript-eslint/parser;Несоответствие парсера и плагина приводит к ошибкам анализа или отсутствию проверок.
Типовые проблемы:
Возникает при использовании неподдерживаемого синтаксиса.
Причина: несоответствие версии ECMAScript или отсутствие нужного парсера.
ESLint не находит указанный модуль парсера.
Причина: отсутствие установленного пакета или ошибка в имени.
Правила не могут обработать дерево.
Причина: несовместимость плагина и выбранного парсера.
Разные парсеры имеют различную стоимость анализа:
При увеличении объёма проекта различия становятся заметны в времени линтинга.
В крупных системах ESLint может использовать несколько уровней анализа:
Такая архитектура позволяет поддерживать гетерогенные кодовые базы с разными стандартами JavaScript.