“?”和javascript后面的数字是什么意思?

5

我在一些惠普(HP)的代码中看到,在JavaScript文件名后面有一个问号和数字,似乎是日期或其他什么东西。JavaScript文件名后面的“?”和数字是用来做什么的呢? 例如:

<script type="text/javascript" src="/folder/js/folderPageNextSubmit.js?20140801"></script>
6个回答

8

这是用于缓存破坏的,例如:

 file.js?1234

 file.js?12345

浏览器将它们视为两个不同的文件,因此即使第一个文件被缓存,第二个文件仍将被获取。

当您更改文件代码并部署后,您需要更改编号,以便用户可以看到您的新更改并加载新文件。


使用查询字符串可以防止某些浏览器完全缓存文件。这会增加不必要的开销。更改文件名是更好的选择。虽然仍然不确定它的范围是否可以在服务器级别上修复,但值得研究。 - Leeish
如果您选择使用HTML5,您可以使用应用程序缓存,并自动生成清单并根据文件的哈希值添加注释。即使在注释中进行更改也会强制重新加载,因此您无需再担心它。 - maraca
http://webmasters.stackexchange.com/questions/52948/url-with-query-disables-caching - Leeish
根据上述链接,似乎使用足够长的字符串以避免缓存冲突非常重要。 - Leeish
是的,有几种方法,例如:file-1234.js 和 file.js?1234,但我认为这是最简单和最快的方法。 - Tzook Bar Noy

6
在JavaScript或CSS文件中使用的“?”是给文件添加版本号的一种方法。在开发环境中工作时,它有助于避免浏览器缓存问题,因为当版本号变化时,文件URL也会随之变化,因此对于浏览器来说似乎是不同的文件。
通常使用时间戳作为版本号以获得唯一性,但您也可以使用任何数字或字符。

4
人们通常使用这种方式来强制用户更新浏览器缓存。如果我的页面上有一个文件 init.js,当你第一次访问我的网站后,我更新了它,然后你再次访问时,你的浏览器可能不会下载我的更新文件,而只是使用它缓存中的文件。
添加一个随机字符串或日期将强制浏览器更新它的缓存,因为它认为文件已经改变了。
缺点是我认为它根本不会缓存。如果你使用URL参数而不是像init.1234.js这样的方式,有些浏览器每次都会下载文件,所以使用URL参数方法可能不是最好的选择。
编辑:此外,如果你需要更新一些关键文件,最好在服务器上设置过期时间头,但我不会说我从未使用过这种方法,只是不是最好的想法。我相信在文件本身中添加日期是更好的做法。

https://dev59.com/727Xa4cB1Zd3GeqPmytY - Leeish
请注意,这似乎不是一个随机字符串。它看起来可能是01/08/2014的日期代码。如果服务器响应没有禁用缓存,则带有URL查询参数的浏览器GET请求可以被缓存。因此,仅仅因为有查询参数并不意味着它不会被缓存。 - jfriend00

1
在网络请求中使用这种反模式是为了强制浏览器永远不缓存文件(或者说总是缓存不同的副本),因为它总是有一个不同的 URL。更好的程序员会简单地使用服务器/响应缓存配置设置,并且只有在文件没有改变时才允许缓存。

1

强制重新加载文件而不使用缓存中的副本是一种常见的策略。通过这种方式添加时间戳可以强制重新加载。


1

一般来说,URL 中的 ? 表示路径结束和查询参数开始。

因此,在您的脚本标签中:

<script type="text/javascript" src="/folder/js/folderPageNextSubmit.js?20140801"></script>

文件路径为"/folder/js/folderPageNextSubmit.js",并在URL的末尾添加了查询参数?20140801
服务器是否对此特定查询参数进行任何操作完全取决于它自己。例如,20140801可能是表示1/08/2014日期代码,这意味着服务器将提供与该日期代码匹配的特定版本文件。
或者,服务器可能不对查询参数执行任何操作,纯粹用于打破浏览器或代理缓存先前使用不同日期代码的JS文件的URL,以便提供更新的版本而不是旧的缓存版本。
如果不知道具体用途和服务器实现方式,就无法确定是哪种情况。

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