Интеграция ESLint в проекты на Svelte строится вокруг необходимости
анализировать не только JavaScript/TypeScript-код, но и шаблонную часть
.svelte файлов. В отличие от классических SPA-фреймворков,
Svelte компилирует компоненты на этапе сборки, что создаёт
дополнительный слой синтаксиса, требующий специализированного парсера и
плагинов.
ESLint по умолчанию работает только с ECMAScript-кодом. Svelte-компоненты же содержат три логических блока:
<script> (JS/TS логика)<style> (CSS)Именно markup является ключевой проблемой для стандартного ESLint-пайплайна, так как он не является валидным JavaScript.
Для анализа .svelte файлов используется
специализированный парсер svelte-eslint-parser. Он
преобразует Svelte-компонент в AST-структуру, совместимую с ESLint.
Внутренняя модель работы выглядит следующим образом:
script,
style, template)<script> парсится стандартным JS/TS парсером
(например, espree или
@typescript-eslint/parser)Ключевая особенность — AST содержит гибридные узлы, такие как:
SvelteMustacheTagSvelteAttributeSvelteDirectiveSvelteFragmentЭти узлы позволяют писать правила, ориентированные на шаблонную логику.
Стандартная настройка начинается с установки пакетов:
npm install -D eslint svelte-eslint-parser eslint-plugin-svelte
Основная конфигурация:
export default {
files: ["**/*.svelte"],
languageOptions: {
parser: "svelte-eslint-parser",
parserOptions: {
parser: "@typescript-eslint/parser",
extraFileExtensions: [".svelte"],
ecmaVersion: "latest",
sourceType: "module"
}
},
plugins: {
svelte: eslintPluginSvelte
},
rules: {
"svelte/no-unused-svelte-ignore": "warn"
}
};
Плагин eslint-plugin-svelte является центральным
элементом экосистемы линтинга Svelte. Он содержит набор правил,
ориентированных на:
$: реактивных декларацийon:click,
on:input)Одной из ключевых особенностей Svelte является реактивность через
метки $:. ESLint может контролировать корректность
зависимостей.
Пример проблемного кода:
<script>
let a = 1;
let b = 2;
let sum;
$: sum = a + b;
</script>
Расширенные правила могут проверять:
При использовании TypeScript в Svelte добавляется дополнительный слой
сложности. Конфигурация расширяется через
@typescript-eslint/parser.
parserOptions: {
parser: "@typescript-eslint/parser",
project: "./tsconfig.json",
extraFileExtensions: [".svelte"]
}
Это позволяет:
<script lang="ts">Template-часть Svelte имеет собственные особенности, которые требуют отдельных правил ESLint.
<input bind:value={name} />
Линтер может проверять:
nameSvelte использует директивы:
on:clickbind:use:transition:ESLint-правила могут анализировать:
Событийная модель Svelte отличается от DOM напрямую. ESLint помогает контролировать:
<button on:click={handleClick}>OK</button>
Проверки включают:
handleClickРасширенные правила могут запрещать:
<button on:click={() => console.log('test')}>OK</button>
Svelte не использует классический virtual DOM, поэтому ESLint-правила фокусируются на реактивных присваиваниях.
$: doubled = count * 2;
Типовые проверки:
ESLint в Svelte-проектах часто требует тонкой настройки исключений:
rules: {
"svelte/no-unused-svelte-ignore": "error",
"svelte/valid-compile": "error"
}
В Svelte допускается использование комментариев:
<!-- eslint-disable-next-line -->
<div>{anyEx * pression()}</div>
Плагин обеспечивает контроль за корректностью таких отключений, предотвращая скрытие ошибок.
Некоторые правила направлены не на синтаксис, а на производительность:
Пример анти-паттерна:
{#each items as item}
<div>{expensiveCalculation(item)}</div>
{/each}
Линтер может рекомендовать вынесение вычислений в реактивные блоки.
ESLint в Svelte-проектах часто комбинируется с форматерами. Основная цель — разделение ответственности:
При конфликте правил отключаются stylistic rules ESLint, чтобы избежать дублирования функций форматирования.
В крупных проектах Svelte ESLint конфигурация часто становится частью монорепозитория:
Используются shared-config подходы:
export default [
baseConfig,
svelteConfig,
tsConfig
];
В больших Svelte-проектах ESLint используется в режиме:
Это особенно важно, так как Svelte-компоненты требуют двойного разбора (template + script).
Распространённые проблемы:
extraFileExtensions: [".svelte"]eslint-plugin-svelte и
eslint-plugin-svelte3eslint:recommended без
адаптации под SvelteВ зрелых проектах правила группируются:
Такой подход позволяет поддерживать предсказуемость поведения линтера при росте проекта и усложнении компонентной структуры.