mode: ‘production’ в Webpack задаёт предустановленный набор оптимизаций, ориентированных на минимальный размер бандла и максимальную производительность выполнения в браузере. При активации этого режима Webpack автоматически включает ряд внутренних механизмов, которые в режиме разработки либо отключены, либо работают в упрощённом виде.
Ключевое отличие production-режима заключается в том, что он переводит всю цепочку сборки из «удобной для отладки» в «оптимизированную для доставки». Это влияет не только на итоговый JavaScript, но и на поведение загрузчика модулей, стратегию генерации идентификаторов, работу плагинов и уровень агрессивности оптимизаций.
При установке:
module.exports = {
mode: 'production'
};
Webpack автоматически включает:
Эти настройки эквивалентны частичному ручному конфигу:
module.exports = {
optimization: {
minimize: true,
sideEffects: true,
usedExports: true,
concatenateModules: true,
moduleIds: 'deterministic',
chunkIds: 'deterministic',
splitChunks: {
chunks: 'all'
},
runtimeChunk: 'single'
}
};
Основной механизм сжатия кода в production-режиме — использование Terser.
Webpack применяет TerserPlugin, который выполняет:
Пример трансформации:
До:
function sum(a, b) {
return a + b;
}
export default sum;
После:
function n(n,r){return n+r}export default n;
Минификация работает не только на уровне синтаксиса, но и на уровне AST (Abstract Syntax Tree), что позволяет выполнять глубокие преобразования.
Дополнительно может использоваться:
optimization: {
minimize: true,
minimizer: [
`...`
]
}
где ... означает сохранение стандартного TerserPlugin с
возможностью добавления CSS оптимизаторов.
В production-сборках CSS также подвергается оптимизации:
Чаще всего используется CssMinimizerPlugin:
const CssMinimizerPlugin = require('css-minimizer-webpack-plugin');
optimization: {
minimizer: [
new CssMinimizerPlugin()
]
}
CSS оптимизация особенно важна в проектах с большим количеством компонентов, где повторяющиеся стили могут существенно увеличивать размер бандла.
Tree shaking — процесс удаления неиспользуемого кода на этапе сборки.
Он работает только при соблюдении условий:
optimization.usedExportsWebpack анализирует граф зависимостей и определяет, какие экспорты реально используются.
Пример:
export function a() {}
export function b() {}
Если используется только a, функция b
исключается из итогового бандла.
Важно, что tree shaking зависит от статичности структуры кода. Любые динамические конструкции снижают эффективность:
const mod = require(someVar);
Файл package.json может содержать поле:
{
"sideEffects": false
}
Это сигнал Webpack о том, что модули не имеют побочных эффектов и могут быть безопасно удалены при tree shaking.
Если есть файлы с побочными эффектами:
{
"sideEffects": [
"*.css",
"./src/polyfills.js"
]
}
Webpack не удаляет такие модули, даже если их экспорт не используется.
Это критически важно для корректной работы production-оптимизаций, поскольку агрессивное удаление может сломать инициализацию приложения.
Production-режим почти всегда подразумевает использование разделения кода.
Webpack автоматически выделяет:
Настройка:
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendors: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
priority: -10
}
}
}
}
Динамический импорт:
import('./module').then(m => m.default());
приводит к созданию отдельного чанка, который загружается только при необходимости.
Это снижает начальный размер бандла и ускоряет first paint.
Webpack runtime — это небольшая часть кода, управляющая загрузкой модулей.
В production часто включают:
runtimeChunk: 'single'
Это позволяет:
При изменении логики приложения не меняется runtime-блок, что позволяет CDN и браузеру повторно использовать закэшированные файлы.
Production-режим включает детерминированные идентификаторы:
moduleIds: 'deterministic',
chunkIds: 'deterministic'
Это означает:
Без этого режима даже небольшое изменение может приводить к пересборке большого числа файлов.
Webpack включает ModuleConcatenationPlugin, который
объединяет модули в одну область видимости.
Это снижает:
Пример эффекта:
До:
module1();
module2();
Каждый модуль в собственной функции.
После:
function module1() {}
function module2() {}
module1();
module2();
Это уменьшает overhead и ускоряет выполнение в браузере.
Production-режим использует contenthash:
output: {
filename: '[name].[contenthash].js'
}
Это обеспечивает:
Дополнительно применяются:
Production автоматически исключает:
При этом можно явно управлять source maps:
devtool: 'source-map'
или полностью отключать:
devtool: false
Source maps в production применяются осторожно, так как они увеличивают размер и могут раскрывать исходный код.
Webpack может выводить предупреждения о размере бандла:
performance: {
hints: 'warning',
maxEntrypointSize: 512000,
maxAssetSize: 512000
}
Production-режим активирует эти проверки, чтобы сигнализировать о деградации сборки.
Современные production-сборки учитывают поведение сети:
Webpack поддерживает:
import(/* webpackPrefetch: true */ './module');
import(/* webpackPreload: true */ './critical-module');
Это позволяет управлять порядком загрузки ресурсов без ручного контроля сети.
Хотя Webpack не всегда отвечает за серверное сжатие, в production часто интегрируются плагины:
Пример:
const CompressionPlugin = require('compression-webpack-plugin');
Это уменьшает размер передачи по сети, особенно для JS и CSS.
Типичная production-конфигурация Webpack представляет собой совокупность слоёв:
В результате формируется сборка, ориентированная не на удобство разработки, а на предсказуемую, быструю и стабильную работу в браузерной среде с минимальными затратами ресурсов.