← [ BACK_TO_NOTES ]

HTML中的脚本加载

浏览器中 script、defer、async 与模块脚本的加载方式。

#synthesis #growing #html #javascript #browser

[!info] related notes

HTML中的脚本加载

这篇笔记关注浏览器脚本加载层,不讨论 ECMAScript 语法本身。

三种加载模式

普通 script

<script src="./main.js"></script>

浏览器遇到时会:停止解析 → 下载 → 执行 → 继续解析。这叫解析阻塞,因为 JS 可能修改 DOM。

defer

<script src="app.js" defer></script>
  • 脚本并行下载
  • HTML 继续解析
  • 等 HTML 全部解析完成后再按顺序执行
  • 适合依赖 DOM 的页面脚本

async

<script src="app.js" async></script>
  • 脚本并行下载
  • 下载完立刻执行,执行时可能打断 HTML 解析
  • 多个 async 脚本执行顺序不保证

模块脚本

<script type="module" src="./main.js"></script>
  • 默认延迟执行
  • 顶层 this 不是 window
  • 默认严格模式
  • 变量不会污染全局
  • 支持 import/export

速查对比

类型下载执行时机阻塞解析顺序保证
普通阻塞立即是是
defer并行DOM 解析完否是
async并行下载完立即可能打断不保证
module并行默认延迟否是

重点问题

  • 普通 <script> 如何阻塞解析
  • defer 和 async 的区别
  • type="module" 为什么改变脚本加载与作用域方式
  • 动态插入脚本有什么行为差异

学习检查

不看正文回答:

  1. 普通 <script> 为什么会阻塞 HTML parser?
  2. defer 与 async 都能并行下载,但执行时机和顺序保证有什么差异?
  3. 为什么有依赖顺序的多个脚本通常不适合 async?
  4. module script 为什么默认具有类似 defer 的加载/执行语义?
  5. script 下载、执行与 DOMContentLoaded 之间是什么关系?
  6. 给三个相互依赖脚本和一个独立统计脚本,分别选择普通/defer/async/module 并说明理由。

放回主题图里看

创建于 2025/1/1 更新于 2026/9/30
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本