我有几个关于<script>标签的async和defer属性的问题,据我的理解,它只在HTML5浏览器中工作。
我的一个站点有两个外部JavaScript文件,目前位于</body>标记上方;第一个是来自谷歌的jquery,第二个是一个本地外部脚本。
在网站加载速度方面
在我在页面底部的两个脚本中添加async是否有任何优势?
在这两个脚本中添加async选项并将它们放在<head>的页面顶部是否有任何优势?
这是否意味着他们会在页面加载时下载?
我认为这会导致HTML4浏览器的延迟,但是它会加速HTML5浏览器的页面加载吗?
使用<script defer src=…
在<head>中加载带有属性的两个脚本是否与在</body>之前加载脚本具有相同的影响?
同样,我认为这会降低HTML4浏览器的速度。
使用<script async src=…
如果我有两个脚本异步启用
他们会同时下载吗?
还是一页一页地看?
脚本的顺序会成为问题吗?例如,一个脚本依赖于另一个脚本,所以如果一个脚本下载得更快,第二个脚本可能无法正确执行等等。
最后,在HTML5得到更广泛的应用之前,我是否应该保持现状?
async和defer脚本都立即开始下载,而不需要暂停解析器,并且都支持可选的onload处理程序,以满足执行初始化(依赖于脚本)的常见需求。
The difference between async and defer centers around when the script is executed. Each async script executes at the first opportunity after it is finished downloading and before the window’s load event. This means it’s possible (and likely) that async scripts are not executed in the order in which they occur in the page. Whereas the defer scripts, on the other hand, are guaranteed to be executed in the order they occur in the page. That execution starts after parsing is completely finished, but before the document’s DOMContentLoaded event.
来源和更多细节:这里。
面对同样的问题,现在清楚地了解两者将如何工作。希望这个参考链接会有帮助…
异步
当您将async属性添加到脚本标记时,将发生以下情况。
<script src="myfile1.js" async></script>
<script src="myfile2.js" async></script>
发出并行请求来获取文件。
继续解析文档,就像它从未被打断过一样。
文件下载后立即执行各个脚本。
推迟
延迟与异步非常相似,但有一个主要区别。下面是浏览器遇到带有defer属性的脚本时会发生的情况。
<script src="myfile1.js" defer></script>
<script src="myfile2.js" defer></script>
进行并行请求以获取单个视频文件。
继续解析文档,就像它从未被打断过一样。
即使已经下载了脚本文件,也要完成文档解析。
按照文档中出现的顺序执行每个脚本。
参考:异步和延迟的区别
渲染引擎经过几个步骤,直到它在屏幕上绘制任何东西。
它是这样的:
Converting HTML bytes to characters depending on encoding we set to the document;
Tokens are created according to characters. Tokens mean analyze characters and specify opening tangs and nested tags;
From tokens separated nodes are created. they are objects and according to information delivered from tokenization process, engine creates objects which includes all necessary information about each node;
after that DOM is created. DOM is tree data structure and represents whole hierarchy and information about relationship and specification of tags;
CSS也是同样的过程。CSS渲染引擎为CSS创建不同的/分离的数据结构,但它被称为CSSOM (CSS对象模型)
Browser只适用于对象模型,所以它需要知道所有关于DOM和CSSDOM的信息。
下一步是以某种方式组合DOM和CSSOM。因为没有CSSOM浏览器不知道在渲染过程中如何样式化每个元素。
以上所有信息意味着,你在html (javascript, css)浏览器中提供的任何东西都会暂停DOM构建过程。如果你熟悉事件循环,有一个简单的规则事件循环如何执行任务:
执行宏任务;
执行微任务;
呈现;
所以当你提供Javascript文件时,浏览器不知道JS代码要做什么,并停止所有的DOM构造过程,Javascript解释器开始解析和执行Javascript代码。
即使你在body标签的末尾提供Javascript,浏览器也会进行HTML和CSS的所有上述步骤,但渲染除外。它会找到Script标签并停止,直到JS完成。
但是HTML为脚本标记提供了两个额外的选项:async和defer。
Async -意思是当代码被下载时执行,并且在下载过程中不阻塞DOM构造。
延迟——意思是在代码下载和浏览器完成DOM构造和渲染过程后执行。