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

深入解析 HTML 中 `<script>` 标签的 async 和 defer 属性

一、背景与问题

在网页性能优化中,脚本的加载和执行方式直接影响页面渲染速度和用户体验。传统 <script> 标签的阻塞行为可能导致页面“白屏”,而 asyncdefer 属性提供了非阻塞的解决方案。本周重点研究二者的差异、适用场景及实际应用。


二、核心概念解析

1. 默认 <script> 的行为

  • 阻塞 HTML 解析‌:浏览器遇到 <script> 标签时,会暂停 HTML 解析,下载并执行脚本,完成后继续解析。
  • 问题‌:大脚本或网络延迟时,显著延长页面渲染时间。

2. async 属性

  • 行为‌:
    • 脚本异步下载(与 HTML 解析并行)。
    • 下载完成后立即执行‌,执行时会再次阻塞 HTML 解析。
  • 特点‌:
    • 脚本执行顺序‌不确定‌(先下载完的先执行)。
    • 适用于‌独立且无依赖‌的脚本(如统计分析、广告 SDK)。

3. defer 属性

  • 行为‌:
    • 脚本异步下载(与 HTML 解析并行)。
    • 脚本延迟到 ‌HTML 解析完成后、DOMContentLoaded 事件前‌ 按顺序执行。
  • 特点‌:
    • 执行顺序与声明顺序‌严格一致‌。
    • 适用于‌依赖 DOM 或其他脚本‌的场景(如页面初始化逻辑)。

4. 对比表格

属性加载方式执行时机执行顺序适用场景
默认同步立即执行按声明顺序
async异步下载完立即执行不确定独立脚本(如 GA 统计)
defer异步HTML 解析后顺序执行按声明顺序依赖型脚本

三、示例与验证

代码示例

<script src="script1.js" async></script>  
<script src="script2.js" defer></script>  
<script src="script3.js"></script>

执行顺序模拟
默认脚本‌:script3.js 阻塞 HTML 解析,优先执行。
async 脚本‌:若 script1.js 下载速度快于 HTML 解析,可能先于 defer 脚本执行。
defer 脚本‌:script2.js 在 HTML 解析完成后按顺序执行。
四、最佳实践
优先使用 defer‌:确保脚本顺序执行且不阻塞渲染。
谨慎使用 async‌:仅用于无依赖的第三方脚本。
动态脚本‌:通过 document.createElement('script') 插入的脚本默认具有 async 行为。
五、兼容性与注意事项
兼容性‌:
defer 支持所有主流浏览器(包括 IE10+)。
async 不支持 IE9 及以下。
注意点‌:同时使用 async 和 defer 时,现代浏览器以 async 优先。

附录‌

MDN 文档
测试 Demo 链接(可选)
text
Copy Code

### 说明  
1. &zwnj;**兼容性**&zwnj;:此 Markdown 文件可被所有支持 Markdown 的工具(如 Typora、VS Code、GitHub)正确解析。  
2. &zwnj;**语法重点**&zwnj;:  
   - 代码块用 ` ````包裹,并指定语言(如 `html`)。  
   - 表格使用 `|` 分隔列,`---` 分隔表头。  
   - HTML 标签用反引号包裹避免解析冲突(如 ``<script>``)。
http://www.dtcms.com/a/131186.html

相关文章:

  • 高并发短信系统设计:基于SharingJDBC的分库分表、大数据同步与实时计算方案
  • autogenstudio设置
  • Redisson的红锁,分段锁,公平锁,联锁。。。。。。
  • 信息安全管理与评估2021年国赛正式卷答案截图以及十套国赛卷
  • 高负载WEB服务器--Tomcat
  • 深入理解 v-show 指令及其使用方法
  • 【本地图床搭建】宝塔+Docker+MinIO+PicGo+cpolar:打造本地化“黑科技”图床方案
  • github进阶使用教程
  • .net执行脚本:通过字符串的形式来执行按钮的点击操作
  • 【Python实时数据处理】流式计算与异步编程实战
  • 微服务之protobuf:下载、语法和使用一站式教程
  • Linux文件传输:让数据飞起来!
  • vue2项目集成Tailwindcss
  • 6.1 GitHub亿级数据采集实战:双通道架构+三级容灾设计,破解API限制与反爬难题
  • 青少年编程与数学 02-016 Python数据结构与算法 18课题、组合数学算法
  • Ubuntu 安装 Cursor AppImage 到应用程序中
  • n8n 本地部署及实践应用,实现零成本自动化运营 Telegram 频道(保证好使)
  • linux 如何查看mac地址?喂饭版
  • STM32 HAL库 OLED驱动实现
  • Go语言中的runtime包是用来做什么的?
  • 大模型面经 | 春招、秋招算法面试常考八股文附答案(RAG专题二)
  • Linux实现翻译以及群通信功能
  • 深度学习与力学建模融合的骨力学性能研究
  • 二叉树-算法小结
  • MATLAB双目标定
  • 零基础HTML·笔记(持续更新…)
  • 生成式AI与RAG架构:如何选择合适的向量数据库?
  • 山东大学软件学院创新项目实训(11)之springboot+vue项目接入deepseekAPI
  • c++STL——string学习的模拟实现
  • opencv 识别运动物体