默认不加 async 或 defer 的 script 放 head 会阻塞 html 解析和渲染,放 前虽 dom 就绪但执行时机仍需谨慎;defer 是 head 中唯一合理选择,异步下载、dom 构建完成后按序执行。

默认不加 async 或 defer 的 <script></script> 放在 里,会直接阻塞 HTML 解析和页面渲染;放在 前则 DOM 已就绪、首屏感知更快——但“快”不等于“功能就绪”,关键得看脚本依赖什么。
不加 async/defer 的 script 在 head 中会阻塞渲染
浏览器自上而下解析 HTML,遇到无加载控制属性的 <script></script> 就立刻暂停 DOM 构建,去下载、解析、执行。此时 都没开始生成,document.getElementById("app") 必然返回 null,常见报错如 Cannot set properties of null。
- 外部脚本(带
src)还会同步阻塞后续所有资源:CSS、图片、字体甚至其他 JS - 内联脚本(无
src)虽不涉及网络请求,但执行时机太早,仍不能安全操作任何内元素 - 弱网下白屏时间明显拉长,首屏内容延迟可达数秒
放在 前看似安全,但仍有隐性风险
DOM 确实已基本就绪,getElementById、事件绑定、框架挂载(如 new Vue({ el: "#app" }))一般不会失败。但这不代表“万无一失”:
- 不能写成
<script>...</script>
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











