WebPack:模块编号的更改不会更改chunkhash

时间:2017-07-07 09:39:04

标签: caching webpack

我正在使用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将自动增量显式版本号添加到文件名中?

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:1)

如果您使用webpack-md5-hash插件更改webpack chunkhash,那么您可能会点击此issue

这两篇文章也可以帮助Predictable long term cachingLong 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日午夜以来的毫秒数。此外,我想在这里实现的是自动生成的值,与之前的值不同。

我看到这种方法的唯一缺点是:每次发布时,都会强制刷新所有包。然而,考虑到在前两次发布之后我们将会产生非常低的生产频率,这并不是一个太大的问题。