Webpack打包后如何实现持久化缓存避免用户重复下载?
我用 Webpack 打包项目,每次构建后文件名都变了,用户就得重新下载所有资源,体验很差。听说可以用 contenthash 实现持久化缓存,但试了好像没生效?
我在 output.filename 里配了 [name].[contenthash].js,但只要改了一行代码,所有 chunk 的 hash 都变了,vendor 包也跟着变,根本没缓存住。
这是我的关键配置:
module.exports = {
output: {
filename: '[name].[contenthash].js',
chunkFilename: '[name].[contenthash].chunk.js'
},
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
vendor: {
test: /[\/]node_modules[\/]/,
name: 'vendors',
chunks: 'all'
}
}
}
}
}
主要问题是模块 id 不稳定导致 hash 变化。要解决几个关键点:
1. 首先确保 runtimeChunk 单独拆分,避免运行时变动影响所有 chunk:
2. 然后加上 moduleIds 配置来稳定模块 id:
3. 对于第三方库,建议把 vendor 拆得更细些,比如 react 和 lodash 分开打包:
这样改了之后,vendor 包基本不会变,业务代码改动也只会影响对应 chunk 的 hash。记得清空缓存再测试,浏览器缓存有时候会骗人。
如果还不行,可能是某些 loader 产生了不稳定的内容,可以试试在 file-loader/url-loader 里也加上 contenthash。