异步与延迟属性
script中会有async 和 defer 属性,而且面试中常常会被问到,特意总结了一下
- 绿色 HTML解析
- 灰色 解析停顿
- 蓝色 script下载
- 粉色 script执行
<script>
script 在没有任何属性的时候,从HTML开始解析,直到命中脚本文件,此时解析会停止并请求获取文件(比如他是外部的),之后会在恢复解析之前执行该脚本
<script async>
script + async
后会在HTML解析之间下载文件(异步),并在下载完后寻找时机会暂停HTML解析器执行
<script defer>
script + defer
后在 HTML解析期间下载文件,并且仅在解析器完成后执行。defer
脚本也保证按照它们在文档中出现的顺序执行
通常我们何时会使用的时候需要遵守哪些规则呢?
- 如果脚本是模块化的并且不依赖任何脚本,那么使用
async
. - 如果脚本依赖或被另一个脚本依赖,则使用
defer
- 如果
async
脚本依赖于其他脚本,需要使用不设置任何异步的内联脚本