Html “附加”是什么意思;?v=1“;要在链接和脚本标签中添加CSS和JavaScript URL吗?
我一直在看HTML5样板模板(来自),注意到在引用CSS和JavaScript文件时,URL中使用了Html “附加”是什么意思;?v=1“;要在链接和脚本标签中添加CSS和JavaScript URL吗?,html,css,browser-cache,Html,Css,Browser Cache,我一直在看HTML5样板模板(来自),注意到在引用CSS和JavaScript文件时,URL中使用了“?v=1” 将“?v=1”附加到链接和脚本标记中的CSS和JavaScript URL上有什么作用 并非所有JavaScript URL都具有“?v=1”(以下示例中的示例:js/modernizer-1.5.min.js)。这有什么原因吗 来自其index.html的示例: 这可确保您从服务器获取最新版本的css或js文件 如果您有较新的版本和“?v=3”、“?v=4”等等,那么以后您可以追加
“?v=1”
“?v=1”
附加到链接和脚本标记中的CSS和JavaScript URL上有什么作用“?v=1”
(以下示例中的示例:js/modernizer-1.5.min.js
)。这有什么原因吗index.html
的示例:
这可确保您从服务器获取最新版本的css或js文件 如果您有较新的版本和
“?v=3”、“?v=4”
等等,那么以后您可以追加“?v=2”
请注意,您可以使用任何查询字符串
,“v”不是必须的,例如:
<link ... href="http://sstatic.net/stackoverflow/all.css?v=c298c7f8233d">
“?blah=1
”也可以
及
“?xyz=1002”
将起作用
这是一种常见的技术,因为浏览器现在可以更好、更长地缓存js和css文件。这些通常是为了确保当网站更新为新版本时,浏览器会获得新版本,例如,作为构建过程的一部分,我们会有如下内容:
/Resources/Combined.css?v=x.x.x.buildnumber
因为每次新的代码推送都会改变这种情况,所以客户端被迫获取一个新版本,这仅仅是因为查询字符串。查看此页面(在回答此问题时),例如:
<link ... href="http://sstatic.net/stackoverflow/all.css?v=c298c7f8233d">
我认为,与修订号不同,团队使用了文件哈希,这是一种更好的方法,即使是新版本,浏览器也只能在文件实际更改时才强制获取新版本
这两种方法都允许您将缓存头设置为可笑的长度,比如20年……但当它发生变化时,您不必担心缓存头,浏览器会看到不同的查询字符串,并将其视为不同的,新文件。浏览器缓存Javascript文件的时间通常比您预期的要长得多 当您发布JS文件的新版本时,这通常会导致意外行为
因此,向javascript文件的URL添加QueryString参数是常见的做法。这样,浏览器将以v=1缓存Javascript文件。当您发布新版本的javascript文件时,您将url更改为v=2,浏览器将被迫下载新副本。当您想知道本地web文件夹中文件的版本时,哈希解决方案很好,但不是真正的人类可读的。解决方案是在您的版本上加盖日期/时间戳,以便您可以轻松地将其与服务器文件进行比较 例如,如果您的
.js或.css
文件的日期为2011-02-08 15:55:30
(上次修改),则版本应等于.js?v=20110208155530
应易于读取任何语言中任何文件的属性。在ASP.Net中,它真的很容易
".js?v=" + File.GetLastWriteTime(HttpContext.Current.Request.PhysicalApplicationPath + filename).ToString("yyMMddHHHmmss");
当然,首先要把它很好地重构成属性/函数,然后就可以开始了。别再找借口了
祝你好运,阿特。为了回答你的问题 “?v=1”这是为了下载css和js文件的新副本而编写的,而不是从浏览器的缓存中使用 如果在样式表或js文件末尾提到此查询字符串参数,则会强制浏览器下载新文件,因此.css和.js文件中最近的更改在浏览器中生效 如果不使用此版本控制,则可能需要清除刷新页面的缓存,以便查看这些文件中最近的更改
这里有一篇文章解释了这一点在新版本的开发/测试过程中,缓存可能是一个问题,因为浏览器、服务器甚至有时3G电信(如果您进行移动部署)会缓存静态内容(例如JS、CSS、HTML、img)。您可以通过在URL中添加版本号、随机数或时间戳来克服此问题,例如:JSP:
如果您运行的是纯HTML(而不是服务器页面JSP、ASP、PHP),服务器将不会帮助您。在浏览器中,链接在JS运行之前加载,因此您必须删除链接并使用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);
}
//前端缓存中断
var cacheBust=['js/StrUtil.js','js/protos.common.js','js/conf.js','bootstrap\u ECP/js/init.js'];
对于(i=0;i
正如您之前所读到的,v=1确保您的浏览器获得文件的版本1。当您有一个新版本时,只需附加一个不同的版本号,浏览器就会忘记旧版本并加载新版本
有一个gulp插件,它在构建阶段负责文件的版本,因此您不必手动执行。它很方便,您可以轻松地将其集成到构建过程中。这里有一个链接:正如其他人提到的,它用于前端缓存破坏。为了实现这一点,我个人发现grunt cache bust npm包非常有用。具体是哪种浏览器?即使是最古怪的IE 5和IE 6也遵守缓存控制头。@Free-昨天发送的缓存控制头不能告诉客户端今天文件已更改(客户端甚至不会检查),URL可以。你能解释一下我遗漏了什么吗?@Free-这些文件的缓存方式是永久性的,这意味着客户端无法检查文件是否被修改。这意味着他们永远不会得到更新的文件…除非URL改变,这就是使用上述技术所发生的。客户机上的缓存寿命最长(HTTP请求最少),但当文件实际更改时,客户机会立即更新。确切地