vite-plugin-checker — плагин для экосистемы Vite,
предназначенный для запуска дополнительных проверок во время разработки
и сборки проекта. Основная задача плагина — вынести тяжёлые процессы
анализа кода из основной цепочки трансформации модулей и запускать их
параллельно.
Плагин особенно полезен в проектах с:
По умолчанию Vite выполняет только транспиляцию TypeScript через
esbuild и не производит полноценную проверку типов. Аналогичная ситуация
наблюдается и с линтингом: Vite не запускает ESLint автоматически.
vite-plugin-checker закрывает этот пробел.
Установка через npm:
npm install vite-plugin-checker --save-dev
Установка через pnpm:
pnpm add vite-plugin-checker -D
Установка через yarn:
yarn add vite-plugin-checker -D
Базовая конфигурация:
// vite.config.ts
import { defineConfig } from 'vite'
import checker from 'vite-plugin-checker'
export default defineConfig({
plugins: [
checker({
typescript: true
})
]
})
После подключения плагин запускает отдельный worker-процесс для проверки TypeScript.
Vite использует esbuild для максимально быстрой трансформации TypeScript:
const user: string = 123
Несмотря на ошибку типов, Vite успешно выполнит транспиляцию:
const user = 123
Ошибки типов при этом проигнорируются.
Полноценная проверка появляется только при запуске:
tsc --noEmit
Именно этот процесс автоматизирует
vite-plugin-checker.
checker({
typescript: true
})
Эквивалентно:
checker({
typescript: {
tsconfigPath: 'tsconfig.json'
}
})
Во многих проектах используется несколько конфигураций TypeScript:
tsconfig.json
tsconfig.app.json
tsconfig.node.json
Плагин позволяет выбрать нужный файл:
checker({
typescript: {
tsconfigPath: './tsconfig.app.json'
}
})
В монорепозиториях часто применяется project references:
{
"references": [
{ "path": "./packages/core" },
{ "path": "./packages/ui" }
]
}
В этом случае checker использует основной tsconfig:
checker({
typescript: {
tsconfigPath: './tsconfig.json'
}
})
Внутри TypeScript автоматически проверяются все references.
Одной из ключевых возможностей плагина является browser overlay.
При возникновении ошибки поверх страницы отображается специальное окно:
const total: number = '100'
На экране появляется сообщение:
Type 'string' is not assignable to type 'number'
Это существенно ускоряет разработку, поскольку ошибка сразу видна в браузере без переключения в терминал.
Иногда overlay мешает работе интерфейса, особенно при демонстрации проекта.
Отключение:
checker({
typescript: true,
overlay: false
})
Либо настройка объекта:
checker({
overlay: {
initialIsOpen: false
}
})
checker({
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
}
})
Плагин запускает указанный shell-командой линтер в отдельном процессе.
vite-plugin-checker не генерирует конфигурацию ESLint
автоматически. Причины:
Поэтому разработчик полностью контролирует команду запуска.
Типичная конфигурация:
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
}
})
Для Vue используется vue-tsc.
Конфигурация:
checker({
vueTsc: true
})
Single File Components содержат:
<script setup lang="ts">
const count: number = '10'
</script>
Обычный TypeScript-компилятор не анализирует
.vue-файлы.
vue-tsc использует инфраструктуру Vue compiler и
понимает:
checker({
vueTsc: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,vue}"'
}
})
Подключение:
checker({
stylelint: {
lintCommand: 'stylelint "./src/**/*.{css,scss}"'
}
})
checker({
stylelint: {
lintCommand: 'stylelint "./src/**/*.{scss}"'
}
})
Современные проекты всё чаще переходят на Biome вместо ESLint + Prettier.
Конфигурация:
checker({
biome: {
command: 'biome check ./src'
}
})
Высокопроизводительный линтер на Rust:
checker({
oxlint: {
command: 'oxlint ./src'
}
})
Плагин способен запускать сразу несколько независимых worker-процессов:
checker({
typescript: true,
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
},
stylelint: {
lintCommand: 'stylelint "./src/**/*.{css,scss}"'
}
})
Каждая проверка выполняется независимо.
Ключевая особенность vite-plugin-checker — вынесение
анализа в отдельные потоки.
Без checker:
Vite main thread
├─ transform
├─ HMR
└─ bundle
С checker:
Vite main thread
├─ transform
├─ HMR
└─ bundle
Checker worker
├─ TypeScript
├─ ESLint
└─ Stylelint
Благодаря этому HMR остаётся быстрым даже при тяжёлых проверках.
Иногда проверки не нужны в dev-режиме.
Настройка:
checker({
enableBuild: true,
typescript: true
})
Можно включить checker только для разработки:
checker({
typescript: process.env.NODE_ENV === 'development'
})
Многие шаблоны create-vite уже содержат TypeScript:
npm create vite@latest
Но полноценной проверки типов там нет.
После подключения checker:
checker({
typescript: true
})
проект начинает вести себя ближе к полноценному IDE-анализу.
Типичная конфигурация React + TypeScript:
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.
checker({
typescript: true
})
Плагин полезен даже без TypeScript:
checker({
eslint: {
lintCommand: 'eslint "./src/**/*.{js,jsx}"'
}
})
Структура:
apps/
packages/
Конфигурация:
checker({
typescript: {
tsconfigPath: './tsconfig.json'
},
eslint: {
lintCommand: 'eslint "./apps/**/*.{ts,tsx}"'
}
})
Основная философия Vite:
Полноценная проверка типов значительно замедляет dev-server.
Поэтому архитектура разделена:
| Задача | Инструмент |
|---|---|
| Трансформация | esbuild |
| Проверка типов | TypeScript |
| Линтинг | ESLint |
| Оркестрация | vite-plugin-checker |
При правильно настроенном checker:
Однако крупные TypeScript-монорепозитории всё равно могут создавать нагрузку на CPU.
Для ускорения рекомендуется уменьшать glob-маски:
Плохо:
eslint: {
lintCommand: 'eslint "./**/*"'
}
Лучше:
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
}
Для ESLint:
eslint: {
lintCommand: 'eslint "./src/**/*.{ts,tsx}" --cache'
}
Это значительно ускоряет повторные проверки.
Некоторые линтеры поддерживают инкрементальный режим.
Например:
eslint --cache
или:
biome check --changed
Cannot find tsconfig.json
Причина:
tsconfigPath: './configs/tsconfig.app.json'
при неверном пути.
Failed to run lint command
Причины:
Иногда возникают ошибки с glob:
lintCommand: 'eslint "./src/**/*.{ts,tsx}"'
Для Windows PowerShell может потребоваться:
lintCommand: 'eslint . --ext .ts,.tsx'
Некоторые плагины также используют browser overlay:
Возможны визуальные конфликты.
Решение:
overlay: false
Несмотря на dev-ориентированность, checker иногда применяется и в CI:
vite build
Если включён:
enableBuild: true
то ошибки типов остановят сборку.
Часто используется схема:
checker({
typescript: true
})
tsc --noEmit
eslint .
Такой подход даёт:
Плагин использует:
Изменение файла:
File changed
↓
Vite watcher
↓
checker worker
↓
TypeScript / ESLint
↓
overlay + terminal output
Наиболее эффективен плагин в проектах:
В небольших проектах checker иногда не нужен:
В таких случаях достаточно:
tsc --noEmit
или отдельных npm scripts.