什么附加“?v = 1”到链接和脚本标记中的CSS和Javascript URL?

我一直在寻找HTML5样板模板(来自http://html5boilerplate.com/ ),并注意到在引用CSS和Javascript文件时,在URL中使用"?v=1"

  1. 什么附加"?v=1"到链接和脚本标记中的CSS和Javascript URL?
  2. 并非所有的Javascripturl都有"?v=1" (例如下面的示例: js/modernizr-1.5.min.js )。 有这个原因吗?

来自他们的index.html示例:

 <!-- CSS : implied media="all" --> <link rel="stylesheet" href="css/style.css?v=1"> <!-- For the less-enabled mobile browsers like Opera Mini --> <link rel="stylesheet" media="handheld" href="css/handheld.css?v=1"> <!-- All JavaScript at the bottom, except for Modernizr which enables HTML5 elements & feature detects --> <script src="js/modernizr-1.5.min.js"></script> <!------ Some lines removed ------> <script src="js/plugins.js?v=1"></script> <script src="js/script.js?v=1"></script> <!--[if lt IE 7 ]> <script src="js/dd_belatedpng.js?v=1"></script> <![endif]--> <!-- yui profiler and profileviewer - remove for production --> <script src="js/profiling/yahoo-profiling.min.js?v=1"></script> <script src="js/profiling/config.js?v=1"></script> <!-- end profiling code --> 

提前致谢。

这些通常是为了确保浏览器在新版本更新时得到一个新版本,例如,作为我们构build过程的一部分,我们有这样的东西:

 /Resources/Combined.css?v=xxxbuildnumber 

由于这种情况随着每一次新的代码推动而改变,客户端只是因为查询string而被迫抢到一个新的版本。 看这个页面(在这个答案的时候)例如:

 <link ... href="http://sstatic.net/stackoverflow/all.css?v=c298c7f8233d"> 

我认为SO团队并没有使用修订版本,而是使用文件哈希(hash),这是一种更好的方法,即使是新版本,浏览器也只是在文件实际发生变化时才被迫获取新版本。

这两种方法都允许你将caching头设置为一个可笑的长度,比如20年,但是当它改变的时候,你不必担心这个caching头,浏览器会看到一个不同的查询string,并把它当作不同的新文件。

这可以确保您从服务器上获取来自css或js文件的最新版本。

如果你有一个更新的版本和"?v=3", "?v=4"等等,那么你可以追加"?v=2"

请注意,您可以使用任何querystring ,例如:“v”不是必须的。

"?blah=1 ”也可以。

"?xyz=1002"将起作用。

这是一个常见的技术,因为浏览器现在cachingjs和css文件越来越好。

哈希解决scheme是不错的,但是当你想知道什么版本的文件正在你的本地web文件夹中时,它不是人类可读的。 解决scheme是date/time时间戳您的版本,以便您可以轻松地将其与您的服务器文件进行比较。

例如,如果.js or .css文件的date是2011-02-08 15:55:30 (最后修改),那么版本应该等于.js?v=20110208155530

应该很容易阅读任何语言的任何文件的属性。 在ASP.Net这真的很容易…

 ".js?v=" + File.GetLastWriteTime(HttpContext.Current.Request.PhysicalApplicationPath + filename).ToString("yyMMddHHHmmss"); 

因为得到它很好地重构到属性/函数首先,并离开你去。 别再找借口。

祝你好运,艺术。

JavaScript文件通常被浏览器caching的时间比您预期的要长。

当您发布新版本的JS文件时,这通常会导致意外的行为。

因此,向javascript文件的URL添加QueryString参数是很常见的做法。 这样,浏览器cachingv = 1的Javascript文件。 当你释放你的JavaScript文件的新版本,你改变url为v = 2,浏览器将被迫下载一个新的副本。

为了回答你的问题;

“?v = 1”这样写就只是为了下载一个新的css和js文件副本,而不是从浏览器的caching中使用。

如果您在样式表或js文件的末尾提到了这个查询string参数,那么它会强制浏览器下载一个新文件。由此可以使得.css和.js文件中的最近更改在您的浏览器中生效。

如果您不使用此版本,则可能需要清除刷新页面的caching以查看这些文件中的最新更改。

这里有一篇文章解释了这个事情如何以及为什么要对CSS和JS文件进行版本控制

 // front end cache bust var cacheBust = ['js/StrUtil.js', 'js/protos.common.js', 'js/conf.js', 'bootstrap_ECP/js/init.js']; for (i=0; i < cacheBust.length; i++){ var el = document.createElement('script'); el.src = cacheBust[i]+"?v=" + Math.random(); document.getElementsByTagName('head')[0].appendChild(el); } 

只是我的两分钱。

正如您以前可以阅读的一样, ?v=1确保您的浏览器获取文件的版本1。 当你有一个新的版本,你只需要添加一个不同的版本号,浏览器将忘记旧版本,并加载新版本。

在编译阶段有一个gulp插件负责处理你的文件的版本,所以你不必手动完成。 它非常方便,您可以轻松地将其集成到您的构build过程中。 这是链接gulp-annotate