【问题标题】:How does appending ?v=1 in script load new javascript [duplicate]在脚本中附加 ?v=1 如何加载新的 javascript [重复]
【发布时间】:2014-02-05 14:28:57
【问题描述】:

在浏览HTML 5 boilerplate template 时,观察到他们使用过的地方很少

<!-- CSS : implied media="all" -->
<link rel="stylesheet" href="css/style.css?v=1">

<!------ Some lines removed ------>

<script src="js/plugins.js?v=1"></script>

但这有什么帮助呢?查询字符串如何工作?我没有更改文件名,也没有编写任何脚本来处理查询字符串 (?v=1)。

我错过了什么?我需要更改文件名还是需要有一个存储库才能确保它正常工作?

【问题讨论】:

  • 嗯,这不是同一个 URL,因此不允许缓存服务同一个文件...
  • 我们曾经称之为“缓存破坏者”。当然,鉴于它是静态的(总是 1,而不是时间戳),它不是一个很好的。 (Web 服务器和 .css 文件将忽略查询字符串)
  • @ebyrob 除非您每次更新该文件时手动增加它。
  • @Mike manual = 在这种情况下不好。如果说服务器可以根据它的文件版本跟踪 style.css 何时更改,然后控制它何时被客户端拉下,这似乎好多了。 ...有点像较短的缓存标头时间会发生什么。在流量非常大的环境中改进这一点可能很重要,但它会很快让你头晕目眩。
  • @ebyrob 好主意。我从来没有想过根据文件修改时间来做。我刚刚在我的一个网站上实施了它,效果很好。

标签: javascript html css browser-cache


【解决方案1】:
  1. 无论您在 URL 末尾放置什么查询字符串,大多数 Web 服务器都会提供静态文件。
  2. 浏览器根据其 URL 缓存数据。
  3. 将 URL 更改为不同的 URL 意味着您不会从旧 URL 获取缓存版本,但是,根据 (1),将提供存储在服务器磁盘上相同位置的(新版本)文件.

但这有什么帮助呢?查询字符串如何工作?我没有更改文件名,也没有编写任何脚本来处理查询字符串 (?v=1)。

那就没用了。更改文件时必须更改查询字符串。

我错过了什么?需要改文件名吗

没有

或者我是否需要有一个存储库才能确保它正常工作?

您需要在发布文件的新版本时更改查询字符串。

一种方法是使用构建脚本将 URL 设置为(例如)最后更改版本控制存储库中文件的提交 ID。

【讨论】:

  • 很好的答案——可以解释查询字符串的内容除了停止缓存之外如何无关紧要
  • 服务器只是忽略查询字符串,因为它是一个静态文件。
  • 是的,我的观点是js/plugins.js?asldkfjdsafs 将起到同样的作用。浏览器处理它的方式没有语义差异,只是它不同
  • 正确。你可以在那里拥有任何东西,只要你在更改文件时更改它。不过,作为作者,使用对您有意义的东西会很有帮助。
  • @hogan asldkfjdsafs 有效吗?还是说asldkfjdsafs=asldkfjdsafs?我认为 equals 是必需的?
【解决方案2】:

查询字符串允许您对浏览器说“嘿,我的文件已更改”,并通过更新版本号来强制刷新客户端缓存。否则,如果客户端在本地缓存中有有效版本,浏览器将不会获取文件。

如果明天您要更改 CSS 文件,您可以通过将 URL 更改为

来强制客户端刷新其缓存
<link rel="stylesheet" href="css/style.css?v=2">

... 等等每次更新。

这种方法允许您在 HTTP 标头中设置较长的缓存标头(1 个月或更长时间),以使浏览器不会更新其静态文件缓存,除非您明确更新 CSS 链接。

【讨论】:

  • 不是文件有变化——只是链接。
  • 是的,我可能会混淆我的话,固定。
猜你喜欢
  • 2019-05-03
  • 2011-07-18
  • 1970-01-01
  • 2011-06-05
  • 2017-04-14
  • 2021-09-01
  • 1970-01-01
  • 2019-08-16
  • 2018-11-19
相关资源
最近更新 更多