Javascript 仅当css/js发生更改时才强制浏览器重新加载

Javascript 仅当css/js发生更改时才强制浏览器重新加载,javascript,css,caching,continuous-deployment,auto-versioning,Javascript,Css,Caching,Continuous Deployment,Auto Versioning,有很多问题和答案都与我的问题有关[我希望浏览器永远缓存js/css。在新版本中,如果一些js/css文件已经更新,浏览器应该重新加载并缓存它们。] 这个解决方案似乎最适合我: 然而,有一件事我无法理解。 该解决方案利用上次修改的时间。但是,我不允许使用它。我需要使用其他的机制 有哪些选择?是否有可能在构建期间预先计算版本,并通过构建脚本在JSP中更新(替换)版本(在部署之前,这样就不会在运行时计算版本号)?是否有用于此目的的现有工具?我使用Java/Jsp。我们总是使用 file.css?[d

有很多问题和答案都与我的问题有关[我希望浏览器永远缓存js/css。在新版本中,如果一些js/css文件已经更新,浏览器应该重新加载并缓存它们。]

这个解决方案似乎最适合我:

然而,有一件事我无法理解。
该解决方案利用上次修改的时间。但是,我不允许使用它。我需要使用其他的机制

有哪些选择?是否有可能在构建期间预先计算版本,并通过构建脚本在JSP中更新(替换)版本(在部署之前,这样就不会在运行时计算版本号)?是否有用于此目的的现有工具?我使用Java/Jsp。

我们总是使用

file.css?[deploytimestamp]

这样,CSS文件在客户端的每次部署都会被缓存。我们的小型javascript也是如此。这是您的选项吗?

部署后为每个css文件生成md5哈希。在css的url中使用此哈希而不是时间戳

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

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

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

  • 我所有的js/css都有一个[source control=svn]版本号
  • 我的jsp中的引用类似于/foo/path1/path2/xyz000000/foo
  • 构建步骤1-生成css | js文件及其修订号的映射
  • 构建步骤2-将JSP中的xyz000000引用替换为svn修订的哈希
  • url重写器中的一条规则,用于指示所有/foo/path1/path2/xyz/foo。到/foo/path1/path2/foo。[js | css]
  • 无限缓存css | js文件
  • 无论何时有提交,修订号都会更改。jsp中的引用也会更改

  • 这是一个有点烦人的解决方案,但您可以将修订号保存在文件中,并通过PHP将其动态附加到css文件名中。但是每次你想强制用户使用realod CSS时,你都需要编辑这个文件。“但是,我不允许使用它”为什么?@GolezTrol,因为一些遗留的构建过程。部署中所有文件的上一次修改时间的更改与它们的更改无关。@NewWorld您是否建议我保留一个存储库?或者我应该将修订号存储在css文件本身中(暂时可以使用SVN)。在每次引用中,我都会阅读此文件并使用引用中的版本号?@TJ-:将其存储在何处并不重要。如果需要,可以将其存储在DB中。这种方法有一个优点,如果你进行了不太重要的升级,你可以不强制realod(修改的注释或CSs格式)。这是可能的,但如果js/CSs没有在不同的部署中更改,我不希望重新加载。它不会
    file.css?v=1
    将被缓存且不会重新加载,然后您将其更改为v=2,并将
    file.css?v=2
    缓存一次,然后从缓存中使用(直到再次更改版本…))@DuncanNZ-但这不是David的建议-他附加的是部署的时间戳,而不是版本。如何在asp.net webforms中的所有js引用中自动放置部署时间戳?