我正在使用webpack将我的文件捆绑到两个文件:app.js和lib.js中,我为浏览器下载的每个文件创建并附加唯一的chunkhash。这两个文件都在同一构建输出中一起构建。它看起来像这样:
lib.747c2ee515b25d871bd0.js
app.e6a0b36a5bb2bff41393.js
我在这些文件上设置了以下缓存:
Cache-Control:private, max-age=31536000
这意味着这些文件将被缓存一年或新文件到达时。这对每个文件都是独立的。
由于我们的应用程序更接近发布,因此app
中的更改比lib
中的更改更多。
问题:我遇到的问题是,在新版本中,lib
的内容不会更改,但模块ID会更改。这导致模块ID发生变化,但chunkhash不会改变;导致下载app
而非lib
导致应用程序损坏。在Ctrl + F5上,一切都按预期再次开始工作。
问题:是否将已更改的模块ID视为chunkash的一部分?我该如何解决这个问题?是否可以通过WebPack将自动增量显式版本号添加到文件名中?
非常感谢任何帮助。
答案 0 :(得分:1)
如果您使用webpack-md5-hash
插件更改webpack chunkhash,那么您可能会点击此issue。
这两篇文章也可以帮助Predictable long term caching和Long term caching of static assets with webpack。
答案 1 :(得分:1)
我解决这个问题的方法是在我的文件名中添加一个号码(Date.now()
),如下所示。
filename: `[name].${Date.now().valueOf()}.[chunkhash].js`
在可预见的时间内,这种方法非常可靠。这是因为Date.now().valueOf()
返回的值是自UTC时间1970年1月1日午夜以来的毫秒数。此外,我想在这里实现的是自动生成的值,与之前的值不同。
我看到这种方法的唯一缺点是:每次发布时,都会强制刷新所有包。然而,考虑到在前两次发布之后我们将会产生非常低的生产频率,这并不是一个太大的问题。