Vite не выполняет полноценную проверку типов TypeScript во время
разработки. Основная задача Vite — максимально быстро преобразовывать
модули и обеспечивать мгновенную перезагрузку через HMR. Для
транспиляции TypeScript Vite использует esbuild, а не
компилятор TypeScript (tsc).
Из-за этого параметры compilerOptions в
tsconfig.json делятся на несколько категорий:
Пример базовой структуры:
{
"compilerOptions": {
"target": "ES2020",
"module": "ESNext",
"moduleResolution": "Bundler",
"strict": true
}
}
Одним из важнейших параметров для Vite является
module.
Типичная конфигурация:
{
"compilerOptions": {
"module": "ESNext"
}
}
Vite построен вокруг ESM-модулей (ECMAScript Modules). Dev Server работает через нативные ES-модули браузера.
Если указать:
{
"module": "CommonJS"
}
появятся проблемы:
import.meta;Наиболее безопасные варианты:
{
"module": "ESNext"
}
или:
{
"module": "NodeNext"
}
Однако для большинства Vite-проектов используется именно
ESNext.
target определяет, в какой стандарт JavaScript
компилируется TypeScript.
Пример:
{
"compilerOptions": {
"target": "ES2020"
}
}
Хотя Vite использует esbuild, параметр
target остаётся важным:
{
"target": "ES2015"
}
Подходит для старых браузеров, но ограничивает современные возможности JavaScript.
{
"target": "ES2020"
}
Наиболее популярный вариант для современных проектов.
{
"target": "ESNext"
}
Позволяет использовать максимально современный синтаксис.
Этот параметр особенно важен для Vite 5+.
Современная рекомендация:
{
"compilerOptions": {
"moduleResolution": "Bundler"
}
}
Bundler появился в новых версиях TypeScript специально
для современных сборщиков:
Он:
Пример:
{
"compilerOptions": {
"moduleResolution": "Bundler"
}
}
{
"moduleResolution": "Node"
}
Старый алгоритм Node.js.
Проблемы:
{
"moduleResolution": "Bundler"
}
Лучший выбор для Vite-проектов.
Позволяет импортировать .ts-файлы напрямую.
Пример:
{
"compilerOptions": {
"allowImportingTsExtensions": true
}
}
Тогда становится допустимо:
import { sum } from './math.ts'
Без этого параметра TypeScript выдаст ошибку.
Однако в большинстве Vite-проектов расширения TypeScript в импортах не используются.
Обычно применяется:
import { sum } from './math'
Для React-проектов параметр jsx имеет критическое
значение.
Пример:
{
"compilerOptions": {
"jsx": "react-jsx"
}
}
Современный React JSX Transform.
{
"jsx": "react-jsx"
}
Не требует:
import React from 'react'
Используется для development-сборок.
{
"jsx": "preserve"
}
JSX сохраняется без преобразования.
Иногда применяется в сложных конфигурациях сборки.
Используется при работе с альтернативными JSX-рантаймами.
Например, с Preact:
{
"compilerOptions": {
"jsx": "react-jsx",
"jsxImportSource": "preact"
}
}
Один из важнейших параметров TypeScript.
{
"compilerOptions": {
"strict": true
}
}
strict активирует:
Напрямую на Vite не влияет, но критически важен для качества проекта:
Очень важный параметр именно для Vite.
{
"compilerOptions": {
"isolatedModules": true
}
}
Vite использует esbuild, который компилирует файлы
независимо друг от друга.
isolatedModules заставляет TypeScript проверять
совместимость кода с таким режимом.
Например:
const enum Status {
Active,
Disabled
}
или:
namespace App {
}
могут вызывать проблемы.
Параметр помогает избежать ситуаций, когда:
Особенно важен для современных JavaScript-стандартов.
Пример:
{
"compilerOptions": {
"useDefineForClassFields": true
}
}
Старое поведение:
class User {
name = 'Alex'
}
компилировалось через присваивание в конструкторе.
Новое поведение использует стандарт ECMAScript.
Некоторые библиотеки:
могут вести себя по-разному в зависимости от этого параметра.
Определяет набор встроенных API JavaScript и браузера.
Пример:
{
"compilerOptions": {
"lib": ["ES2020", "DOM", "DOM.Iterable"]
}
}
Без DOM появятся ошибки:
document.querySelector()
window.addEventListener()
Без современных ES-библиотек будут отсутствовать типы:
Promise
Map
Set
WeakMap
Позволяет подключать глобальные типы.
Пример:
{
"compilerOptions": {
"types": ["vite/client"]
}
}
Без него TypeScript не понимает:
import.meta.env
и:
import.meta.hot
Property 'env' does not exist on type 'ImportMeta'
Решение:
{
"types": ["vite/client"]
}
Определяет базовую директорию для импортов.
Пример:
{
"compilerOptions": {
"baseUrl": "."
}
}
Один из самых популярных параметров.
Пример:
{
"compilerOptions": {
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}
}
Импорт:
import Button from '@/components/Button'
вместо:
import Button from '../. ./. ./components/Button'
TypeScript понимает alias только на уровне типов.
Vite тоже должен знать alias.
Поэтому требуется синхронизация:
import { defineConfig } from 'vite'
import path from 'path'
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
}
})
Очень распространённый параметр в Vite-проектах.
{
"compilerOptions": {
"noEmit": true
}
}
Vite сам занимается сборкой.
TypeScript нужен только для:
Поэтому генерация JS-файлов через tsc обычно не
требуется.
Популярная оптимизация больших проектов.
{
"compilerOptions": {
"skipLibCheck": true
}
}
Отключает проверку .d.ts файлов библиотек.
Ошибки внутри типов зависимостей могут остаться незамеченными.
Позволяет импортировать JSON как модуль.
{
"compilerOptions": {
"resolveJsonModule": true
}
}
Пример:
import config from './config.json'
Улучшает совместимость CommonJS и ES Modules.
Пример:
{
"compilerOptions": {
"esModuleInterop": true
}
}
Импорт:
import express from 'express'
может работать некорректно.
Приходится писать:
import * as express from 'express'
Похожий параметр:
{
"compilerOptions": {
"allowSyntheticDefaultImports": true
}
}
Разрешает default import даже там, где его формально нет.
Часто используется вместе с:
{
"esModuleInterop": true
}
Включает incremental compilation.
{
"compilerOptions": {
"incremental": true
}
}
TypeScript создаёт служебный файл:
.tsbuildinfo
tsc --noEmit.Используется в monorepo и project references.
{
"compilerOptions": {
"composite": true
}
}
Позволяет:
Генерация .d.ts файлов.
{
"compilerOptions": {
"declaration": true
}
}
Особенно актуален для:
Для обычного frontend-приложения Vite параметр часто не нужен.
Генерация только типов:
{
"compilerOptions": {
"emitDeclarationOnly": true
}
}
Используется при сборке библиотек.
Контролирует удаление импортов.
Пример:
{
"compilerOptions": {
"preserveValueImports": true
}
}
Некоторые импорты:
Параметр помогает избежать подобных конфликтов.
Современная альтернатива ряду старых параметров.
{
"compilerOptions": {
"verbatimModuleSyntax": true
}
}
TypeScript перестаёт модифицировать импорты и экспорты.
Это особенно хорошо сочетается с:
Критически важен для кроссплатформенной разработки.
{
"compilerOptions": {
"forceConsistentCasingInFileNames": true
}
}
Файл:
Button.tsx
Импорт:
import Button from './button'
На Windows это может работать.
На Linux сборка сломается.
Параметр предотвращает подобные ошибки.
Разрешает использовать JavaScript вместе с TypeScript.
{
"compilerOptions": {
"allowJs": true
}
}
Полезно при:
Включает проверку типов для JavaScript.
{
"compilerOptions": {
"checkJs": true
}
}
Теперь TypeScript анализирует:
// @ts-check
и обычные .js файлы.
{
"compilerOptions": {
"target": "ES2020",
"useDefineForClassFields": true,
"lib": ["ES2020", "DOM", "DOM.Iterable"],
"module": "ESNext",
"skipLibCheck": true,
"moduleResolution": "Bundler",
"allowImportingTsExtensions": true,
"resolveJsonModule": true,
"isolatedModules": true,
"moduleDetection": "force",
"noEmit": true,
"jsx": "react-jsx",
"strict": true,
"noUnusedLocals": true,
"noUnusedParameters": true,
"noFallthroughCasesInSwitch": true,
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
},
"types": ["vite/client"]
},
"include": ["src"]
}
Современный параметр TypeScript.
Пример:
{
"compilerOptions": {
"moduleDetection": "force"
}
}
TypeScript начинает считать все файлы модулями.
Это снижает вероятность конфликтов глобальной области видимости.
Особенно полезно в крупных Vite-приложениях.
Помогают поддерживать чистоту проекта.
{
"compilerOptions": {
"noUnusedLocals": true,
"noUnusedParameters": true
}
}
TypeScript обнаруживает:
Защищает от ошибок в switch.
{
"compilerOptions": {
"noFallthroughCasesInSwitch": true
}
}
switch (status) {
case 'loading':
startLoader()
case 'success':
showData()
}
Без break может возникнуть скрытая ошибка.
TypeScript предупредит об этом.
Некоторые параметры напрямую влияют на скорость разработки.
{
"skipLibCheck": true,
"incremental": true,
"noEmit": true
}
{
"checkJs": true
}
или чрезмерно строгие проверки в очень крупных monorepo.
Практически обязательными считаются:
{
"module": "ESNext",
"moduleResolution": "Bundler",
"target": "ES2020",
"isolatedModules": true,
"noEmit": true,
"types": ["vite/client"]
}
Для React дополнительно:
{
"jsx": "react-jsx"
}
Для удобной архитектуры:
{
"baseUrl": ".",
"paths": {
"@/*": ["src/*"]
}
}