【转】完全搞懂 async & defer

原文地址:https://github.com/xiaoyu2er/blog/issues/8javascript

普通 script

先来看一个普通的 script 标签。html

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

浏览器会作以下处理java

  • 中止解析 document.
  • 请求 a.js
  • 执行 a.js 中的脚本
  • 继续解析 document

defer

<script src="d.js" defer></script>
<script src="e.js" defer></script>
  • 不阻止解析 document, 并行下载 d.js, e.js
  • 即便下载完 d.js, e.js 仍继续解析 document
  • 按照页面中出现的顺序,在其余同步脚本执行后,DOMContentLoaded 事件前 依次执行 d.js, e.js。

async

<script src="b.js" async></script>
<script src="c.js" async></script>
  • 不阻止解析 document, 并行下载 b.js, c.js
  • 当脚本下载完后当即执行。(二者执行顺序不肯定,执行阶段不肯定,可能在 DOMContentLoaded 事件前或者后 )

其余

  • 若是 script 无 src 属性,则 defer, async 会被忽略
  • 动态添加的 script 标签隐含 async 属性

结论

  • 二者都不会阻止 document 的解析
  • defer 会在 DOMContentLoaded 前依次执行 (能够利用这两点哦!)
  • async 则是下载完当即执行,不必定是在 DOMContentLoaded 前
  • async 由于顺序无关,因此很适合像 Google Analytics 这样的无依赖脚本

Reference

相关文章
相关标签/搜索