javascript - 浏览器是否在单个线程中执行加载的脚本?

标签 javascript html performance asynchronous

我可以这样写:

<script src="file1.js" defer></script>
<script src="file2.js" defer></script>
<script src="file3.js" defer></script>

这意味着文件可以并行下载,但只能一个接一个地执行。但是,我可以添加 async 属性以允许浏览器以随机顺序执行代码。

<script src="file1.js" async></script>
<script src="file2.js" async></script>
<script src="file3.js" async></script>

如果我对性能提升感兴趣,是否可以更快地执行第二个 block ?正如我所见,如果浏览器在一个线程中执行所有 JavaScript,那么 3 个脚本的总执行时间将与第一个 block 没有什么不同,只是执行顺序可能不同。我说得对吗?

最佳答案

If I'm interested in the performance boost, can the second block be executed faster?

由于脚本将异步下载和执行,是的,它会减少页面加载时间。

Script-injected "async scripts" considered harmful 的作者比较了三种包含脚本的方法:注入(inject)脚本、阻塞脚本和具有 async 属性的脚本。结果是:

                    script execution   onload  
 ----------------- ------------------ -------- 
  script-injected   ~3.7s              ~3.7s   
  blocking script   ~2.7s              ~2.7s   
  async attribute   ~1.7s              ~2.7s  

如您所见,async 属性提供最佳性能。如果脚本执行顺序无关紧要,您绝对应该使用它。


关于你的标题问题:

Do browsers execute loaded scripts in a single thread?

是的,因为 JavaScript 是单线程的,但在性能方面并不重要。下载脚本比实际执行脚本花费的时间要长得多,因此您应该重点优化下载部分。


我做了一个测试。我创建了一个简单的脚本:

for (var i = 0; i < 1e8; i++);

我将同一个脚本放入两个文件中,test1.jstest2.js。然后我制作了两个 HTML 文件,第一个没有 async,第二个有:

test1.html:

<!DOCTYPE html>
<script src="test1.js"></script>
<script src="test2.js"></script>

test2.html:

<!DOCTYPE html>
<script src="test1.js" async></script>
<script src="test2.js" async></script>

然后我在浏览器中打开这些 HTML 文件,并在 Chrome DevTools 中检查时间轴标签:

test1.html:

test2.html:

如您所见,在这两种情况下,脚本都不是异步执行的。

另请参阅:Is JavaScript guaranteed to be single-threaded? .

关于javascript - 浏览器是否在单个线程中执行加载的脚本?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36565888/

相关文章:

javascript - 扩展错误 es6 类模块问题

jquery - HTML 下拉菜单删除 LI 元素之间的空白

javascript - Div 在提交表单时创建

Oracle 解释计划估计索引范围扫描的基数不正确

javascript - 根据链接文档中的值减少 CouchDB

window.setInterval 中的 JavaScript 'this' 范围

html - Bootstrap 容器上的HTML内容

c++ - boost Weak_Ptr : Destruction is more expensive than expected

c++ - 自定义语言中 C++ 的 C-Wrapper DLL 的性能

javascript - 每页 VS 不同的小 js 文件。 1x 站点范围的 js 文件?