Параметр optimization.minimize управляет включением
процесса минификации выходного JavaScript-кода в Webpack. Он определяет,
будет ли итоговый бандл подвергаться сжатию, удалению неиспользуемого
кода, упрощению выражений и другим трансформациями, направленным на
уменьшение размера выходных файлов.
В Webpack 5 значение optimization.minimize по умолчанию
зависит от режима сборки:
mode: "production" → minimize: truemode: "development" → minimize: falseМинификация выполняется на этапе оптимизации, после завершения построения графа модулей и объединения чанков.
При включённой минификации Webpack подключает стандартный минимизатор
JavaScript — TerserWebpackPlugin. Это означает, что даже
без явной настройки оптимизаторов происходит:
Пример конфигурации:
module.exports = {
mode: "production",
optimization: {
minimize: true
}
};
При этом явное указание minimize: true обычно избыточно
в production-режиме, но используется при кастомных конфигурациях, где
режим не определяет поведение оптимизации.
Минификация влияет не только на размер итогового файла, но и на поведение процесса сборки:
Особенно заметно это при использовании source maps, где требуется синхронизация исходного и минифицированного кода.
Параметр optimization.minimizer определяет список
плагинов, используемых для минимизации выходных ресурсов. В отличие от
minimize, который является булевым переключателем,
minimizer позволяет полностью контролировать механизм
сжатия.
Если optimization.minimizer не задан, Webpack 5
автоматически применяет:
TerserWebpackPlugin для JavaScriptОднако при явном указании minimizer дефолтные плагины
перестают применяться автоматически, если их не включить вручную.
Пример:
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin()
]
}
};
TerserWebpackPlugin является основным инструментом для
сжатия JavaScript. Он использует Terser — высокоуровневый компрессор
ECMAScript.
Пример расширенной настройки:
const TerserPlugin = require("terser-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin({
terserOptions: {
compress: {
drop_console: true,
drop_debugger: true
},
mangle: true
}
})
]
}
};
Для ускорения сборки используется многопоточность:
new TerserPlugin({
parallel: true
})
Параллельная обработка особенно эффективна при больших проектах с множеством чанков.
Webpack не ограничивает minimizer только JavaScript.
Часто туда добавляется CSS-минификатор, например
css-minimizer-webpack-plugin.
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new CssMinimizerPlugin()
]
}
};
При такой конфигурации важно учитывать, что стандартный JS-минификатор перестаёт применяться автоматически, если он не добавлен в список явно.
Корректная комбинированная настройка:
const TerserPlugin = require("terser-webpack-plugin");
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
module.exports = {
optimization: {
minimize: true,
minimizer: [
new TerserPlugin(),
new CssMinimizerPlugin()
]
}
};
Эти два параметра работают совместно, но выполняют разные функции:
minimize — включает или отключает сам процесс
оптимизацииminimizer — определяет инструменты выполнения этой
оптимизацииminimize: false → minimizer
игнорируетсяminimize: true и minimizer не задан →
используются дефолтные плагиныminimizer задан → используется только он (или он +
явно добавленные дефолтные)Полное управление минификацией требуется в случаях:
const CssMinimizerPlugin = require("css-minimizer-webpack-plugin");
const ESBuildMinifyPlugin = require("esbuild-loader").ESBuildMinifyPlugin;
module.exports = {
optimization: {
minimize: true,
minimizer: [
new ESBuildMinifyPlugin({
target: "es2015"
}),
new CssMinimizerPlugin()
]
}
};
В этом случае ESBuild заменяет Terser как более быстрый минимизатор.
Минификация тесно связана с генерацией source maps. При включённых source maps:
module.exports = {
devtool: "source-map",
optimization: {
minimize: true
}
};
Terser генерирует сопоставления между оригинальным и сжатым кодом, что влияет на:
Некоторые настройки Terser позволяют управлять качеством source maps:
new TerserPlugin({
sourceMap: true
})
Минификация — один из самых дорогих этапов сборки. Основные факторы влияния:
Типичные узкие места:
Оптимизация времени сборки достигается через:
parallelcompressWebpack и плагины минификации поддерживают кеширование:
new TerserPlugin({
cache: true,
parallel: true
})
Кеширование позволяет повторно использовать результаты минификации при неизменённом входном коде, что существенно ускоряет incremental builds.
Порядок в minimizer имеет значение. Каждый плагин
обрабатывает свой тип ресурсов, но в сложных конфигурациях возможны
пересечения.
Пример последовательной обработки:
minimizer: [
new TerserPlugin(),
new CssMinimizerPlugin()
]
Расширенные сценарии могут включать условное включение:
minimizer: [
...(isProd ? [new TerserPlugin()] : []),
new CssMinimizerPlugin()
]
При использовании code splitting минификация применяется ко всем чанкам независимо от их типа:
Это важно учитывать при оптимизации загрузки, так как каждый дополнительный чанк увеличивает стоимость минификации.
Помимо Terser, часто применяются:
esbuild-loader (ESBuildMinifyPlugin)swc-minify-webpack-pluginbabel-minify (устаревший вариант)Каждый из них имеет свои особенности:
optimization.minimize и
optimization.minimizer формируют ядро системы постобработки
бандла Webpack. Их взаимодействие определяет:
Грамотная конфигурация минимизаторов становится частью общей архитектуры билда, влияя на поведение как development, так и production окружений.