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

<script> 标签的 async 与 defer 属性详解

<script> 标签的 async 和 defer 属性是控制 JavaScript 脚本加载与执行时机的关键机制,它们直接影响页面的渲染性能和用户体验。

正常情况下,浏览器会从顶部开始逐行解析 HTML、css文件,但是遇到 <script> 标签会暂停渲染,而去执行 javascript 代码,也就是说 JavaScript 执行会阻塞 DOM 构建,导致页面渲染延迟。

为了解决这个问题,因此HTML5引入了 async 和 defer 属性,用于控制脚本的加载和执行行为。

async和defer属性简介

使用 async 和 defer 属性的脚本都是异步加载的,都不会阻塞 HTML 文档的解析,但是他们的执行时机是不同的,下面来详细说明一下。

默认行为(无属性)

为了对比,我们需要清楚默认行为是怎样的。

<script src="script.js"></script>
执行时机

同步加载和执行。

流程:
  1. HTML 解析暂停。
  2. 下载脚本(阻塞主线程)。
  3. 执行脚本。
  4. 恢复 HTML 解析。
影响:

页面渲染会延迟,尤其是在脚本体积大或网络慢的时候。

async 属性

<script async src="script.js"></script>
执行时机

异步加载,立即执行。

流程

  1. HTML 解析继续,不阻塞。
  2. 并行下载脚本(不阻塞主线程)。
  3. 脚本下载完成后,立即暂停 HTML 解析并执行脚本。
  4. 执行完毕后,恢复 HTML 解析。
特点:
  • 多个 async 脚本的执行顺序不确定(取决于下载完成时间)。
  • 不保证在 DOMContentLoaded 事件前执行。
适用场景:

独立脚本(如广告、分析工具),不依赖 DOM 或其他脚本。

defer 属性

<script defer src="script.js"></script>
执行时机:

异步加载,延迟执行。

流程:
  1. HTML 解析继续,不阻塞。
  2. 并行下载脚本(不阻塞主线程)。
  3. 等待 HTML 解析完成(DOMContentLoaded 事件触发前),按引入顺序执行脚本。
特点:
  • 多个 defer 脚本按书写顺序执行。
  • 保证在 DOMContentLoaded 事件前执行完毕。
适用场景:

需要操作 DOM 的脚本(如交互逻辑)。
依赖其他脚本的模块(如库的初始化)。

三者表格对比

特性无属性(默认)asyncdefer
是否阻塞 HTML 解析
下载时机立即并行(异步)并行(异步)
执行时机下载后立即执行下载完成后立即执行HTML 解析完成后(按顺序)
执行顺序按引入顺序不确定(按下载完成时间)按引入顺序
DOMContentLoaded 关系阻塞事件触发可能在事件后执行在事件前执行
适用场景一般场景独立脚本依赖脚本或初始化脚本

代码示例:

<!DOCTYPE html>
<html>
<head><!-- 1. 立即执行,阻塞后续内容 --><script src="critical.js"></script><!-- 2. 并行下载,HTML 解析完成后按顺序执行 --><script defer src="library.js"></script><script defer src="app.js"></script><!-- 3. 并行下载,下载完成后立即执行(顺序不确定) --><script async src="analytics.js"></script>
</head>
<body><!-- DOM 内容 -->
</body>
</html>

注意事项

  1. 内联脚本无效
    async 和 defer 仅对外部脚本(src 属性)有效,对内联脚本无影响。
  2. 混合使用时的优先级
    async 和 defer 同时存在时,行为等同于 async(现代浏览器)。
    旧版浏览器可能忽略 defer,建议避免混用。
  3. 动态插入的脚本
    动态创建的脚本默认行为为 async,可通过 script.async = false 修改。
  4. 兼容性
    async:IE 10+,现代浏览器均支持。
    defer:IE 9+,现代浏览器均支持。

性能优化建议

  • 关键脚本:放 中,确保尽早执行(如 CSSOM 阻塞脚本)。
  • 非关键脚本:使用 defer 或 async,避免阻塞渲染。
  • 依赖关系脚本:使用 defer 并按依赖顺序引入。
  • 独立脚本:使用 async 加速执行(如广告、第三方插件)。

相关文章:

  • 分子亚型 (by deepseek)
  • 突然虚拟机磁盘只剩下几十K
  • 硬件测试 图吧工具箱分享(附下载链接)
  • 54、错误处理-【源码流程】异常处理流程
  • 【学习笔记】QUIC
  • 【斤斤计较的小Z——KMP / hash】
  • 【IQA技术专题】图像质量评价IQA技术和应用综述(万字长文!!)
  • 【20】番茄叶片病害数据集(有v5/v8模型)/YOLO番茄叶片病害检测
  • 嵌入式系统内核镜像相关(三)
  • 【普及/提高−】P1025 ——[NOIP 2001 提高组] 数的划分
  • C++实现数学功能
  • 2024年12月6级第二套第一篇
  • c++中main函数执行完后还执行其它语句吗?
  • Web APIS Day04
  • VOSK 离线中文语音识别实战:精准转文字、格式避坑全解析
  • 分类数据集 - 植物分类数据集下载
  • MySQL面试题(含答案),从简单到深入
  • 【全志V821_FoxPi】2-1 首次编译Tina5.0 SDK
  • 获取RadioButton的text,更换textview的text
  • 如何防止任务在多个项目中重复执行
  • 做礼品公司网站的费用/企业网站seo哪里好
  • 百度快照网站/2019年 2022疫情爆发
  • 山东城市建设厅网站/企业网站seo案例
  • 优酷网站谁做的/朋友圈推广平台
  • 举报网站建设公司/如何建立网站
  • 网站登录密码忘记了怎么办/人民日报评网络暴力