当前位置: 首页 > article >正文

JS—script标签加载:1分钟掌握async与defer

个人博客:haichenyi.com。感谢关注

一. 目录

  • 一–目录
  • 二–DOMContentLoaded事件
  • 三–async与defer

二. DOMContentLoaded事件

  概念: DOMContentLoaded是浏览器提供的一个关键事件,它标致着HTML文档解析完成且DOM树构建完毕(无需等待样式表和外部资源加载完毕)。
核心特征

特性说明
触发时机HTML解析完成,DOM树就绪时触发,无需等待图片等外部资源加载
与load事件的区别load事件需要等待图片样式等外部资源加载完毕才触发,晚于DOMContentLoaded事件
适用场景需要DOM构建完毕就需要做的处理,如初始化交互功能、绑定事件等等

三. async与defer

  async与defer都是用于优化脚本加载行为的html属性。

  1. 共同点: 都是异步下载脚本,不阻塞html解析
  2. 核心对比
特性asyncdefer
​执行时机下载完毕之后立即执行,可能中断HTML解析下载完成之后,HTML解析完毕,DOMContentLoaded之前按顺序执行
执行顺序无序(下载完成后立即执行)有序(按文档顺序执行)
适用场景独立脚本(如统计、广告),无依赖且无需操作 DOM依赖其他脚本或需操作 DOM 的脚本。
  1. 详细说明
  • 普通脚本(无属性)
    行为: 阻塞HTML的解析,下载并执行完成之后接着解析HTML。
    缺点: 脚本比较大的时候,HTML的页面加载延迟。
  • async脚本
    流程: 异步下载—>下载完成之后立即执行
    风险: 若脚本需要操作DOM,当脚本执行的时候,DOM可能还未创建,需要自行监听DOMContentLoaded事件
    示例: 适合不依赖其他脚本独立执行的代码(统计脚本,广告脚本等等)
  • defer脚本
    流程: 异步下载—>下载完成之后,等待HTML解析完成按文档顺序执行,DOMContentLoaded事件之前执行
    优势: 不阻塞解析,并且保证顺序执行,适合依赖脚或DOM操作
    示例: 引入库(如 jQuery)及其插件时,确保插件在库之后执行。
  1. 特殊情况
  • async和defer共存的情况下,async优先级更高,defer会被忽略
  • 动态添加脚本,默认行为类似async,可设置async=false,模拟defer
  1. 执行顺序示例
<script defer src="defer1.js"></script>  <!-- 先执行 -->
<script async src="async1.js"></script>  <!-- 可能最先或最后执行 -->
<script defer src="defer2.js"></script>  <!-- 在 defer1 后执行 -->
//从上往下解析,解析到defer1.js,异步下载
//解析到async1.js,异步下载
//解析到defer2.js,异步下载
//当defer1.js下载完成,等着html解析完成之后执行
//当defer2.js下载完成之后,等defer1.js执行完后之后,执行
//async1只要下载完了之后就执行,可能在defer1.js的前面,可能在defer1.js的后面,也可能在defer2.js的前面,也可能在它的后面,都要看网络情况。async1.js下载的快慢决定的。
  1. 如何选择?
  • 用 async: 脚本独立、无依赖、不操作 DOM 或能处理延迟执行。
  • 用 defer: 需操作 DOM、有依赖关系或要求按顺序执行。
  • 普通脚本: 建议仅在小型脚本或需同步执行时使用(如文档底部)。

通过合理使用 async 和 defer,可显著提升页面加载性能,同时确保脚本逻辑正确性。

原文地址:https://blog.csdn.net/qq_27634797/article/details/146475320
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.kler.cn/a/600752.html

相关文章:

  • TensorDataser和DataLoader的解释与使用
  • 最长公共子序列LCS -- 全面分析版
  • 爱普生SG-3031CMA有源晶振在汽车雷达中的应用
  • vue2相关 基础命令
  • [NO-WX179]基于springboot+微信小程序的在线选课系统
  • W、M、C练题笔记(持续更新中)
  • 适合各个层次的 7 个计算机视觉项目【1】:植物病害检测
  • 内核编程十二:打印内核态进程的属性
  • 传统 embedding vs. P-Tuning 里的 embedding
  • (二)手眼标定——概述+原理+常用方法汇总+代码实战(C++)
  • 稳定运行的以Microsoft Azure Cosmos DB数据库为数据源和目标的ETL性能变差时提高性能方法和步骤
  • 深入解析 C++20 中的 std::bind_front:高效函数绑定与参数前置
  • 【蓝桥杯每日一题】3.25
  • MySQL数据库中常用的命令
  • 竞品已占据市场先机,如何找到差异化突破口
  • Next.js 中间件鉴权绕过漏洞 (CVE-2025-29927)
  • showdoc在服务器docker部署后如何关闭注册功能
  • XSS复现漏洞简单前八关靶场
  • 余弦退火算法与学习率预热
  • 依肤婗:以科研实力引领 问题性肌肤护理新标准