JS中的async和defer属性详解

JS中的async和defer属性详解

在HTML中,<script>标签的asyncdefer属性用于控制外部JavaScript文件的加载和执行行为,这对页面性能有重要影响。


基本行为对比

属性加载时机执行时机执行顺序保证
无属性立即停止HTML解析加载加载完成后立即执行按文档顺序
async异步加载加载完成后立即执行不保证顺序
defer异步加载HTML解析完成后,DOMContentLoaded前执行按文档顺序

详细说明

1. 无任何属性(默认行为)

<script src="script.js"></script>
  • 行为

    • 遇到script标签时,暂停HTML解析
    • 立即下载脚本文件
    • 下载完成后立即执行脚本
    • 脚本执行完成后继续HTML解析
  • 影响

    • 会阻塞页面渲染
    • 可能导致用户看到空白页面时间延长

2. async属性

<script async src="script.js"></script>
  • 行为

    • 异步下载脚本(不阻塞HTML解析)
    • 下载完成后立即执行(可能中断HTML解析)
    • 多个async脚本的执行顺序不确定(先下载完的先执行)
  • 适用场景

    • 完全独立的第三方脚本(如广告、分析工具)
    • 不依赖DOM或其他脚本的代码
    • 对执行顺序无要求的脚本

3. defer属性

<script defer src="script.js"></script>
  • 行为

    • 异步下载脚本(不阻塞HTML解析)
    • 在所有HTML解析完成后,DOMContentLoaded事件前按文档顺序执行
    • 保证多个defer脚本的执行顺序
  • 适用场景

    • 需要操作DOM的脚本
    • 有依赖关系的多个脚本
    • 希望延迟执行但不阻塞页面渲染的情况

简单的图示说明

无属性:  [下载][执行]       (阻塞HTML解析)
async:  [下载]...[执行]    (下载不阻塞,执行可能阻塞)
defer:  [下载].........[执行] (都不阻塞,最后顺序执行)

现代最佳实践

  1. 关键脚本:无属性或内联,放在<body>底部
  2. 非关键脚本:使用defer
  3. 完全独立脚本:使用async
  4. 模块化脚本:使用<script type="module">(默认具有defer行为)

注意事项

  • defer脚本按照在文档中的顺序执行
  • async脚本无法保证执行顺序
  • 同时使用asyncdefer时,现代浏览器会优先async
  • 动态创建的<script>元素默认具有async行为
  • type="module"的脚本默认具有defer行为,可以添加async属性改变行为
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值