4

有很多与我的问题相关的问题和答案[我希望浏览器永久缓存js/css。在一个新的版本,如果有些JS/CSS文件已经更新,浏览器应该重新加载并缓存]强制浏览器只有在更改后才能重新加载css/js

该解决方案似乎最适合我。 What is an elegant way to force browsers to reload cached CSS/JS files?

然而,有一件事我无法弄清楚。 解决方案使用last_modified_time。但是,我不能使用它。我需要使用其他一些机制。

有什么选择?是否有可能通过构建脚本在构建和更新(替换)jsps期间预先计算版本(部署之前,以便在运行时不计算版本号)?任何现有的工具为此目的?我使用Java/Jsp。

+0

有点烦人的解决方案,但您可以将修订号保存在文件中,并通过PHP将其动态添加到css文件名。但是每当你想强制用户realod CSS时,你都需要编辑这个文件。 – neworld 2012-08-16 12:38:01

+1

“但是,我不能使用它”为什么? – GolezTrol 2012-08-16 12:39:39

+0

@GolezTrol因为一些遗留的构建过程。部署中所有文件的上次修改时间更改无关紧要。 – 2012-08-16 12:42:02

回答

2

它可能不是最好的方式,但是这就是我现在所做的:

  1. 我的js的全部/ CSS有[源控制= SVN]版本号
  2. 参考我的JSP是/ foo/path1/path2/xyz000000/foo。
  3. 生成步骤1 - 生成地图的CSS | JS文件及其版本号
  4. 生成步骤2 - 与SVN版本的哈希值替换的JSP xyz000000引用
  5. 在URL重写规则指示所有/富/ 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被重新加载,如果它没有跨部署更改。 – 2012-08-16 12:44:14

+0

它不会。 'file.css?v = 1'会被缓存并且不会被重新载入,然后将其更改为v = 2并且将'file.css?v = 2'缓存一次,然后从缓存中使用(直到再次更改版本...) ) – stackunderflow 2012-08-29 07:49:08

+0

@DuncanNZ - 但这不是David所建议的 - 他追加部署的时间戳而不是版本。 – UpTheCreek 2013-04-15 10:28:30

1

部署后生成每个css文件的md5哈希值。使用这个散列而不是css的url中的时间戳。

file.css?[hash of file.css contents] 

在部署后计算哈希值并将其存储以获得某些性能可能是明智之举。您可以将它们存储在数据库中,甚至可以将它们存储在网站代码中包含的单独文件中的PHP数组中。

相关问题