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

行走在奥卡万戈河中的大象,博茨瓦纳,非洲南部
(© Markus Pavlowsky/Getty Images)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 有可能之前也有可能之后

Reference

[1]

Daily Question: https://q.shanyue.tech

[2]

原文: https://html.spec.whatwg.org/multipage/scripting.html#the-script-element

相关推荐

  • 也看引入自我反思的大模型RAG检索增强生成框架:SELF-RAG的数据构造及基本实现思路
  • Character AI:如何把LLM变成人类想象力引擎?
  • 清华版「AutoGPT」开源,通用智能体XAgent,各种任务都能做
  • 1020.AI日报:DALL·E 3正式上线ChatGPT Plus和企业版
  • 刷到这个“没有译制片腔调的翻译”视频了么?AI可以解决!
  • 突发!美国升级对华芯片出口禁令
  • 前阿里员工坦言:32岁,我的职业生涯要结束了
  • DALL·E 3正式上线ChatGPT;智谱AI今年已融资25亿元;科大讯飞回应美国AI芯片出口管制丨AIGC大事日报
  • 千亿视讯市场:智慧物联巨头大华股份增长新引擎?
  • AI服务器缺货真相调查:两天涨价30万,连“味精大王”都入场了
  • 研发日常踩坑-Mysql分页数据重复
  • 开发者的“贴身伴侣”
  • MySQL到TiDB:Hive Metastore横向扩展之路
  • ZGC关键技术分析
  • AlmaLinux不使用 “红帽代码”,如何保持兼容RHEL
  • 头哥对谈厉启鹏:开源技术的应用和商业价值分析
  • Mojo登陆Mac,比Python快90,000倍
  • IT BOOK多得,2023年度清华社“荐书官”有奖招募啦!
  • 一文掌握在PyCharm中正确设置Python项目
  • 一个人将模型训练单机平台升级成分布式