【美团】异步加载 JS 脚本时,async 与 defer 有何区别

以下图片取自 whatwg 的规范,可以说是最权威的图文解释了,详细参考原文[2]
async 与 defer 区别

正常情况下,即 <script> 没有任何额外属性标记的情况下,有几点共识

  1. JS 的脚本分为「加载、解析、执行」几个步骤,简单对应到图中就是 fetch (加载) 和 execution (解析并执行)
  2. 「JS 的脚本加载(fetch)且执行(execution)会阻塞 DOM 的渲染」,因此 JS 一般放到最后头

deferasync 的区别如下:

  • 相同点: 「异步加载 (fetch)」
  • 不同点:
    • async 加载(fetch)完成后立即执行 (execution),因此可能会阻塞 DOM 解析;
    • defer 加载(fetch)完成后延迟到 DOM 解析完成后才会执行(execution)**,但会在事件 DomContentLoaded 之前

拓展

当以下 index.js 加载时,属性是 asyncdefer 时,输出有何不同?

「index.html」

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title></title>
</head>
<body>
  <script src="./defer.js" defer></script>
  <script src="./async.js" async></script>
  <script>
    console.log('Start')
    document.addEventListener('DOMContentLoaded', () => {
      console.log('DCL')
    })
  
</script>
</body>
</html>

「derfer.js」

console.log('Defer Script')

「async.js」

console.log('Async Script')

答:defer 总是在 DCL 之前输出,但是 async 有可能之前也有可能之后

相关推荐

  • 人工智能将如何增强平台工程和DevEx?
  • C++“中年危机”有救了!C++之父新动作!
  • 蔡崇信、周靖人、王坚、王小川指路大模型
  • AI 编程时代已至,大模型如何助力开发者打造新质生产力?
  • 在鹅厂晋级了!
  • 四季酒店里的低调招商会
  • 23日开抢!最高可领11111元京东红包
  • Java 8 腰斩!Java 11 和 Java 17 使用率超过 Java 8
  • 拜登政府发布新的AI行政命令,称确保AI将为美国人服务
  • 解决多模态大模型幻觉问题的秘密武器:“啄木鸟”免重训方法!哪里出问题啄哪里!
  • 一个小妙招从Prompt菜鸟秒变专家!加州大学提出PromptAgent,帮你高效使用ChatGPT!
  • 豆瓣 9.2 分!风靡全球的线代教材更新了!PDF 开放下载
  • 计算机视觉还有不卷的方向能发顶会吗?
  • 直播预告 | 非凸科技高频量化研究员:深度学习在订单簿预测重构的应用
  • 像搭乐高一样做数学定理证明题,GPT-3.5证明成功率达新SOTA
  • NeurIPS 2023 Spotlight | 探索不变学习中的充分必要因果
  • 电子书下载 | 数据存储与架构&自然语言处理
  • OPPO智能增长算法核心架构与应用
  • 大数据的里子
  • 今天有什么搞笑|上海万圣节cos众生相,更适合中国宝宝体质