Перейти к содержимому

16. Миграция на Vite

Vite стал популярной альтернативой Webpack благодаря молниеносному dev-серверу и простой конфигурации. Однако миграция требует внимательного подхода — есть ряд нюансов и потенциальных проблем.

КритерийWebpackVite
Старт dev-сервера10-60+ сек< 1 сек
HMRСекундыМгновенно
КонфигурацияСложнаяПростая
Build (production)Webpack bundlerRollup
Module Federation✅ Native❌ Плагин (ограниченный)
Legacy browsersWebpack + Babel@vitejs/plugin-legacy
Кастомные лоадерыТолько Rollup плагины
Размер бандлаСхожийСхожий

Когда НЕ мигрировать:

  • Проект использует Module Federation
  • Сложные кастомные Webpack лоадеры без аналогов
  • Большой enterprise проект с устоявшейся инфраструктурой
  • Интеграция с SSR (Next.js, Remix — у них свои системы сборки)
Окно терминала
npm install --save-dev vite @vitejs/plugin-react
# или для TypeScript
npm install --save-dev vite @vitejs/plugin-react typescript
import { defineConfig } from 'vite';
import react from '@vitejs/plugin-react';
import path from 'path';
export default defineConfig({
plugins: [react()],
// Эквивалент resolve.alias
resolve: {
alias: {
'@': path.resolve(__dirname, 'src'),
},
},
// Эквивалент devServer
server: {
port: 3000,
proxy: {
'/api': { target: 'http://localhost:8080', changeOrigin: true },
},
},
// Эквивалент output
build: {
outDir: 'dist',
sourcemap: true,
rollupOptions: {
output: {
manualChunks: {
'react-vendor': ['react', 'react-dom'],
'router': ['react-router-dom'],
},
},
},
},
// Эквивалент DefinePlugin
define: {
'process.env.NODE_ENV': JSON.stringify(process.env.NODE_ENV),
},
});
# Webpack
process.env.REACT_APP_API_URL
# Vite — только переменные с префиксом VITE_!
import.meta.env.VITE_API_URL

Если много переменных REACT_APP_*, используйте vite-plugin-env-compatible:

Окно терминала
npm install --save-dev vite-plugin-env-compatible
public/index.html
<div id="root"></div>
<!-- Webpack вставляет <script> автоматически -->
<!-- Vite: index.html в корне проекта -->
<div id="root"></div>
<!-- Явный <script> обязателен! -->
<script type="module" src="/src/index.tsx"></script>
// Webpack
new webpack.DefinePlugin({ 'process.env.NODE_ENV': JSON.stringify('production') })
// Vite
define: { 'process.env.NODE_ENV': JSON.stringify('production') }
// Webpack: нужен плагин
new HtmlWebpackPlugin({ template: './public/index.html' })
// Vite: не нужен, index.html в корне — автоматически
Окно терминала
npm install --save-dev vite-plugin-static-copy
import { viteStaticCopy } from 'vite-plugin-static-copy';
plugins: [
react(),
viteStaticCopy({ targets: [{ src: 'public/robots.txt', dest: '' }] }),
]
{
"scripts": {
"dev": "vite",
"build": "vite build",
"preview": "vite preview",
"typecheck": "tsc --noEmit"
}
}
// ❌ Webpack поддерживал require() в компонентах
const img = require('./logo.png');
// ✅ Vite: только ES imports
import img from './logo.png';

Некоторые npm пакеты используют только CommonJS. Vite обычно справляется автоматически через @rollup/plugin-commonjs, но иногда нужен optimizeDeps:

optimizeDeps: {
include: ['some-cjs-package'],
}
// ❌ Webpack require.context
const modules = require.context('./modules', true, /\\.ts$/);
// ✅ Vite: import.meta.glob
const modules = import.meta.glob('./modules/**/*.ts');

Ниже — интерактивный чеклист миграции с Webpack на Vite.