async、defer 和 module 属性的比较

async、defer 和 module 属性的比较

这些属性都用于控制 JavaScript 脚本的加载和执行行为,以下是它们的详细比较:

async 属性

  • 加载行为 :异步加载脚本,不阻塞 HTML 解析(执行会阻塞)
  • 执行时机:脚本下载完成后立即执行(可能在 HTML 解析完成前)
  • 执行顺序:不保证多个 async 脚本的执行顺序(先下载完的先执行)
  • 适用场景:不依赖 DOM 或其他脚本的独立脚本(如统计分析)

defer 属性

  • 加载行为:异步加载脚本,不阻塞 HTML 解析
  • 执行时机:脚本在 HTML 解析完成后、DOMContentLoaded 事件前按顺序执行
  • 执行顺序:保持多个 defer 脚本在文档中的顺序
  • 适用场景:需要操作 DOM 或有依赖关系的脚本

module 属性

  • 加载行为:默认行为类似 defer(除非同时使用 async)

  • 执行时机:

    • 作为模块时默认 defer
    • 加上 async 时行为类似普通 async 脚本
  • 特殊行为:

    • 启用 ES6 模块语法
    • 自动应用严格模式
    • 有独立的模块作用域
    • 支持跨域请求和 CORS
    • 会延迟到所有导入模块解析完成才执行
  • 适用场景:使用 ES6 模块系统的现代 JavaScript 代码

组合使用

  • <script type="module">:等同于 defer
  • <script type="module" async>:异步加载,下载完立即执行(不保证顺序)

对比表格

属性/行为 async defer module (默认) module + async
加载是否阻塞解析 否 否 否 否
执行时机 下载完立即执行 DOM 解析完成后 DOM 解析完成后 下载完立即执行
保持顺序 否 是 是 否
模块系统 否 否 是 是

最佳实践:现代开发推荐使用 <script type="module"> 以获得模块化的好处,同时保持 defer 的有序执行特性。

相关推荐
子兮曰3 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰3 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万3 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝3 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋3 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁3 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95273 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大3 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师3 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学3 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端