强制浏览器仅在CSS/JS文件有更改时重新加载它们

4

有很多与我的问题相关的SO问题和答案 [我希望浏览器永久缓存js / css。在新版本发布期间,如果某些js / css文件已更新,则浏览器应重新加载并缓存它们。]

这个解决方案对我来说似乎最合适: 有没有一种优雅的方法可以强制浏览器重新加载缓存的CSS / JS文件?

然而,有一件事我无法理解。 该解决方案使用last_modified_time。但是,我不允许使用它。我需要使用其他机制。

有哪些选项?是否有可能在构建过程中预先计算版本,并通过构建脚本在jsp中更新(替换)它们(在部署之前,以便版本号不在运行时计算)?是否存在此目的的任何现有工具?我使用Java / Jsp。


一个有点烦人的解决方案,但是你可以在文件中保存修订号,并通过PHP动态地将其附加到CSS文件名中。但是每次你想强制用户重新加载CSS时,你需要编辑这个文件。 - neworld
1
然而,我不被允许使用它。为什么? - GolezTrol
@GolezTrol,这是由于一些遗留的构建过程所导致的。无论文件是否被更改,部署中所有文件的最后修改时间都会发生变化。 - TJ-
@neworld你是在建议我保留一个<文件、版本号>仓库?或者我应该将修订号存储在css文件本身中(目前可以使用SVN完成)?每次引用时,我读取这个文件并使用参考中的版本号? - TJ-
@TJ-:存储的位置并不重要。如果希望的话,可以存储在数据库中。这种方法有一个优点,即如果进行不太重要的升级,您不必强制重新加载(修改注释或CS格式)。 - neworld
好的,我想我会同意。假设我将版本存储在数据库中。是否有一种流程/工具可以确保开发人员在修改css/js文件时更新数据库?我正在寻找更全面的解决方案。 - TJ-
3个回答

2

这可能不是最好的方法,但这是我现在正在做的:

  1. 我的所有js/css都有一个[源代码控制=svn]的版本号
  2. jsp中的引用形式为/foo/path1/path2/xyz000000/foo。
  3. 构建步骤1 - 生成css | js文件及其修订版本的映射表
  4. 构建步骤2 - 使用svn修订版本的哈希替换jsps中的xyz000000引用
  5. url重写器中的规则将所有/foo/path1/path2/xyz<767678>/foo.定向到/foo/path1/path2/foo。[js|css]
  6. 无限缓存css | js文件
  7. 每当有提交时,修订号会更改,jsp中的引用也会更改

2
我们经常使用

标签。

file.css?[deploytimestamp]

这样CSS文件就可以在客户端的每个部署中被缓存。我们的压缩JavaScript也是如此。这对你来说是否是一个选项?


1
这是可能的,但如果在部署过程中没有更改,我不希望重新加载js/css。 - TJ-
不会的。file.css?v=1 会被缓存并且不会重新加载,然后你将其更改为 v=2,file.css?v=2 会被缓存一次,然后从缓存中使用(直到再次更改版本...) - user1318194
@DuncanNZ - 但这不是David建议的内容 - 他是在附加部署的时间戳而不是版本号。 - UpTheCreek
我该如何在ASP.NET WebForms中自动将deploytimestamp放置在所有js引用中? - Emad Armoun

1
在部署后生成每个CSS文件的MD5哈希值。在CSS的URL中使用此哈希值代替时间戳。
file.css?[hash of file.css contents]

在部署后计算哈希值并将其存储起来可能是明智的选择,这样可以提高一些性能。您可以将它们存储在数据库中,甚至可以将它们存储在一个单独的文件中的 PHP 数组中,该文件被包含在您的网站代码中。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接