eslint-plugin-vue
Плагин eslint-plugin-vue предназначен для статического анализа файлов
Vue Single File Components (SFC) и JavaScript-кода, связанного с
Vue-приложениями. Он расширяет возможности ESLint за пределы обычного
JavaScript, добавляя понимание структуры шаблонов
<template>, секций <script> и
<style> внутри .vue файлов.
Ключевая задача заключается в обеспечении согласованности, читаемости и предсказуемости Vue-кода через набор специализированных правил, учитывающих особенности реактивности, директив, компонентов и шаблонного синтаксиса.
Плагин строится вокруг двух основных компонентов:
vue-eslint-parser)
обеспечивает разбор .vue файлов в AST, объединяющий
JavaScript и template-часть.AST, создаваемый парсером, содержит:
<script><template>Плагин используется совместно с ESLint и парсером Vue:
npm install -D eslint eslint-plugin-vue vue-eslint-parser
В типичной конфигурации ESLint подключение выглядит следующим образом:
module.exports = {
parser: "vue-eslint-parser",
parserOptions: {
parser: "@babel/eslint-parser",
ecmaVersion: "latest",
sourceType: "module"
},
plugins: ["vue"],
extends: [
"plugin:vue/vue3-recommended"
]
};
Ключевой момент заключается в том, что именно
vue-eslint-parser становится верхнеуровневым парсером,
делегируя разбор JavaScript вложенному парсеру.
Плагин исторически поддерживает обе версии Vue, но правила и пресеты различаются:
plugin:vue/recommendedplugin:vue/vue3-recommendedessential,
strongly-recommended, recommendedРазличия проявляются в обработке:
v-model (изменённая семантика во Vue 3)script setupВ Flat Config (ESLint 9+) интеграция становится более явной:
import vue from "eslint-plugin-vue";
import vueParser from "vue-eslint-parser";
export default [
{
files: ["**/*.vue"],
languageOptions: {
parser: vueParser,
parserOptions: {
parser: "@babel/eslint-parser",
ecmaVersion: "latest",
sourceType: "module"
}
},
plugins: {
vue
},
rules: {
...vue.configs["vue3-recommended"].rules
}
}
];
Особенность Flat Config — явное распределение конфигурации по файлам
и отсутствие extends в классическом виде.
Правила плагина структурированы по смысловым группам.
Эта группа контролирует синтаксические ошибки Vue template:
v-if, v-for,
v-bind)Примеры правил:
vue/no-unused-varsvue/no-template-shadowvue/valid-v-forКонтроль архитектурных проблем:
Примеры:
vue/no-duplicate-attributesvue/require-prop-typesvue/require-default-propЕдинообразие структуры:
Примеры:
vue/html-indentvue/max-attributes-per-linevue/first-attribute-linebreakПравила предотвращают потенциальные ошибки выполнения:
key в спискахПримеры:
vue/valid-v-forvue/no-side-effects-in-computed-propertiesФайлы .vue разбиваются на блоки:
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
data() {
return {
message: "text"
}
}
}
</script>
Парсер преобразует это в единую структуру, где:
Особенность заключается в корректной маппинге строковых смещений между виртуальными AST и оригинальным файлом.
Поддержка <script setup> требует расширенного
анализа:
<script setup>
import { ref } from "vue"
const count = ref(0)
</script>
<template>
<button @click="count++">{{ count }}</button>
</template>
Плагин анализирует:
defineProps, defineEmitsreturnПравила адаптируются под отсутствие export default.
В сочетании с @typescript-eslint/parser:
parser: "vue-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser"
}
Возможности:
Ограничения:
Плагин предоставляет набор конфигураций:
essential — критические ошибкиrecommended — баланс качества и гибкостиstrongly-recommended — строгие правилаvue3-recommended — современный стандарт Vue 3Каждый пресет представляет заранее определённый набор правил, включающих:
Template-часть имеет отдельный набор ограничений:
Пример проблемного кода:
<div>{{ items.filter(x => x.active).map(x => x.name) }}</div>
Такой код часто нарушает правило vue/no-template-shadow
и усложняет отладку реактивности.
В современных сборках:
.vue и server-side
частейОсобенности:
Факторы влияния:
Оптимизации:
node_moduleskey в v-forv-if и v-for
одновременноprops типовВозможности кастомизации:
Структура кастомного правила:
module.exports = {
meta: {
type: "problem"
},
create(context) {
return {
"VExpressionContainer"(node) {
// анализ выражений шаблона
}
}
}
};
AST-события зависят от vue-eslint-parser и отличаются от стандартного ESLint.
Директивы Vue требуют отдельной обработки:
v-bindv-modelv-onПлагин проверяет:
Плагин работает совместно с:
Синхронизация между инструментами важна для избежания дублирующей диагностики.