【发布时间】:2017-01-07 08:50:39
【问题描述】:
在使用 Webpack 之前,我总是依赖以下“缓存清除”模式:
<script src="foo.js?cacheBust=12345" />
12345 是服务器在每次构建时为我生成的令牌(它可能是 Git 哈希,但在我的情况下不是)。
使用 Webpack,我现在有两个文件:build.js 和 chunk.1.js。由于我将第一个带入普通脚本标签,因此我可以使用上述模式:
<script src="build.js?cacheBust=12345" />
但是,此时build.js 会去获取chunk.1.js,但它不包含缓存清除后缀。
我希望 Webpack 自动附加 ?cacheBust=12345,但在构建时我不知道 12345 部分,所以我不能将它包含在我的 webpack.config 中。相反,我必须等到 HTML 页面被评估,此时我从服务器获取令牌。
所以,我的问题是,有没有办法让 Webpack 查看用于获取初始文件的参数(例如?cacheBust=12345)并在获取其他文件时附加相同的参数?
【问题讨论】:
-
当其内容更改时,您希望将查询参数添加到同一文件的技术不会导致缓存失效。见:stevesouders.com/blog/2008/08/23/…
-
我认为您可能读得太快了:它并没有说该技术不起作用。它确实说的是,如果您像 Steve Souders 那样使用 Squid 代理,该技术将无法工作。服务器如何处理请求完全取决于服务器,但根据我的经验,大多数主要的服务器端框架以及大多数 Web 服务器(例如 Apache)确实对
foo.png和foo.png?v=1有不同的处理方式。 -
本文的重点是强调这样一个事实,即客户端和服务器之间可能存在的任何代理服务器很可能会丢弃查询参数并检查文件的缓存版本。如果在代理上为真,则不会检索您的文件的新版本,用户将看到较旧的缓存版本。
-
如果您查看第 1 部分 @Everettes 的答案,它确实回答了您的问题。使用
[chunkhash]的chunkFilename 是破坏缓存的最佳方式。如果您将这些文件存储在 git 中,您可以 git rm 文件,进行构建,然后 git add。那些哈希值没有改变的文件将被简单地“恢复”,而那些哈希值改变的文件将消失。考虑解决方案,而不是机制。 -
这是一个古老的论点,但 Souders 臭名昭著的博客文章却大错特错。使用查询字符串进行缓存清除比他想象的要有效得多。
标签: javascript webpack browser-cache