defer仅对外部脚本有效,需同时满足有src属性和defer布尔属性;内联脚本加defer无效,混用async会静默忽略defer,其执行时机在dom构建完毕后、domcontentloaded前,可安全操作dom。

加了 defer 的脚本不会阻塞 HTML 解析,但会等整个文档解析完成、DOM 构建完毕后再执行,且严格按 <script></script> 标签在 HTML 中的出现顺序执行。
defer 只对外部脚本生效
这是最常被忽略的前提。如果你写的是:<script defer>console.log('hi')</script>,浏览器直接无视 defer —— 内联脚本加 defer 没效果,既不延迟也不报错。
- ✅ 正确用法必须带
src:<script src="a.js" defer></script> - ❌
<script defer>...</script>或<script src="x.js" defer></script>都是无效写法(defer是布尔属性,不能赋值) - ⚠️ 即使你手动写了
defer,现代构建工具(如 Vite、Webpack)生成的 HTML 可能通过插件覆盖它,比如vite-plugin-html模板逻辑或build.inlineDynamicImports: true会把脚本转成内联,让defer彻底失效
defer 和 async 混用时 defer 被静默丢弃
只要 async 出现在同一个 <script></script> 标签里,defer 就完全不起作用,浏览器按 async 规则处理:谁先下载完谁先执行,顺序不保证。
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
- ❌
<script src="b.js" async defer></script>→ 等价于只写了async - ✅ 依赖顺序的脚本(比如
utils.js必须在main.js之前执行),两个都加defer才安全:<script src="utils.js" defer></script>+<script src="main.js" defer></script> - ⚠️
async适合统计、广告等无依赖脚本;defer才是业务 JS 的合理选择,尤其要操作 DOM 或调用前序模块时
defer 的执行时机:DOM 已就绪,但还没到 load
defer 脚本在 HTML 解析完成、DOM 构建完毕后立即执行,早于 DOMContentLoaded 事件,但晚于 DOM 构建过程本身。这意味着你可以放心访问 document.getElementById 或 querySelector,而不用监听事件。
- ✅
document.getElementById("app")在defer脚本里一定存在(前提是该元素在中已声明) - ❌ 它不等图片、样式表、iframe 加载完成,所以不要指望
window.onload或load事件触发后再执行 - ⚠️ 如果脚本里用了
document.write,defer会被浏览器忽略(因为该方法会清空当前文档),这种写法本身也早已过时,应避免
真正起作用的只有两个条件:有 src + 有 defer(无值)。其余所有变体,包括加引号、赋值、混用 async、放在内联脚本上,都会让这个行为失效——而且浏览器不会警告,只是默默退回到默认行为。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










