我如何强制客户端刷新JavaScript文件?

我们目前正在进行一次私人测试,因此它们仍在进行相当快速的变化,但显然随着使用量的增加,我们将放慢这一过程。 话虽如此,我们遇到的一个问题是,当我们推出新的JavaScript文件的更新后,客户端浏览器仍然使用缓存版本的文件,但他们没有看到更新。 显然,在支持调用中,我们可以简单地通知他们执行ctrlF5刷新,以确保他们从服务器获取最新文件,但在此之前处理此问题将更可取。

我们目前的想法是简单地将版本号附加到JavaScript文件的名称上,然后在做出更改时,在脚本上增加版本并更新所有引用。 这绝对可以完成工作,但更新每个发行版的参考可能会很麻烦。

我敢肯定,我们不是第一个处理这个问题的人,我想我会把它扔给社区。 如何确保客户在更新代码时更新缓存? 如果您使用上述方法,您是否正在使用简化更改的流程?


据我所知,一个常见的解决方案是在脚本的src链接中添加一个?<version>

例如:

<script type="text/javascript" src="myfile.js?1500"></script>

在这一点上,我假定没有比find-replace更好的方法来在所有脚本标记中增加这些“版本号”?

你可能有一个版本控制系统为你做? 例如,大多数版本控制系统都有办法在检入时自动注入修订号。

它看起来像这样:

<script type="text/javascript" src="myfile.js?$$REVISION$$"></script>

当然,总有像这样的更好的解决方案。


将当前时间附加到URL确实是一种常见的解决方案。 但是,如果需要,也可以在Web服务器级别进行管理。 可以将服务器配置为为JavaScript文件发送不同的HTTP标头。

例如,要强制文件被缓存不超过1天,您可以发送:

Cache-Control: max-age=86400, must-revalidate

对于测试版,如果您想强制用户始终获取最新版本,则可以使用:

Cache-Control: no-cache, must-revalidate

Google Page-Speed:不要在静态资源的URL中包含查询字符串。 大多数代理服务器,特别是Squid到3.0版本,都不会将资源缓存为“?” 即使响应中存在Cache-control:public标头,它们的URL也是如此。 要为这些资源启用代理缓存,请从对静态资源的引用中删除查询字符串,并将参数编码为文件名本身。

在这种情况下,您可以将该版本包含在以下网址中:http://abc.com/ v1.2 /script.js,并使用apache mod_rewrite将链接重定向到http://abc.com/script.js。 当您更改版本时,客户端浏览器将更新新文件。

链接地址: http://www.djcxy.com/p/50665.html

上一篇: How can I force clients to refresh JavaScript files?

下一篇: How best to use File Version and Assembly Version?