跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI 生图工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
JavaScript大前端

<script> 标签的 defer 与 async 属性区别及执行顺序详解

script 标签的 defer 和 async 属性是优化网页加载性能的关键手段。defer 确保脚本在 HTML 解析完成后按文档顺序执行,适合依赖 DOM 或相互关联的脚本;async 则下载完成即执行,不保证顺序,适用于独立模块。开发者应根据脚本依赖关系选择合适的属性,以提升页面渲染速度。

怪力乱神发布于 2025/1/15更新于 2026/10/980 浏览
<script> 标签的 defer 与 async 属性区别及执行顺序详解

script 标签中 defer 和 async 属性的作用及区别

在现代 Web 开发中,JavaScript 的使用几乎是不可避免的。随着应用逻辑日益复杂,脚本文件体积也在增长。为了优化页面加载性能,浏览器提供了 async 和 defer 两个属性来改变脚本的加载和执行方式。理解它们的差异对于提升用户体验至关重要。

<script> 标签的 defer 属性

工作原理

defer 是一个布尔属性。当存在时,它告诉浏览器不要阻塞 HTML 解析,而是并行下载脚本。关键点是:脚本会在整个 HTML 文档解析完成后,按照它们在文档中出现的顺序执行。

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

即使 script2.js 比 script1.js 先下载完成,script1.js 也会先执行。这保证了依赖关系的正确性。

代码示例

下面是一个简单的测试结构:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <script defer src="script1.js"></script>
    <script defer src="script2.js"></script>
</body>
</html>

在 script1.js 中:

console.log('Script 1 Loaded!');

在 script2.js 中:

console.log('Script 2 Loaded!');

打开页面后,控制台输出顺序固定为:

Script 1 Loaded!
Script 2 Loaded!

适用场景

使用 defer 的主要优势是允许浏览器继续解析 HTML,使可见内容(文本、图片)更快呈现。同时,它确保脚本在 DOM 构建完成后按序执行,非常适合那些依赖 DOM 元素或彼此有依赖关系的脚本。

<script> 标签的 async 属性

工作原理

async 同样是非阻塞加载,但它不保证执行顺序。脚本一旦下载完成就会立即执行,无需等待其他脚本或 HTML 解析结束。

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

哪个脚本先下载完,就先执行哪个。这意味着执行顺序是不确定的。

代码示例

结构与上面类似,只是将 defer 换成了 async:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <h1>Hello, World!</h1>
    <script async src="script1.js"></script>
    <script async src="script2.js"></script>
</body>
</html>

由于网络波动,控制台输出可能是:

Script 1 Loaded!
Script 2 Loaded!

或者:

Script 2 Loaded!
Script 1 Loaded!

适用场景

async 适合独立的脚本模块,比如统计代码、广告脚本等。它们不需要依赖 DOM 结构,也不依赖其他脚本的执行结果。如果脚本之间有强依赖关系,使用 async 可能会导致运行时错误。

defer 与 async 的核心区别

虽然两者都允许并行下载且不阻塞 HTML 解析,但在执行时机和顺序上截然不同:

  • 执行时机:defer 等待 HTML 解析完成;async 下载完即执行。
  • 执行顺序:defer 严格遵循文档顺序;async 取决于下载完成时间。

在实际开发中,选择哪一个取决于需求:

  1. 如果脚本依赖 DOM 或其他脚本,优先选 defer。
  2. 如果脚本完全独立且希望尽快运行,可选 async。
  3. 如果没有特殊要求,现代浏览器默认推荐 defer,因为它更安全且不会破坏依赖链。

总结

合理使用这两个属性能显著提升页面加载体验。defer 兼顾了性能和执行顺序,是大多数场景下的首选;而 async 则用于处理那些对顺序不敏感的独立任务。掌握它们的底层行为,能帮助开发者写出更高效的 Web 应用。

目录

  1. script 标签中 defer 和 async 属性的作用及区别
  2. <script> 标签的 defer 属性
  3. 工作原理
  4. 代码示例
  5. 适用场景
  6. <script> 标签的 async 属性
  7. 工作原理
  8. 代码示例
  9. 适用场景
  10. defer 与 async 的核心区别
  11. 总结

更多推荐文章

查看全部
  • ComfyUI 扩展 WAS Node Suite 安装与功能指南
  • Go Web 开发核心理论与实战基础
  • SpringBoot 网约车司机预约系统设计与实现
  • Java 使用 Apache POI 导出 Excel 文件
  • RAG 技术演进:从基础架构到模块化创新
  • Android 基于 AccessibilityService 实现钉钉自动签到方案
  • 无人机避障新思路:基于 APF-RRT*的高效轨迹规划与 Python 实现
  • Android 从基础到架构进阶全方面面试题解析
  • FLUX.1 文生图与 SDXL 风格化工作流实战指南
  • 2025 年 12 月 GESP CCF 编程能力等级认证 Python 一级真题
  • 零基础 CTF 学习完整指南
  • C++ Vector 容器详解:基本用法与迭代器失效
  • 大模型技术名词与概念学习笔记:架构、Prompt 与推理
  • Python 爬虫实战:爬取网易云与 QQ 音乐歌曲信息
  • 腾讯混元图像 3.0 图生图开源,LMArena 跻身全球第一梯队
  • 网络安全专家邓欣:十五载攻防实战与团队管理心得
  • 基于深度学习的无人机洪水图像分割与水量估算
  • MATLAB 实现基于 BFOA-DNN 的无人机三维路径规划
  • C++ explicit 关键字详解:作用、原因与使用
  • Spring IoC 与依赖注入(DI)核心机制详解

相关免费在线工具

  • Keycode 信息

    查找任何按下的键的javascript键代码、代码、位置和修饰符。 在线工具,Keycode 信息在线工具,online

  • Escape 与 Native 编解码

    JavaScript 字符串转义/反转义;Java 风格 \uXXXX(Native2Ascii)编码与解码。 在线工具,Escape 与 Native 编解码在线工具,online

  • JavaScript / HTML 格式化

    使用 Prettier 在浏览器内格式化 JavaScript 或 HTML 片段。 在线工具,JavaScript / HTML 格式化在线工具,online

  • JavaScript 压缩与混淆

    Terser 压缩、变量名混淆,或 javascript-obfuscator 高强度混淆(体积会增大)。 在线工具,JavaScript 压缩与混淆在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online