async和defer到底该怎么用才能优化首屏加载?

皇甫彬丽 阅读 78

最近在优化页面加载速度,把两个JS文件分别用了async和defer,但页面还是感觉卡顿。比如这个代码:


<script src="main.js" defer></script>
<script src="analytics.js" async></script>

发现defer的main.js执行完了才渲染页面,async的analytics.js倒是没阻塞,但总感觉顺序有问题。如果两个脚本都没依赖关系,该怎么选才能让首屏更快?

我来解答 赞 7 收藏
二维码
手机扫码查看
2 条解答
UX红梅
UX红梅 Lv1
这个问题其实挺常见的,我们来拆解下。首先明确几个关键点:

1. defer的脚本会在DOM解析完成后按顺序执行,也就是在DOMContentLoaded之前
2. async的脚本下载完就立即执行,完全不关心顺序
3. 首屏渲染最关键的是DOM构建完成

根据你的情况,main.js用了defer,这个选择没错,因为它会等待DOM。问题可能出在analytics.js上,虽然用了async,但如果这个文件很大或者服务器响应慢,它可能会在关键渲染路径上抢带宽。

我的建议是:
1. 对于真正不关键的脚本(比如统计、广告),不仅要加async,最好再加个preload:
<link rel="preload" href="analytics.js" as="script">
<script src="analytics.js" async></script>


2. 如果main.js体积很大,考虑拆分出首屏必须的部分,非关键功能动态加载

3. 用Chrome DevTools的Lighthouse跑下,看具体是哪块拖慢了渲染

另外说个经验之谈,很多人以为用了async/defer就万事大吉了,其实脚本本身的执行时间也很关键。我有次优化就是把一个jQuery插件改成了按需加载,首屏直接快了1秒多。
点赞
2026-03-09 19:16
程序员红彦
你这种情况,两个脚本都没依赖关系的话,都用 async 就行了。没必要用 defer,因为 defer 会等到 DOM 解析完才执行,反而拖慢首屏渲染。像这样改:

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

我之前也遇到过类似的问题,async 的脚本加载是并行的,谁先加载完谁先执行,完全不阻塞渲染,特别适合这种独立的统计或功能脚本。如果你非得保证 main.js 在某些场景下优先执行,那就把它放前面就行,但依然用 async。别想太复杂,浏览器优化得很好。
点赞 6
2026-02-14 15:01