如何强制客户端刷新JavaScript文件?
我们目前正处于非公开测试阶段,因此仍在进行相当快速的更改,尽管显然随着使用量的增加,我们将放慢这个过程。话虽这么说,我们遇到的一个问题是,在推出新JavaScript文件的更新后,客户端浏览器仍然使用文件的缓存版本,而他们看不到更新。显然,在技术支持电话上,我们可以简单地通知他们进行" ctrl" F5刷新,以确保他们从服务器获取最新文件,但是最好在此之前进行处理。
我们当前的想法是将版本号简单地添加到JavaScript文件的名称上,然后在进行更改时增加脚本上的版本并更新所有引用。这肯定可以完成工作,但是更新每个发行版上的引用可能会很麻烦。
因为我确定我们不是第一个处理此问题的人,所以我认为我会将它扔给社区。更新代码时,如何确保客户端更新其缓存?如果我们使用的是上述方法,是否正在使用简化更改的过程?
解决方案
回答
据我所知,一个常见的解决方案是在脚本的src链接中添加一个"?<version>"。
例如:
<script type="text/javascript" src="myfile.js?1500"></script>
I assume at this point that there isn't a better way than find-replace to increment these "version numbers" in all of the script tags?
我们可能有一个版本控制系统为我们执行此操作?例如,大多数版本控制系统都有一种在签入时自动注入修订号的方法。
它看起来像这样:
<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>
当然,总会有像这样的更好的解决方案。
回答
我的同事刚在http://www.stefanhayden.com/blog/2006/04/03/css-caching-hack/上发布(参考CSS)后,才找到对该方法的引用。很高兴看到其他人正在使用它,并且似乎可行。在这一点上,我认为在所有脚本标签中没有比找到替换增加这些"版本号"更好的方法了吗?
回答
一种解决方案是在获取资源时将带有时间戳的查询字符串添加到URL。这利用了以下事实:浏览器将不会缓存从URL中带有查询字符串的资源。
我们可能根本不希望浏览器完全不缓存这些资源。我们更可能希望将其缓存,但希望浏览器在文件可用时获取新版本。
最常见的解决方案似乎是在文件名本身中嵌入时间戳或者修订号。这需要做更多的工作,因为需要修改代码以请求正确的文件,但这意味着例如" snazzy_javascript_file.js"版本7(即" snazzy_javascript_file_7.js")会缓存在浏览器中,直到我们发布版本8,然后代码更改为获取" snazzy_javascript_file_8.js"。
回答
最简单的解决方案?不要让浏览器完全缓存。添加当前时间(以毫秒为单位)作为查询。
(我们仍处于测试阶段,因此我们可以为不针对性能进行优化提供合理的理由。这里是YMMV。)
回答
如果要生成链接到JS文件的页面,则一种简单的解决方案是将文件的最后修改时间戳记添加到生成的链接。
这与Huppie的答案非常相似,但是可以在没有关键字替换的版本控制系统中使用。这也比追加当前时间更好,因为即使文件完全没有更改,这样做也可以防止缓存。
回答
将当前时间添加到URL确实是一种常见的解决方案。但是,如果需要,我们也可以在Web服务器级别进行管理。可以将服务器配置为发送JavaScript文件的不同HTTP标头。
例如,要强制将文件缓存不超过1天,我们可以发送:
Cache-Control: max-age=86400, must-revalidate
对于Beta版,如果要强制用户始终获取最新版本,则可以使用:
Cache-Control: no-cache, must-revalidate
回答
并非所有浏览器都以"?"缓存文件在里面。为了确保尽可能多地对其进行缓存,我将版本包含在文件名中。
所以我做了stuff_123.js
而不是stuff.js?123
我在Apache中使用了mod_redirect(我认为)去拥有stuff _ *。js去stuff.js。
回答
与fileV1.js
相比,使用file.js?V = 1
的优势在于我们无需在服务器上存储多个版本的JavaScript文件。
我在使用file.js?V = 1
时遇到的麻烦是,在使用新版本的库实用程序时,另一个JavaScript文件中可能存在从属代码,这些代码可能会中断。
为了向后兼容,我认为最好在新页面上使用jQuery.1.3.js并让现有页面使用jQuery.1.1.js,直到准备好升级较旧的页面为止。必要的。
回答
使用版本GET变量来防止浏览器缓存。
在网址末尾添加?v = AUTO_INCREMENT_VERSION
可以防止浏览器缓存避免使用任何缓存脚本。