script 标签中 defer 和 async 的区别

1,835 阅读1分钟

默认情况下,脚本的下载和执行会根据文档的先后顺序同步进行,当脚本下载和执行时,文档解析就会被阻塞,在脚本下载或执行结束后才会继续往下解析。

1、没有 defer async 属性

<script src="script.js"></script>

没有 defer 或 async,浏览器会立即加载并执行指定的脚本,“立即”指的是在渲染该 script 标签之下的文档元素之前,也就是说不等待后续载入的文档元素,读到就加载并执行。

1、defer 属性

<script defer src="script.js"></script>

当Script中有defer属性时,文档解析和脚本加载是异步的,等文档解析完脚本才开始执行。

2、async 属性

<script async src="script.js"></script>

当Script中有async 属性时,文档解析和脚本加载也是异步的,脚本下载完成后会停止HTML解析,执行脚本,脚本解析完继续HTML解析。

3、当 defer 和 async 同时存在时

执行效果和 async 一致

4、图解

蓝色线代表网络读取(下载),红色线代表执行时间,这俩都是针对脚本的;绿色线代表 HTML 解析