【发布时间】:2010-09-12 05:51:56
【问题描述】:
我注意到一些浏览器(特别是 Firefox 和 Opera)非常热衷于使用 .css 和 .js 文件的缓存副本,甚至介于两者之间浏览器会话。当您更新其中一个文件时,这会导致问题,但用户的浏览器继续使用缓存的副本。
强制用户浏览器在文件发生更改时重新加载文件的最优雅方式是什么?
理想情况下,该解决方案不会强制浏览器在每次访问页面时重新加载文件。
我发现John Millikin's 和da5id's 的建议很有用。事实证明有一个术语:auto-versioning。
我在下面发布了一个新答案,它结合了我的原始解决方案和 John 的建议。
SCdF 提出的另一个想法是将伪造的查询字符串附加到文件中。 (一些 Python 代码自动使用时间戳作为伪造的查询字符串,是submitted by pi.。)
但是,关于浏览器是否会缓存带有查询字符串的文件存在一些讨论。 (请记住,我们希望浏览器缓存文件并在以后的访问中使用它。我们只希望它在文件发生更改时再次获取文件。)
【问题讨论】:
-
我的 .htaccess 中有这个,缓存文件从来没有任何问题:
ExpiresActive On ExpiresDefault "modification". -
我绝对同意将版本信息添加到文件的 URL 是迄今为止最好的方法。它始终对每个人都有效。但是,如果你不使用它,你只需要偶尔在你自己的浏览器中重新加载一个 CSS 或 JS 文件......只需在它自己的选项卡中打开它并点击 SHIFT-reload(或 CTRL-F5)!您可以使用 JS 通过在(隐藏的)iframe 中加载文件,等待它加载,然后调用
iframe.contentWindow.location.reload(true)来有效地做同样的事情。请参阅stackoverflow.com/a/22429796/999120 的方法 (4) - 这是关于图像的,但同样适用。 -
我非常感谢提出这个问题的方式,并且从那时起一直在更新。它完全描述了我对答案的期望。从现在开始,我将在我的问题中遵循这种方法。干杯!
-
供参考:da5id's's deleted answer 是 “如果更新足够大/足够重要,我通常会更改文件名。”.
-
如果更改不是很频繁,我有一个建议。只需更改文件名并编辑源代码以包含新文件名。那么就没有缓存文件供浏览器读取了。
标签: javascript css caching auto-versioning