CompressionPlugin используется для создания предварительно сжатых версий ассетов на этапе сборки Webpack. Основная задача плагина заключается в генерации файлов сжатых алгоритмами gzip и brotli, которые затем могут быть использованы сервером для ускоренной доставки контента. Такой подход уменьшает объем передаваемых данных без необходимости сжатия на лету, снижая нагрузку на CPU сервера и ускоряя загрузку страниц.
Сжатие ассетов происходит после того, как Webpack сформировал итоговые бандлы. CompressionPlugin анализирует выходные файлы и создает их копии с применением выбранного алгоритма. Результатом становятся дополнительные файлы рядом с исходными:
Дальнейшая ответственность за выбор нужной версии файла ложится на
веб-сервер, который ориентируется на заголовки
Accept-Encoding от клиента.
Gzip основан на комбинации алгоритмов DEFLATE, использующих LZ77 и кодирование Хаффмана. Он поддерживается всеми браузерами и является стандартом де-факто для HTTP-сжатия.
При использовании gzip достигается:
В контексте CompressionPlugin gzip применяется как базовый уровень оптимизации, обеспечивающий совместимость даже со старыми клиентами.
Конфигурация Webpack включает подключение плагина и указание алгоритма через модуль zlib:
const CompressionPlugin = require("compression-webpack-plugin");
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: "gzip",
test: /\.(js|css|html|svg)$/,
threshold: 10240,
minRatio: 0.8
})
]
};
Параметр algorithm: "gzip" активирует использование
стандартного gzip-сжатия. Значение threshold определяет
минимальный размер файла, начиная с которого применяется сжатие.
Параметр minRatio задает минимальную степень выигрыша по
размеру, при которой создается сжатая версия.
Brotli разработан Google и обеспечивает более высокую степень сжатия по сравнению с gzip при сопоставимой или лучшей скорости декомпрессии на стороне клиента. Он особенно эффективен для текстовых ресурсов: JavaScript, CSS, HTML и JSON.
Особенности Brotli:
Brotli использует словарь предсказаний и контекстно-зависимое кодирование, что делает его эффективным для повторяющихся структур в веб-ресурсах.
Для использования Brotli необходимо указать алгоритм
brotliCompress, предоставляемый Node.js через модуль
zlib:
const CompressionPlugin = require("compression-webpack-plugin");
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: "brotliCompress",
test: /\.(js|css|html|svg)$/,
compressionOptions: {
level: 11
},
threshold: 10240,
minRatio: 0.8,
filename: "[path][base].br"
})
]
};
Параметр compressionOptions.level управляет степенью
сжатия. Значение 11 соответствует максимальному уровню, обеспечивающему
наименьший размер файла при увеличении времени сборки.
В реальных проектах часто применяется двойная стратегия сжатия. Генерируются оба варианта файлов:
Webpack позволяет подключить несколько экземпляров CompressionPlugin:
module.exports = {
plugins: [
new CompressionPlugin({
algorithm: "brotliCompress",
test: /\.(js|css|html)$/,
compressionOptions: { level: 11 },
filename: "[path][base].br"
}),
new CompressionPlugin({
algorithm: "gzip",
test: /\.(js|css|html)$/,
threshold: 10240,
minRatio: 0.8,
filename: "[path][base].gz"
})
]
};
Такой подход обеспечивает максимальную совместимость и оптимальную производительность загрузки ресурсов.
Параметр test управляет набором файлов, подлежащих
сжатию. Чаще всего включаются:
Исключение бинарных форматов критично, так как их сжатие часто не дает эффекта или даже увеличивает размер.
Пример более точной фильтрации:
test: /\.(js|css|html|json|svg)$/
Для исключения уже сжатых файлов используется
exclude:
exclude: /\.(gz|br)$/
Параметр threshold определяет минимальный размер файла
для обработки. Маленькие файлы часто не выигрывают от дополнительного
сжатия, так как накладные расходы могут нивелировать эффект.
Практические значения:
Параметр minRatio контролирует экономическую
эффективность сжатия. Если итоговый размер недостаточно меньше
исходного, файл не создается.
Формула оценки:
Типичное значение 0.8 означает, что файл будет создан только при снижении размера минимум на 20%.
Параметр filename позволяет управлять структурой
выходных данных. Это важно для интеграции с CDN и серверной логикой:
filename: "[path][base].gz"
или
filename: "[file].br"
Корректное именование обеспечивает возможность однозначного сопоставления с оригинальными ресурсами.
В продакшн-средах сжатые файлы обычно отдаются сервером через конфигурацию:
Сервер выбирает наиболее подходящую версию ресурса:
Использование CompressionPlugin увеличивает время сборки, особенно при Brotli с высоким уровнем сжатия. Это связано с вычислительной сложностью алгоритма.
Основные факторы нагрузки:
В крупных проектах иногда применяют кэширование результатов или ограничивают список файлов для сжатия.
Для ускорения процесса генерации сжатых файлов применяются следующие подходы:
Пример разделения конфигураций:
const isProd = process.env.NODE_ENV === "production";
new CompressionPlugin({
algorithm: "brotliCompress",
compressionOptions: {
level: isProd ? 11 : 4
}
});
Сжатые файлы эффективно работают в связке с CDN. При этом важно учитывать:
Content-Encoding: br или
gzipКомбинация Webpack CompressionPlugin и CDN позволяет достигать минимального времени загрузки даже при больших JavaScript-бандлах.
Использование gzip и Brotli через CompressionPlugin напрямую влияет на:
На практике Brotli чаще используется для статических ресурсов, тогда как gzip остается универсальным резервным механизмом для совместимости.