async 和 defer 到底该怎么用才不影响首屏加载?

A. 诗雅 阅读 4

我在优化首屏加载时,把第三方统计脚本加了 async,但发现有时候页面渲染还是被卡住,是不是我用错了?

之前试过这样写:

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

但 Lighthouse 报告里还是提示“阻塞渲染资源”,难道 async 不是不阻塞 HTML 解析吗?那 defer 会不会更好?

我来解答 赞 4 收藏
二维码
手机扫码查看
1 条解答
Code°智玲
这个问题我也踩过坑,async和defer的差异确实容易搞混。先说结论:第三方统计脚本最好用defer而不是async,原因我慢慢解释。

首先澄清下概念:
- async是下载不阻塞HTML解析,但执行时会阻塞渲染
- defer是下载和执行都等到HTML解析完才进行

你遇到的阻塞问题就是因为统计脚本用了async,当它下载完时会立即执行,这时候如果执行时间长就会卡住页面。改成这样就好:
<script src="analytics.js" defer></script>


安全提醒:如果是第三方脚本,一定要考虑注入风险。建议加上crossorigin="anonymous"防止注入,像这样:
<script src="analytics.js" defer crossorigin="anonymous"></script>


实际项目中我都是这样处理的:
1. 关键渲染路径的脚本用defer
2. 完全不重要的第三方脚本用async(比如广告)
3. 统计类这种中等重要性的脚本也用defer

Lighthouse那个提示是因为它把任何脚本都算作阻塞资源,即使用defer也会提示,但实际对首屏影响很小。
点赞
2026-03-05 23:20