Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/css/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么要将参数传递给CSS和JavaScript链接文件,如src="/cnt.js?ver=4.0;?_Javascript_Css_Parameters_Hyperlink - Fatal编程技术网

为什么要将参数传递给CSS和JavaScript链接文件,如src="/cnt.js?ver=4.0;?

为什么要将参数传递给CSS和JavaScript链接文件,如src="/cnt.js?ver=4.0;?,javascript,css,parameters,hyperlink,Javascript,Css,Parameters,Hyperlink,当我看到许多站点的源代码时,参数被传递到链接文件(CSS/JavaScript) 在StackOverflow源中,我得到了 <script type="text/javascript" src="http://sstatic.net/js/master.js?v=55c7eccb8e19"></script> 为什么使用master.js?v=55c7eccb8e19 我确信JavaScript/CSS文件无法获取参数 原因是什么?通常这样做是为了防止缓存 假设

当我看到许多站点的源代码时,参数被传递到链接文件(CSS/JavaScript)

在StackOverflow源中,我得到了

<script type="text/javascript" src="http://sstatic.net/js/master.js?v=55c7eccb8e19"></script> 

为什么使用
master.js?v=55c7eccb8e19

我确信JavaScript/CSS文件无法获取参数


原因是什么?

通常这样做是为了防止缓存


假设您部署了新应用程序的版本2,并且希望使客户端刷新其CSS,您可以添加这个额外的参数,以指示它应该从服务器重新请求它。当然也有其他方法,但这很简单。

生成CSS或JavaScript代码的服务器端脚本可以使用它们,但它可能只是用来在文件内容更改时更改URI,以便旧的缓存版本不会引起问题。

正如其他人所说,这可能是一种控制缓存的尝试,尽管我认为最好通过更改实际资源名称(
foo.v2.js
,而不是
foo.js?v=2
)而不是查询字符串中的版本来实现。(这并不意味着您必须重命名文件,有更好的方法可以将URL映射到底层文件。)尽管已经四年了,因此在网络世界中已经很古老了,但仍然是一个非常有用的讨论。在其中,作者声称您不想对版本使用查询字符串,因为:

…根据HTTP缓存规范的规定,用户代理永远不应该缓存带有查询字符串的URL。虽然Internet Explorer和Firefox忽略了这一点,但Opera和Safari不

这种说法可能不太正确,因为规范是什么

…由于一些应用程序传统上使用带有查询URL的GET和HEAD(在rel_路径部分包含“?”的GET和HEAD)来执行具有显著副作用的操作,缓存不得将对此类URI的响应视为新响应,除非服务器提供明确的过期时间

(最后的重点是我的。)因此,在查询字符串中使用版本可能很好,只要您还包括显式缓存头。提供的浏览器可以正确实现上述功能。代理也有。您知道为什么我认为您最好使用实际资源定位器中的版本,而不是查询参数(这[再次]并不意味着您必须不断重命名文件;有关更多信息,请参阅上面链接的文章)。您知道浏览器、代理等。如果您更改了更新后的资源的名称,将获取更新后的资源,这意味着您可以给以前的“名称”一个永无止境的缓存时间,以最大限度地利用中间缓存

关于:

我确信Js/CSS文件无法获取参数


仅仅因为返回的结果是JavaScript或CSS资源,并不意味着它是服务器文件系统中的文本文件。服务器可以根据查询字符串参数进行处理,并生成定制的JavaScript或CSS响应。我没有理由不能将服务器配置为将所有
.js
文件路由到(比如)PHP处理程序,该处理程序查看查询字符串并返回与给定字段匹配的自定义内容。因此,
foo.js?v=2
可能与
foo.js?v=1
不同,如果我已经将服务器设置为这样做的话。

这是为了在有任何更新时强制浏览器重新缓存.js文件

你看,当你在一个站点上更新你的JS时,一些浏览器可能已经缓存了旧版本(以提高性能)。如果你想让他们使用你的新名字,你可以在名字的查询字段中添加一些东西,然后点击voíla!浏览器将重新获取文件


这适用于从服务器发送的所有文件。顺便说一句,这是为了避免浏览器缓存文件。附加的版本名对JavaScript文件没有影响,但对于浏览器的缓存引擎来说,它现在看起来像一个唯一的文件


例如,如果您有
scripts.js
且浏览器访问该页面,则浏览器会下载并缓存(存储)该文件,以加快下一页的访问速度。但是,如果进行了更改,浏览器可能无法识别该更改,直到缓存过期。但是,
scripts.js?v2
现在使浏览器强制重新获取,因为“名称已更改”(即使没有更改,但仅内容已更改)。

由于客户端浏览器缓存javascript和css文件,因此我们在其名称后附加一些数值,以提供文件的非缓存版本

“我确信JavaScript/CSS文件无法获取参数”


这称为缓存破坏

浏览器将缓存文件,包括查询字符串。下次更新查询字符串时,浏览器将被迫下载文件的新版本

缓存破坏有多种类型,例如:

  • 静止的
  • 日期/时间
  • 软件版本
  • 散列内容
我之前写过一篇关于缓存破坏的文章,您可能会发现这篇文章很有用:


//前端缓存中断
var cacheBust=['js/StrUtil.js','js/protos.common.js','js/conf.js','bootstrap\u ECP/js/init.js'];

对于(i=0;iA JS脚本可以在DOM中找到它自己的脚本标记,然后检查参数。我见过人们这样做是为了提供网页“小部件”使用单个脚本标记。CSS文件可以在某些浏览器中嵌入JS,因此如果他们愿意,他们也可以读取查询字符串。但我不知道这有什么用。下面的两个答案可能会合并到dup问题中。标记…文件无法获取参数。脚本可以。但HTTP服务器不传递参数除非该文件实际上是一个资源(如cgi bin),它可以在其中缓存。例如,Chrome根本不会缓存它,强制
function getQueryParams(qs) {
    qs = qs.split("+").join(" ");
    var params = {},
        tokens, re = /[?&]?([^=]+)=([^&]*)/g;
    while (tokens = re.exec(qs)) {
        params[decodeURIComponent(tokens[1])] = decodeURIComponent(tokens[2]);
    }
    return params;
}
<script type="text/javascript"> 
// 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);
}
</script>