为什么Chrome似乎异步请求Javascript文件?

时间:2015-02-04 22:22:32

标签: javascript html

鉴于我的HTML页面请求3个脚本文件:

<script src="a.js"></script>
<script src="b.js"></script>
<script src="c.js"></script>
<link rel="stylesheet" type="text/css" href="d.css"/>

到目前为止,我的理解是浏览器请求a.js和文档在下载并执行a.js之前不再进行解析(脚本标记上没有async属性的默认行为)。

但是现在看一下Chrome开发者工具,选中了加载框的时间线标签,我看到并得到了以下几点:

Send Request (this is request for HTML page itself)
Receive data
Receive data
Receive data (this are pockets coming if I understand correctly)
Finish Loading (here page is loaded now)
Parse HTML (now browser starts reading actual HTML code)
Send Request (a.js)

现在,在这里,我希望浏览器暂停所有内容并等待a.js完全下载,然后执行,然后再开始解析HTML并阅读b.js,其余的) 不过我输出了这个输出:

Send Request b.js (Why is this happening, a.js is not finished loading yet)
Send Request c.js (again why?)
Send Request d.css 

只有这样我才能得到:

Finish Loading a.js

浏览器执行a.js,然后只有html中的SCRIPT标记按顺序执行其他文件(如果已经下载)。

现在我的问题是,如果b.js未完全下载并执行,浏览器如何知道请求c.jscssa.js文件? Chrome是否应用了一些优化和加速过程?如果a.js运行时修改并删除其余的SCRIPT代码,该怎么办?请求被浪费了吗?或者我只是阅读输出错误?

2 个答案:

答案 0 :(得分:1)

答:因为每个JS文件都是在HTML中指定的。浏览器尝试批量下载尽可能多的下载以节省时间。从右键单击某个内容并选择&#34;保存链接为&#34;即使你还没有指定文件名,它也会被下载。如果您然后点击取消而不是指定名称/位置,则浪费了已下载的任何内容。

Chrome会针对页面中的资源应用类似的策略。如果a.js删除任何/所有后续脚本标签,那么是 - 他们的下载是徒劳的。

另一种选择是性能不稳定。

答案 1 :(得分:1)

如果要下载多个内容,浏览器通常会并行下载其中的几个。并行下载的确切数量因浏览器而异。

注意:CSS应该在JS之前,以便从并行下载中获得最大收益。