В контексте Vue Single File Components (SFC) стандартный парсер
JavaScript, используемый в ESLint, оказывается недостаточным, поскольку
структура .vue файлов включает не только JavaScript, но и
шаблонную часть, стили и специальные директивы фреймворка. Для
корректного анализа таких файлов применяется специализированный парсер
vue-eslint-parser, который расширяет возможности стандартного анализа и
обеспечивает работу ESLint с Vue-специфичной структурой.
Основная задача данного парсера заключается в преобразовании
.vue файла в синтаксическое дерево (AST), пригодное для
дальнейшего анализа правилами ESLint, сохраняя при этом совместимость с
ESTree-форматом для JavaScript-кода и добавляя дополнительные узлы для
template-части.
Vue SFC состоит из трёх основных секций:
<template> — декларативный шаблон<script> — логика компонента<style> — стилизацияПарсер vue-eslint-parser разделяет обработку на
несколько этапов:
<script> с использованием подключённого
JS/TS парсера<template>Ключевая особенность заключается в том, что итоговое дерево не является чистым JavaScript AST, а представляет собой гибридную структуру, где template и script сосуществуют в единой модели анализа.
vue-eslint-parser не заменяет полностью парсинг
JavaScript-кода. Вместо этого он делегирует обработку
<script> части другому парсеру, чаще всего:
espree (стандартный парсер ESLint)@babel/eslint-parser@typescript-eslint/parserТакой подход позволяет сохранять совместимость с современными возможностями языка, включая TypeScript, JSX и экспериментальные предложения ECMAScript.
Передача управления выглядит следующим образом:
<script>parserИспользование vue-eslint-parser задаётся через
конфигурацию ESLint:
module.exports = {
parser: "vue-eslint-parser",
parserOptions: {
parser: "@babel/eslint-parser",
ecmaVersion: 2022,
sourceType: "module",
ecmaFeatures: {
jsx: false
}
}
};
Параметр parserOptions.parser играет центральную роль,
определяя, каким образом будет обрабатываться JavaScript внутри
<script> блока.
Также поддерживаются дополнительные настройки:
parserOptions.ecmaVersion — версия ECMAScriptparserOptions.sourceType — модульная система
(script/module)parserOptions.extraFileExtensions — дополнительные
расширения файловAST, формируемый vue-eslint-parser, включает несколько
уровней:
Корневой узел содержит метаданные файла и ссылки на дочерние блоки:
<script setup>)Template часть преобразуется в отдельное дерево, основанное на HTML-подобной структуре. Оно включает:
{{ }})Особенность заключается в том, что выражения внутри шаблона дополнительно анализируются как JavaScript-код.
Vue template содержит интерполированные выражения:
<div>{{ message }}</div>
Выражение message не является частью HTML AST напрямую.
Оно передаётся в JavaScript-парсер для анализа идентификаторов,
операторов и вызовов.
Это создаёт двойной уровень анализа:
Такой механизм позволяет ESLint применять правила как к структуре шаблона, так и к логике выражений.
Современный синтаксис <script setup> требует
отдельной обработки. В рамках vue-eslint-parser он
рассматривается как специализированный блок, в котором:
AST для script setup объединяется с template контекстом, что позволяет проверять:
Одной из ключевых возможностей является parserServices,
предоставляющий доступ к дополнительной информации для правил
ESLint.
Сервисы включают:
Пример использования в правиле ESLint:
Это позволяет реализовывать правила, которые невозможны в чистом JavaScript-анализе.
Vue вводит собственную модель реактивности и связывания данных. В отличие от классического JavaScript, переменные могут использоваться в template без явного импорта в этом контексте.
vue-eslint-parser формирует специальную систему scope
tracking:
Особенность заключается в том, что template scope наследует script scope, но не является его прямым продолжением в терминах AST.
Vue директивы, такие как:
v-ifv-forv-bindv-modelинтерпретируются как специальные атрибуты AST-узлов.
Каждая директива преобразуется в структурированное представление:
:value)Это позволяет ESLint анализировать корректность использования директив и их выражений.
При использовании TypeScript в Vue проектах часто применяется связка:
vue-eslint-parser@typescript-eslint/parserВ этом случае происходит каскадный парсинг:
Такой подход обеспечивает проверку типов и синтаксический анализ одновременно.
Несмотря на гибкость, архитектура имеет ряд ограничений:
Также некоторые инструменты анализа кода, ориентированные на чистый ESTree, не поддерживают Vue-структуру без адаптации.
Одной из сложных задач является сопоставление позиций кода:
Для этого используется mapping слой, который преобразует:
Это критически важно для корректного отображения ошибок ESLint.
При разработке правил для Vue необходимо учитывать:
Правила могут быть:
Hybrid-правила наиболее сложны, но позволяют реализовывать глубокий анализ компонентов.
При использовании JSX внутри Vue (например, через Babel):
В этом случае vue-eslint-parser фактически работает как
контейнер, передавая весь JS в Babel-парсер, но сохраняя структуру Vue
файла для возможного расширенного анализа.
vue-eslint-parser выступает базовым компонентом для:
Он является связующим звеном между декларативной природой Vue и императивной моделью JavaScript анализа, используемой ESLint.