Гайды
Webpack и Vite: сборка фронтенда
Entry и code splitting, конфиг Vite, переменные окружения, tree-shaking и анализ бандла.
~9 мин чтения
Webpack и Vite: сборка фронтенда
Webpack — гибкий бандлер с loaders и plugins (много конфигурации). Vite — dev-сервер на native ESM + esbuild для трансформации, продакшен-сборка через Rollup; быстрый старт для SPA/SSR (Vue/React). TypeScript — строгая типизация.
1. Webpack: ключевые идеи
Entry → граф зависимостей → chunks, code splitting (import()), asset modules. Плагины: HtmlWebpackPlugin, MiniCssExtractPlugin, DefinePlugin.
2. Vite: конфиг минимален
vite.config.ts: aliases, proxy к API в dev, SSR options для фреймворков.
3. Env переменные
VITE_* префикс для клиента в Vite; не класть секреты. Webpack — DefinePlugin / EnvironmentPlugin.
4. Производительность
Source maps для prod — осторожно (размер, утечки). Tree-shaking требует ESM sideEffects в package.json у библиотек.
5. Webpack: dev vs prod
mode: 'development' даёт быстрые source maps и мягче минификация; production — минификация, scope hoisting, splitChunks для vendor. cache: { type: 'filesystem' } ускоряет повторные сборки на CI при сохранении кэша между job'ами.
6. Vite: плагины и SSR
@vitejs/plugin-react / vue подключают HMR. Для SSR фреймворка используйте официальный шаблон (create-vite, Next/Nuxt) — ручная склейка entry для сервера и клиента быстро усложняется. ssr.noExternal — когда зависимость должна бандлиться для SSR, а не резолвиться из node_modules как есть.
7. Совместимость и полифиллы
Browserslist в package.json определяет целевые браузеры для @babel/preset-env и autoprefixer. Vite по умолчанию таргетит современные браузеры; для legacy добавляют @vitejs/plugin-legacy с отдельным чанком и nomodule.
8. Экосистема: Turbopack, Rspack, Vitest
Next.js может собирать dev через Turbopack (Rust) — быстрее холодный старт на огромных графах. Rspack — webpack-совместимый бандлер на Rust для проектов, где миграция на чистый Vite дорога. Vitest использует тот же pipeline трансформаций, что и Vite — тесты ближе к прод-сборке без дублирования конфига.
9. Монорепозитории
pnpm workspaces + workspace:* зависимости уменьшают диск и ускоряют CI. В Webpack настраивайте resolve.alias на локальные пакеты; в Vite — optimizeDeps.include для пакетов из packages/ui, иначе pre-bundle не увидит исходники.
10. Чек-лист
- Bundle analyzer периодически.
- Кэш CI для
node_modules/ pnpm store. - Версионирование файлов (
[contenthash]) для кэша CDN. - Compression (brotli/gzip) на CDN или reverse proxy.
- Разделение runtime и vendor чанков для кэш-инвалидации при обновлении приложения.
Дальше: CI/CD