Режим разработки в Webpack ориентирован на максимальную скорость сборки, удобство отладки и быстрое обновление приложения при изменениях кода. В этом режиме приоритет отдаётся не размеру бандла и не оптимизации, а скорости пересборки и информативности ошибок.
mode: "development"Базовая настройка, которая активирует ряд внутренних оптимизаций:
module.exports = {
mode: "development"
};
devtool для разработкиКлючевой параметр, влияющий на качество отладки.
Наиболее часто используемые значения:
eval-source-map
eval-cheap-module-source-map
module.exports = {
devtool: "eval-source-map"
};
Выбор зависит от размера проекта:
eval-source-mapeval-cheap-module-source-mapdevServer
как основной инструмент разработкиWebpack Dev Server обеспечивает горячую перезагрузку и работу без ручного пересборки.
Рекомендуемая конфигурация:
devServer: {
hot: true,
open: true,
port: 3000,
historyApiFallback: true,
compress: false,
client: {
overlay: true
}
}
Ключевые параметры:
hot: true — включение HMRhistoryApiFallback — важно для SPA (React, Vue)overlay — отображение ошибок прямо в браузереcompress: false — ускорение сборкиВ режиме разработки важно отключить всё, что замедляет пересборку:
optimization: {
minimize: false,
removeAvailableModules: false,
removeEmptyChunks: false,
splitChunks: false
}
Причина:
production и рекомендуемые настройкиProduction режим ориентирован на минимальный размер бандла, высокую производительность и отсутствие лишнего кода.
mode: "production"module.exports = {
mode: "production"
};
Этот режим автоматически включает:
Webpack по умолчанию использует TerserPlugin для JS:
optimization: {
minimize: true
}
Дополнительные настройки:
const TerserPlugin = require("terser-webpack-plugin");
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true
}
}
})
]
}
Удаление console.log и отладочного кода существенно
уменьшает размер итогового бандла.
devtool в productionВ production важно либо отключить source maps, либо использовать безопасные варианты.
Рекомендуемые значения:
source-map
hidden-source-map
module.exports = {
devtool: "source-map"
};
Для публичных приложений часто используют:
devtool: "hidden-source-map"
Production режим обязательно должен включать разделение чанков:
optimization: {
splitChunks: {
chunks: "all",
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: "vendors",
chunks: "all"
}
}
}
}
Эффект:
Tree shaking работает только в production при использовании ES Modules.
Ключевые условия:
mode: "production"sideEffects: false или корректно настроенный флаг в
package.jsonimport/export, а не CommonJS{
"sideEffects": false
}
performance: {
hints: "warning",
maxAssetSize: 250000,
maxEntrypointSize: 250000
}
В production это помогает контролировать размер бандла.
В development часто отключают:
performance: false
Для ускорения загрузки и повторного использования ресурсов:
output: {
filename: "[name].[contenthash].js",
clean: true
}
Использование:
[contenthash] — кеширование файловclean: true — удаление старых сборокeval-source-map)source-map,
hidden-source-map)Часто используется единый конфиг:
module.exports = (env, argv) => {
const isProd = argv.mode === "production";
return {
mode: isProd ? "production" : "development",
devtool: isProd ? "source-map" : "eval-source-map",
optimization: {
minimize: isProd
}
};
};
Такой подход позволяет:
В development:
В production:
Некоторые плагины ведут себя по-разному:
process.env.NODE_ENVnew webpack.DefinePlugin({
"process.env.NODE_ENV": JSON.stringify(process.env.NODE_ENV)
});
Типичный подход — разделение конфигов:
webpack.common.jswebpack.dev.jswebpack.prod.jsЭто позволяет: