从CDN加载JS文件,如何防止浏览器缓存?

3
每隔几个小时(或更短时间,具体取决于情况),我将更新一个JavaScript文件,其中包含一个JSON对象,其中包含将显示在网站上的通知。这个JSON对象是我会定期更新的,因此浏览器不能缓存它。
这个JavaScript文件将托管在CDN上,并且这个文件将存在于客户网站上,例如:
<script src="//example.com/1.7.1/my_file.js"></script>

在这种情况下,我应该如何防止浏览器缓存?

我想最好的方法是让所有客户端都有相同的javascript文件,然后通过ajax请求来获取信息? 这样,“my_file.js”就可以被缓存,但ajax响应不会被缓存。


3
你可以在你的网址末尾添加时间戳... - brso05
@brso05,你应该把那个作为答案。 - LoremIpsum
2个回答

2

您可以在路径my_file.js后面添加一个时间戳,如my_file.js?time=currentTime

为了保持HTML的清洁,您可以在另一个本地js文件中添加以下内容

$("head").append('<script type="text/javascript" src="yourPath?time=' + Date.now() + '"></script>');

或者你可以使用$.getScript、requirejs等方法。

1
它甚至不需要是一个时间戳。只要任何GET参数发生变化,缓存版本就会被丢弃。如果您使用$.ajax()选项cache: false,jQuery将使用&_=<timestamp>。Font-awesome使用参数v=4.5.0。StackOverflow为每个文件添加v=<hash> - Ismael Miguel

2
这真的取决于你使用的CDN和可用的功能。一些方法如下:
  • 指示CDN缓存文件大约一个小时,这样每个小时它就会自动获取新文件(假设有人请求)。这意味着用户不一定会立即得到更改,但在您更改后半小时内应该可以看到。
  • 除此之外,让CDN向最终用户发送“无缓存”Cache-Control头。根据CDN的不同,这可能只是您的源发送的内容,并且您使用CDN上的某种覆盖(或通过头文件的各种方式来指示CDN进行缓存,例如Surrogate-Cache-Control)
  • 或者,使用上述版本控制/时间戳URL。缺点是需要更新对文件的任何引用以包括版本ID。如果您的页面是自动生成的,则没问题。
  • 允许CDN无限期地缓存该文件,但利用“清除”或“作废”功能来强制CDN在下次请求时请求新版本。这主要适用于您希望文件不更新超过几个小时或一天的情况。

谢谢您的回答。这是一个显而易见的事情,但我还是要说一下:如果使用CDN并且它具有清除选项(像所有CDN应该具有的那样),那么使用“no-cache”是一个好方法(取决于您的网站和用户的网络),这与要求浏览器缓存数月/数年/永久相反。CDN完全改变了缓存的方法,因为它应该快速,并且到处都有(许多PoP),这使得“no-cache”对某些用例很好。 - site80443

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