В системе сборки Webpack хеши используются для решения задачи контроля версий выходных файлов и управления кэшированием в браузере и CDN. Основная цель — обеспечить корректное обновление только тех ресурсов, которые действительно изменились, минимизируя повторную загрузку неизменяемых частей приложения.
Существуют три ключевых типа хешей: hash,
chunkhash, contenthash. Каждый из них имеет
собственную область применения, особенности вычисления и влияние на
стратегию кэширования.
hash: глобальный хеш
сборкиhash представляет собой общий хеш всей сборки. Он
пересчитывается при каждом изменении любого файла, участвующего в
сборке.
output: {
filename: '[name].[hash].js'
}
Если изменяется даже один модуль, например утилита или стили,
пересобирается весь проект, и новый hash получает весь
набор файлов. Это делает hash непригодным для долгосрочного
кэширования.
Использование hash приводит к:
chunkhash: хеш уровня
чанкаchunkhash вычисляется отдельно для каждого чанка. Чанк
представляет собой логическую группу модулей, объединённых в один
выходной файл.
output: {
filename: '[name].[chunkhash].js'
}
Если изменяется модуль, входящий только в один чанк, обновляется только хеш этого чанка. Остальные чанки сохраняют прежние значения.
contenthash:
хеш содержимого ассетаcontenthash рассчитывается на основе конкретного
содержимого файла. Это наиболее точный и стабильный тип хеша.
module.exports = {
module: {
rules: [
{
test: /\.css$/,
use: [
'style-loader',
'css-loader'
]
}
]
},
output: {
filename: '[name].[contenthash].js'
}
}
Для CSS часто используется отдельно:
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
})
Изменение даже одного символа в файле приводит к изменению хеша только этого файла. Остальные ассеты остаются неизменными.
contenthash является основой долгосрочного кэширования и
CDN-дистрибуции.
hash, chunkhash и
contenthashhash — вся сборкаchunkhash — отдельный чанкcontenthash — отдельный файлhash — низкаяchunkhash — средняяcontenthash — высокаяhash — разработка (dev mode)chunkhash — промежуточные сценарии сборкиcontenthash — productionОсновная задача при работе с Webpack в продакшене — минимизировать количество повторных загрузок неизменённых ресурсов.
Кэш браузера и CDN работает на основе URL. Если изменяется имя файла, ресурс считается новым. Поэтому стратегия именования файлов напрямую определяет эффективность кэширования.
Типичная проблема возникает при использовании hash:
Одной из ключевых стратегий оптимизации является разделение кода на:
Runtime Webpack содержит манифест модулей и служебную логику загрузки. Его изменение приводит к каскадному изменению хешей чанков.
optimization: {
runtimeChunk: 'single'
}
Такой подход позволяет:
chunkhashМеханизм splitChunks позволяет выделять общие
зависимости в отдельные чанки.
optimization: {
splitChunks: {
chunks: 'all'
}
}
Влияние на хеши оказывает не только тип хеша, но и способ генерации идентификаторов модулей.
optimization: {
moduleIds: 'deterministic',
chunkIds: 'deterministic'
}
chunkhashЭффективная стратегия кэширования в связке с Webpack базируется на разделении ресурсов по степени изменяемости.
Файлы с contenthash можно кэшировать как
неизменяемые:
Cache-Control: public, max-age=31536000, immutable
Для них используется короткий TTL или отключение кэша.
Типичная production-конфигурация:
output: {
filename: '[name].[contenthash].js',
clean: true
}
Дополнительно:
new MiniCssExtractPlugin({
filename: '[name].[contenthash].css'
})
Для vendor:
optimization: {
splitChunks: {
cacheGroups: {
vendor: {
test: /[\\/]node_modules[\\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
Изменение одного модуля может приводить к различным последствиям в зависимости от типа хеша и архитектуры сборки:
hash меняется всёchunkhash меняется только затронутый чанк, но
runtime может повлиять на другиеcontenthash меняется только конкретный файлНа практике именно взаимодействие runtime + splitChunks + moduleIds определяет итоговую стабильность кэша.
В долгоживущих приложениях важна минимизация “шума” в сборке:
Хеширование становится не просто технической деталью, а частью архитектуры доставки приложения.