Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/407.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/90.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
Javascript 正在运行的脚本标记是否阻止下载其他脚本标记?_Javascript_Html_Optimization_Script Tag - Fatal编程技术网

Javascript 正在运行的脚本标记是否阻止下载其他脚本标记?

Javascript 正在运行的脚本标记是否阻止下载其他脚本标记?,javascript,html,optimization,script-tag,Javascript,Html,Optimization,Script Tag,这来自中的index.html,就在标记之前: <!-- JavaScript at the bottom for fast page loading: http://developer.yahoo.com/performance/rules.html#js_bottom --> <!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline --> &

这来自中的index.html,就在
标记之前:

<!-- JavaScript at the bottom for fast page loading: http://developer.yahoo.com/performance/rules.html#js_bottom -->

<!-- Grab Google CDN's jQuery, with a protocol relative URL; fall back to local if offline -->
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<script>window.jQuery || document.write('<script src="js/vendor/jquery-1.7.2.min.js"><\/script>')</script>

<!-- scripts concatenated and minified via build script -->
<script src="js/plugins.js"></script>
<script src="js/main.js"></script>
<!-- end scripts -->

<!-- Asynchronous Google Analytics snippet. Change UA-XXXXX-X to be your site's ID.
     mathiasbynens.be/notes/async-analytics-snippet -->
<script>
  var _gaq=[['_setAccount','UA-XXXXX-X'],['_trackPageview']];
  (function(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
  g.src=('https:'==location.protocol?'//ssl':'//www')+'.google-analytics.com/ga.js';
  s.parentNode.insertBefore(g,s)}(document,'script'));
</script>

window.jQuery | | document.write(“”)
var_gaq=[[''u setAccount','UA-XXXXX-X'],[''u trackPageview'];
(函数(d,t){var g=d.createElement(t),s=d.getElementsByTagName(t)[0];
g、 src=('https:'==location.protocol?'//ssl':'//www')+'.google analytics.com/ga.js';
s、 parentNode.insertBefore(g,s)}(文档,'script');
我知道脚本标签可以阻止并行下载,这就是为什么

我的问题:浏览器真的要等到jQuery完全下载并执行,然后才开始下载
plugins.js
,然后下载
script.js

或者,它是否向前看,尽可能快地(并行地)开始所有脚本的下载,只是延迟每个脚本的执行,直到前一个脚本完成执行

我的问题:浏览器真的在开始下载
plugins.js
script.js
之前等待jQuery完全下载和执行吗

它可能会也可能不会,但可能不会;浏览器尝试(在限制范围内)并行下载,以加快页面加载速度

或者,它是否向前看,尽可能快地(并行地)开始所有脚本的下载,只是延迟每个脚本的执行,直到前一个脚本完成执行


对,因为该部分是(缺少
async
defer
属性)。正如您的示例所示,在脚本运行之前,它甚至不一定确定脚本的运行顺序,因为脚本可能会插入另一个脚本。但是它可以下载并准备好它们。

HTML5规范说:

如果两个属性[即async和defer]都不存在,则将获取脚本并 在用户代理继续解析之前立即执行 页面

如果页面未被解析,则用户代理无法知道哪些后续资源需要获取,因此严格一致的浏览器应该在第一个资源实际执行之前无法获取更多资源

要了解这一点的意义,请假设第一个脚本包含

document.write("<!--"); 

document.write遇到(
)错误。这可能会导致跳过一个或多个资源引用。

我发现此详细信息更适合回答此问题,请复制以下内容,以获取更多详细信息

啊,非常简单。在这里,浏览器将并行下载两个脚本并尽快执行它们,保持它们的顺序。“2.js”在“1.js”执行之前(或执行失败之前),“1.js”在上一个脚本或样式表执行之前不会执行,等等

不幸的是,当所有这些发生时,浏览器会阻止页面的进一步呈现。这是由于“web的第一个时代”的DOM API造成的允许将字符串附加到解析器正在处理的内容上,例如document.write。较新的浏览器将继续在后台扫描或解析文档,并触发下载它可能需要的外部内容(js、图像、css等),但渲染仍然被阻止


这就是为什么性能世界的伟大和美好建议将脚本元素放在文档的末尾,因为它会尽可能少地阻止内容。不幸的是,这意味着浏览器在下载所有HTML之前看不到脚本,而到那时它就开始下载其他内容,如CSS、图像和视频d iframes。现代浏览器足够聪明,可以优先考虑JavaScript而不是图像,但我们可以做得更好。

这是否意味着像JavaScript异步加载技术这样的最佳实践在今天的新浏览器中不那么重要了?他们只记得文档中出现外部脚本链接的顺序来执行它们吗在并行下载之后?这似乎是因为如果我看一下chrome开发者工具/资源面板,大量的js文件同时开始下载,并且不会像书籍中的截图(例如“更快的网站”)那样被阻止。@malthoff:他们只记得并行下载后,文档中出现外部脚本链接以执行它们的顺序吗?“正确。如果您有(比如)五个脚本,但加载其中两个脚本的顺序并不重要,您可以将它们标记为异步,在这种情况下(在现代浏览器上)他们一下载完就会得到评估,不管顺序如何。“但它可以下载并准备好。”但实际上,浏览器会这样做吗?@callum:哦,是的。浏览器会尽其所能让HTTP线程保持忙碌,只要他们有内容要抓取。这都是第一个显示完成的页面。