vite-plugin-checker — популярный плагин экосистемы Vite, предназначенный
для запуска дополнительных проверок качества кода во время разработки и
сборки. Основная задача плагина — вынести тяжёлые операции проверки
типов, линтинга и анализа кода в отдельный процесс, не блокируя основной
dev-сервер.
Плагин особенно полезен в проектах с:
vue-tscБез подобных инструментов Vite остаётся исключительно быстрым сборщиком, но не обеспечивает полноценный контроль качества кода. Например:
vue-tsc.vite-plugin-checker закрывает эти ограничения.
Установка выполняется через npm:
npm install vite-plugin-checker --save-dev
Либо через pnpm:
pnpm add -D vite-plugin-checker
Либо через yarn:
yarn add -D vite-plugin-checker
Минимальная конфигурация:
// vite.config.js
import { defineConfig } from 'vite'
import checker from 'vite-plugin-checker'
export default defineConfig({
plugins: [
checker({
typescript: true
})
]
})
После запуска dev-сервера плагин начинает:
Важно понимать архитектуру самого Vite.
Vite использует:
esbuild чрезвычайно быстрый, но не выполняет полноценный
type-checking.
Например:
const value: string = 123
Такой код успешно запустится в Vite без дополнительных проверок.
Причина:
vite-plugin-checker запускает отдельный процесс
tsc, благодаря чему ошибки типов начинают обнаруживаться
автоматически.
checker({
typescript: true
})
Эквивалентно запуску:
tsc --noEmit
checker({
typescript: {
tsconfigPath: './tsconfig.app.json'
}
})
Полезно в monorepo и multi-config проектах.
checker({
typescript: {
buildMode: true
}
})
В этом режиме:
Подходит для крупных проектов, где постоянный type-check слишком тяжёлый.
Одно из ключевых преимуществ плагина — визуальный overlay.
При возникновении ошибки появляется окно поверх страницы:
Пример ошибки:
const user: string = 42
В браузере будет показано:
Type 'number' is not assignable to type 'string'
Это существенно ускоряет цикл разработки.
checker({
eslint: {
lintCommand: 'eslint "./src/**/*.{js,ts,vue}"'
}
})
Плагин запускает указанную команду в отдельном процессе.
lintCommandПлагин не реализует собственный ESLint-движок.
Вместо этого:
Это обеспечивает:
Современный ESLint использует Flat Config:
// eslint.config.js
export default [
{
rules: {
semi: 'error'
}
}
]
vite-plugin-checker полностью совместим с Flat Config,
если CLI-команда ESLint работает корректно.
vue-tscchecker({
vueTsc: true
})
Плагин запускает:
vue-tsc --noEmit
tsc недостаточен для VueФайлы .vue содержат:
Стандартный TypeScript-компилятор не умеет полноценно анализировать Vue SFC.
vue-tsc:
<script setup lang="ts">
defineProps<{
title: string
}>()
</script>
<template>
<div>{{ title.toFixed(2) }}</div>
</template>
Ошибка:
Property 'toFixed' does not exist on type 'string'
checker({
stylelint: {
lintCommand: 'stylelint "./src/**/*.{css,scss}"'
}
})
Biome — современная альтернатива ESLint и Prettier.
Подключение:
checker({
biome: {
command: 'biome check ./src'
}
})
Наиболее распространённая конфигурация:
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
},
stylelint: {
lintCommand: 'stylelint "./src/**/*.{scss}"'
}
})
Каждая проверка запускается параллельно.
Главная особенность vite-plugin-checker — использование
отдельных worker-процессов.
Схема работы:
Vite Dev Server
|
+---- TypeScript Worker
|
+---- ESLint Worker
|
+---- Stylelint Worker
Это предотвращает:
Даже при огромном количестве ошибок:
Это важное отличие от старых webpack-подходов.
Overlay включён по умолчанию.
Отключение:
checker({
overlay: false,
typescript: true
})
Можно отключить отдельные категории ошибок:
checker({
overlay: {
initialIsOpen: false
}
})
Overlay:
Типичная конфигурация React + TS:
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import checker from 'vite-plugin-checker'
export default defineConfig({
plugins: [
react(),
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
}
})
]
})
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
import checker from 'vite-plugin-checker'
export default defineConfig({
plugins: [
vue(),
checker({
vueTsc: true
})
]
})
checker({
typescript: true
})
Для Svelte обычно используется отдельная проверка через
svelte-check.
В monorepo важно правильно указывать tsconfigPath.
Пример:
checker({
typescript: {
tsconfigPath: './packages/frontend/tsconfig.json'
}
})
На очень крупных проектах проверки могут стать тяжёлыми.
Основные причины:
Плохо:
lintCommand: 'eslint "./**/*"'
Лучше:
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
dist
coverage
node_modules
Через .eslintignore.
{
"compilerOptions": {
"incremental": true
}
}
Часто создаются:
tsconfig.app.json
tsconfig.node.json
tsconfig.test.json
Это уменьшает объём проверяемого кода.
При тысячах ошибок overlay становится неудобным.
В таких случаях:
checker({
overlay: false
})
Ошибки остаются в терминале.
Иногда плагин отключают локально:
plugins: [
process.env.CI &&
checker({
typescript: true
})
]
const isDev = process.env.NODE_ENV === 'development'
checker({
typescript: isDev
})
Плагин может завершать build с ошибкой.
Например:
const value: number = 'abc'
Build завершится неуспешно.
Это предотвращает публикацию некорректного кода.
tscМногие проекты используют:
tsc --noEmit
отдельно от Vite.
vite-plugin-checker отличается тем, что:
В webpack проверка типов часто:
Vite + vite-plugin-checker разделяют:
Это обеспечивает значительно более быстрый workflow.
Ошибка:
eslint: {
lintCommand: 'eslint src'
}
Может пропускать файлы.
Лучше:
eslint: {
lintCommand: 'eslint "./src/**/*.{js,ts,tsx}"'
}
Ошибка:
Cannot find module 'typescript'
Решение:
npm install typescript -D
vue-tscОшибка:
Cannot find module 'vue-tsc'
Решение:
npm install vue-tsc -D
Иногда watcher внутри контейнера работает нестабильно.
Решение:
server: {
watch: {
usePolling: true
}
}
Плагин особенно полезен в:
Однако чаще в CI выполняются отдельные команды:
tsc --noEmit
eslint .
а vite-plugin-checker используется локально для DX.
Наибольшая ценность проявляется в проектах:
В небольших проектах:
дополнительные проверки могут не окупать накладные расходы.
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import checker from 'vite-plugin-checker'
export default defineConfig({
plugins: [
react(),
checker({
typescript: {
tsconfigPath: './tsconfig.json'
},
eslint: {
lintCommand:
'eslint "./src/**/*.{ts,tsx}"'
},
overlay: {
initialIsOpen: false
}
})
]
})