【问题标题】:Loading a JS file from a CDN, how to prevent browser caching?从CDN加载JS文件,如何防止浏览器缓存?
【发布时间】:2016-02-11 15:23:35
【问题描述】:

每隔几个小时(或更少),我将更新一个 javascript 文件,该文件将包含一个 JSON 对象,其中包含将出现在网站上的通知。这个 JSON 对象是我将定期更新的对象,因此它不能被浏览器缓存。

javascript 将托管在 CDN 上,此文件将位于客户端网站上,例如:

<script src="//example.com/1.7.1/my_file.js"></script>

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

我想最好的方法是让所有客户端都拥有相同的 javascript 文件,然后发出 ajax 请求来下拉消息?这样可以缓存“my_file.js”,但不会缓存ajax响应。

【问题讨论】:

  • 您可以在网址末尾添加时间戳...
  • @brso05 你应该把它作为答案。

标签: javascript cdn


【解决方案1】:

您可以在路径 my_file.js?time=currentTime 之后添加时间戳

为了保持 HTML 干净,您可以在另一个本地 js 文件中添加类似的内容

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

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

【讨论】:

  • 它甚至不需要是时间戳。一旦任何 GET 参数更改,缓存的版本就会被丢弃。如果您使用带有选项cache: false$.ajax(),jQuery 使用&amp;_=&lt;timestamp&gt;。 Font-awesome 使用参数v=4.5.0。 StackOverflow 为每个文件添加一个v=&lt;hash&gt;
【解决方案2】:

这实际上取决于您使用的 CDN 和可用的功能。一些方法:

  • 指示 CDN 将文件缓存大约一个小时,因此它会每小时自动获取一个新文件(假设有人请求)。这意味着用户不一定会立即获得更改,但会在您更改后的半小时内获得
  • 除此之外,让 CDN 向最终用户发送“无缓存”缓存控制标头。根据 CDN,这只是您的源发送的内容,并且您在 CDN 上使用了一些覆盖(或指示 CDN 通过标头缓存它的各种方法之一,例如 Surrogate-Cache-Control)
  • 或者,上述版本控制/时间戳 URL。这样做的缺点是它要求您更新对文件的任何引用以包含版本 ID。如果您的页面是自动生成的,这很好。
  • 允许 CDN 无限期地缓存文件,但使用“清除”或“无效”功能强制 CDN 在下次请求时请求新版本。如果您有理由让文件在几个小时或一天内不更新,这主要适用。

【讨论】:

  • 感谢您的回答。这是显而易见的事情,但我还是要说明:如果使用了 CDN 并且它有一个清除选项,就像所有 CDN 都应该有的那样,那么使用“no-cache”是一个好方法(取决于您的站点和用户的网络),这与要求浏览器缓存数月/年/永久相反。 CDN 完全改变了缓存的方法,因为它应该是快速的,并且无处不在(许多 PoP),这使得“无缓存”对于某些用例来说很好。
猜你喜欢
  • 2019-09-25
  • 2017-02-06
  • 2013-02-09
  • 2015-06-24
  • 1970-01-01
  • 2019-01-02
  • 2020-11-16
  • 2023-03-21
  • 1970-01-01
相关资源
最近更新 更多