В Webpack режим сборки определяется через параметр mode,
который влияет на внутренние оптимизации, поведение плагинов и итоговую
структуру бандла. Значения:
development — режим разработкиproduction — режим продакшенаnone — отключение предустановленных оптимизацийРежим не просто переключатель, а набор преднастроенных конфигураций, которые затрагивают компиляцию, минификацию, генерацию source maps и стратегию кэширования.
module.exports = {
mode: 'development'
};
или
module.exports = {
mode: 'production'
};
При выборе mode Webpack автоматически меняет множество
параметров без явного указания:
В production используется встроенный TerserPlugin (в
Webpack 5 он подключается автоматически):
Дополнительно:
CssMinimizerPluginoptimization: {
minimize: true
}
Минификация отключена:
Это снижает скорость сборки, но ускоряет цикл разработки за счёт уменьшения времени трансформации AST.
Используются быстрые и точные карты исходников:
devtool: 'eval-source-map'
или
devtool: 'cheap-module-source-map'
Особенности:
Source maps либо отключаются, либо упрощаются:
devtool: 'source-map'
или полностью:
devtool: false
Причины:
Включается стабильная система именования:
optimization: {
moduleIds: 'deterministic',
chunkIds: 'deterministic'
}
Результат:
Используются читаемые имена:
src_components_Button_jsnode_modules_react_index_jsЭто упрощает диагностику ошибок и анализ графа зависимостей.
Tree shaking активен преимущественно в production-режиме.
Условия:
import/export)sideEffects: false или корректная настройка в
package.json{
"sideEffects": false
}
Tree shaking может быть частично отключён или менее агрессивен, чтобы сохранить предсказуемость модулей и ускорить сборку.
Активируются механизмы долгосрочного кэширования:
output: {
filename: '[name].[contenthash].js'
}
Особенности:
contenthash зависит от содержимого файлаДополнительно:
optimization: {
runtimeChunk: 'single',
splitChunks: {
chunks: 'all'
}
}
Обычно используется упрощённое именование:
filename: '[name].js'
Причины:
Используется webpack-dev-server:
devServer: {
hot: true,
open: true
}
HMR позволяет обновлять модули без полной перезагрузки страницы, сохраняя состояние приложения.
DevServer полностью отключён:
Webpack часто используется совместно с DefinePlugin:
new webpack.DefinePlugin({
'process.env.NODE_ENV': JSON.stringify('production')
});
process.env.NODE_ENV === 'production''process.env.NODE_ENV': JSON.stringify('development')
stats: 'errors-only'
Приоритет:
Используются:
Приоритет:
Используются:
Активное разбиение:
splitChunks: {
chunks: 'all',
minSize: 20000
}
Цель — уменьшение повторного кода и улучшение загрузки через кэш.
Разбиение упрощается:
Некоторые loader’ы и плагины меняют поведение в зависимости от
mode:
MiniCssExtractPlugin)style-loaderProduction-режим активнее учитывает:
{
"sideEffects": false
}
Webpack может:
Разделение режимов формирует два принципиально разных подхода к сборке:
Webpack в обоих случаях использует один и тот же граф зависимостей, но применяет разные стратегии трансформации, оптимизации и упаковки результата.