Webpack 5: production-ориентированный webpack.config.js (2026)
Минимальный конфиг Webpack 5 для production-сборки: mode production, entry/output с contenthash, filesystem cache, resolve.extensions, базовая обработка JS/TS через babel-loader. Только официальный API, без устаревших опций.
Как использовать
- Скопировать в корень проекта как webpack.config.js. Установить: npm i -D webpack webpack-cli babel-loader @babel/core @babel/preset-env @babel/preset-typescript.
- Добавить .babelrc или babel.config.js с presets (preset-env, preset-typescript, при необходимости preset-react). Для CSS — css-loader + style-loader или mini-css-extract-plugin.
- Сборка: npm run build. Проверить dist и кэш в node_modules/.cache/webpack.
Нужен минимальный production-конфиг Webpack 5: минификация, contenthash для кэша, быстрые повторные сборки и корректный порядок разрешения расширений. Проблема: без mode production и filesystem cache прод-сборка тяжёлая и каждый раз «с нуля»; без contenthash в именах файлов кэш браузера неэффективен. Симптомы: долгий build, одинаковые имена чанков при каждом билде, путаница .ts/.js при импортах. Ниже — конфиг на официальном API (webpack.js.org/configuration): mode, output с contenthash, filesystem cache, resolve.extensions, babel-loader; проверка и когда Webpack оправдан.
Решение
Конфигурация использует только официальный API Webpack 5, без deprecated loaders и устаревших опций.
const path = require('node:path');
module.exports = {
mode: 'production',
entry: './src/index.js',
output: {
path: path.resolve(__dirname, 'dist'),
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].js',
clean: true,
},
cache: {
type: 'filesystem',
buildDependencies: {
config: [__filename],
},
},
resolve: {
extensions: ['.ts', '.tsx', '.js', '.jsx', '.json'],
},
module: {
rules: [
{
test: /\.[tj]sx?$/,
exclude: /node_modules/,
use: 'babel-loader',
},
],
},
};
- mode: ‘production’ — минификация (Terser), tree shaking. Без него прод-сборка тяжёлая.
- [contenthash] — хэш от содержимого; при неизменном коде имена не меняются, браузер кэширует. Чанки с dynamic import — в chunkFilename.
- cache.type: ‘filesystem’ — в production по умолчанию кэш выключен; без него каждый build полный. Filesystem сохраняет кэш в
node_modules/.cache/webpack; повторный build пересобирает только изменённые модули. В CI можно кэшировать эту директорию. - resolve.extensions — порядок важен: .ts/.tsx в начале, чтобы не подхватывать .js раньше TypeScript.
- Файл в корне как
webpack.config.js. Для CSS — правило сcss-loaderиstyle-loader(илиmini-css-extract-pluginдля prod).
Когда Webpack оправдан: крупный legacy на Webpack; Module Federation / микрофронты; жёсткие требования к чанкингу и пайплайну; команда уже на Webpack. Для новых проектов без этого часто разумнее Vite или Turbopack.
Проверка
-
Сборка — выполните
npm run build(скрипт в package.json:"build": "webpack"). Должна создаться папкаdistс файлами видаmain.[contenthash].js. Ошибок быть не должно. -
Contenthash — дважды соберите без изменений кода: имена файлов должны совпадать. Измените один файл и соберите снова — у изменённого чанка должен смениться хэш в имени.
-
Кэш — после первой сборки проверьте наличие
node_modules/.cache/webpack. Второй запуск build должен быть заметно быстрее (пересобираются только изменённые модули). При изменении конфига кэш инвалидируется за счётbuildDependencies.config. -
Расширения — импорт без расширения (например
import './utils') должен резолвиться в порядке extensions; для TypeScript убедитесь, что в проекте есть .babelrc или babel.config.js с preset-typescript (и при необходимости preset-react для JSX).
Типичные ошибки
- Без mode: ‘production’ — сборка не минифицируется, tree shaking слабее. Для прод всегда указывайте mode или передавайте его через CLI.
- Кэш не включён — в production по умолчанию кэш отключён. Без
cache: { type: 'filesystem' }каждый build полный; на больших проектах это минуты. Включите и при необходимости кэшируйтеnode_modules/.cache/webpackв CI. - DefinePlugin / process.env — в этом конфиге их нет; если в коде используется
process.env.NODE_ENV, добавьте DefinePlugin или при миграции на Vite см. Webpack → Vite. - CSS не обрабатывается — конфиг выше только JS/TS. Для стилей добавьте правило с
css-loaderиstyle-loader(dev) илиmini-css-extract-plugin(prod).
Где применять
- Legacy и существующие проекты на Webpack: обновление до Webpack 5, включение filesystem cache и contenthash. Продакшн-сборка и CI.
- Сравнение с Vite: для новых проектов см. Vite production-конфиг и миграция Webpack → Vite.
Связанные сниппеты: Vite: production-конфиг 2026, Миграция Webpack → Vite.