Конфигурация в Vite представляет собой центральную точку управления поведением dev-сервера, сборки, плагинов, путей, переменных окружения и интеграций. Несмотря на минималистичный подход Vite, конфигурационный файл способен управлять практически всеми аспектами процесса разработки и production-сборки.
По умолчанию Vite автоматически ищет файл:
vite.config.js
Также поддерживаются варианты:
vite.config.mjs
vite.config.cjs
vite.config.ts
vite.config.mts
vite.config.cts
Наиболее распространённым вариантом в современных проектах является:
vite.config.ts
Использование TypeScript даёт:
Минимальный пример:
import { defineConfig } from 'vite'
export default defineConfig({
})
Конфигурация экспортируется как объект.
Функция defineConfig() необязательна, однако она
значительно улучшает поддержку типов и работу редактора.
Без неё:
export default {
server: {
port: 3000
}
}
С ней:
import { defineConfig } from 'vite'
export default defineConfig({
server: {
port: 3000
}
})
Функция defineConfig() не изменяет конфигурацию
логически. Она служит типизированной оболочкой.
Основные преимущества:
IDE начинает понимать структуру Vite API:
defineConfig({
build: {
sourcemap: true
}
})
Редактор показывает:
Ошибка:
defineConfig({
servr: {
port: 3000
}
})
IDE сразу покажет:
Property 'servr' does not exist
При большом количестве настроек типизация особенно полезна:
defineConfig({
resolve: {
alias: {
'@': '/src'
}
},
build: {
chunkSizeWarningLimit: 1000
},
server: {
strictPort: true
}
})
Vite поддерживает несколько вариантов экспорта.
export default defineConfig({
server: {
port: 5173
}
})
Это наиболее простой вариант.
Конфигурация может экспортироваться как функция:
export default defineConfig(() => {
return {
server: {
port: 3000
}
}
})
Подобный подход используется при:
Vite поддерживает async-конфигурации:
export default defineConfig(async () => {
const data = await loadSomething()
return {
define: {
DATA: JSON.stringify(data)
}
}
})
Если экспортируется функция, Vite передаёт специальный объект:
export default defineConfig(({ command, mode, isSsrBuild }) => {
console.log(command)
console.log(mode)
return {}
})
Показывает тип запуска:
command === 'serve'
или:
command === 'build'
Пример:
export default defineConfig(({ command }) => {
if (command === 'serve') {
return {
server: {
port: 3000
}
}
}
return {
build: {
minify: 'esbuild'
}
}
})
Определяет текущий режим:
vite --mode development
vite --mode production
vite --mode staging
Пример:
export default defineConfig(({ mode }) => {
if (mode === 'staging') {
return {
base: '/staging/'
}
}
return {}
})
Используется при SSR-сборке:
export default defineConfig(({ isSsrBuild }) => {
return {
build: {
sourcemap: isSsrBuild
}
}
})
// vite.config.js
import { defineConfig } from 'vite'
export default defineConfig({
})
// vite.config.ts
import { defineConfig } from 'vite'
export default defineConfig({
})
Наиболее рекомендуемый формат.
// vite.config.mjs
import { defineConfig } from 'vite'
export default defineConfig({
})
// vite.config.cjs
const { defineConfig } = require('vite')
module.exports = defineConfig({
})
Vite ищет конфигурацию в следующем порядке:
--configvite.config.tsvite.config.mtsvite.config.jsvite.config.mjsvite.config.cjsvite.config.ctsМожно явно указать файл:
vite --config configs/vite.dev.js
Production:
vite build --config configs/vite.prod.js
Управляет dev-сервером.
export default defineConfig({
server: {
port: 3000
}
})
По умолчанию Vite доступен только локально.
Для доступа из сети:
server: {
host: true
}
или:
server: {
host: '0.0.0.0'
}
Если порт занят, Vite автоматически ищет следующий.
Запрет автоматической смены:
server: {
port: 3000,
strictPort: true
}
Теперь Vite завершится ошибкой.
Автоматическое открытие браузера:
server: {
open: true
}
Можно указать путь:
server: {
open: '/admin'
}
Включение HTTPS:
server: {
https: true
}
Настройка сертификатов:
import fs from 'fs'
export default defineConfig({
server: {
https: {
key: fs.readFileSync('./ssl/key.pem'),
cert: fs.readFileSync('./ssl/cert.pem')
}
}
})
Проксирование API:
server: {
proxy: {
'/api': {
target: 'http://localhost:8000',
changeOrigin: true
}
}
}
Запрос:
/api/users
будет перенаправлен на:
http://localhost:8000/api/users
server: {
proxy: {
'/api': {
target: 'http://localhost:8000',
rewrite: path => path.replace(/^\/api/, '')
}
}
}
Теперь:
/api/users
станет:
/users
Управляет разрешением модулей.
Самая популярная настройка.
Без alias:
import Button from '../. ./. ./components/Button'
С alias:
import Button from '@/components/Button'
Конфигурация:
import path from 'path'
export default defineConfig({
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
}
})
Устранение дублирования пакетов:
resolve: {
dedupe: ['react']
}
Особенно важно при monorepo.
Список автоматически разрешаемых расширений:
resolve: {
extensions: ['.js', '.ts', '.jsx', '.tsx']
}
Настройки production-сборки.
Папка результата:
build: {
outDir: 'dist'
}
Каталог ассетов:
build: {
assetsDir: 'assets'
}
Генерация source map:
build: {
sourcemap: true
}
Варианты:
sourcemap: true
sourcemap: false
sourcemap: 'inline'
sourcemap: 'hidden'
Минификация:
build: {
minify: 'esbuild'
}
или:
build: {
minify: 'terser'
}
Отключение:
build: {
minify: false
}
Целевые браузеры:
build: {
target: 'es2018'
}
Разделение CSS:
build: {
cssCodeSplit: true
}
Лимит inline-файлов:
build: {
assetsInlineLimit: 4096
}
Маленькие файлы будут превращены в base64.
Лимит предупреждения:
build: {
chunkSizeWarningLimit: 1000
}
Vite использует Rollup для production-сборки.
build: {
rollupOptions: {
output: {
manualChunks: {
vendor: ['react']
}
}
}
}
Ручное разделение чанков:
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
rollupOptions: {
output: {
entryFileNames: 'js/[name].js',
chunkFileNames: 'js/[name].js',
assetFileNames: 'assets/[name].[ext]'
}
}
Настройки CSS-обработки.
css: {
modules: {
scopeBehaviour: 'local'
}
}
SCSS:
css: {
preprocessorOptions: {
scss: {
additionalData: `
@import "./src/styles/variables.scss";
`
}
}
}
Source map для CSS в dev-режиме:
css: {
devSourcemap: true
}
Глобальные compile-time константы.
define: {
__APP_VERSION__: JSON.stringify('1.0.0')
}
Использование:
console.log(__APP_VERSION__)
Каталог статических файлов:
publicDir: 'public'
Файл:
public/logo.png
будет доступен:
/ logo.png
Базовый URL приложения.
base: '/'
base: '/admin/'
Теперь ресурсы:
<script src="/admin/assets/app.js">
base: 'https://cdn.example.com/'
Система плагинов — одна из важнейших частей Vite.
import vue from '@vitejs/plugin-vue'
export default defineConfig({
plugins: [vue()]
})
plugins: [
vue(),
legacy(),
eslint()
]
plugins: [
mode === 'development' && inspect()
].filter(Boolean)
Функция загрузки env-переменных.
import { defineConfig, loadEnv } from 'vite'
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd())
return {
define: {
__API_URL__: JSON.stringify(env.VITE_API_URL)
}
}
})
.env
.env.local
.env.development
.env.production
Клиенту доступны только:
VITE_API_URL=
Не будут доступны:
SECRET_KEY=
console.log(import.meta.env.VITE_API_URL)
Настройки предварительной оптимизации зависимостей.
Принудительная оптимизация:
optimizeDeps: {
include: ['lodash']
}
Исключение:
optimizeDeps: {
exclude: ['large-library']
}
ssr: {
noExternal: ['some-package']
}
ssr: {
external: ['package-name']
}
worker: {
format: 'es'
}
logLevel: 'info'
Варианты:
info
warn
error
silent
clearScreen: false
Изменение каталога env-файлов:
envDir: './env'
Папка кеша:
cacheDir: 'node_modules/.vite'
Тип приложения:
appType: 'spa'
Варианты:
spa
mpa
custom
import { defineConfig, loadEnv } from 'vite'
import vue from '@vitejs/plugin-vue'
import path from 'path'
export default defineConfig(({ mode }) => {
const env = loadEnv(mode, process.cwd())
const isProd = mode === 'production'
return {
plugins: [
vue()
],
resolve: {
alias: {
'@': path.resolve(__dirname, './src')
}
},
server: {
host: true,
port: 3000,
strictPort: true
},
define: {
__API_URL__: JSON.stringify(env.VITE_API_URL)
},
build: {
sourcemap: !isProd,
minify: 'esbuild',
target: 'es2018',
rollupOptions: {
output: {
manualChunks(id) {
if (id.includes('node_modules')) {
return 'vendor'
}
}
}
}
}
}
})