美文网首页
彻底搞懂async & defer

彻底搞懂async & defer

作者: peerben | 来源:发表于2019-04-19 12:29 被阅读0次

    https://github.com/xiaoyu2er/blog/issues/8

    彻底搞懂 async & defer

    TL;DR

    两者都会并行下载,不会影响页面的解析。

    defer 会按照顺序在 DOMContentLoaded 前按照页面出现顺序依次执行。

    async 则是下载完立即执行。

    兼容性

    普通 script

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

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

    浏览器会做如下处理

    • 停止解析 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

    相关文章

      网友评论

          本文标题:彻底搞懂async & defer

          本文链接:https://www.haomeiwen.com/subject/ccjqgqtx.html