DNS 预解析
面试速答(30 秒版 TL;DR)
- DNS 预解析(DNS Prefetch) 是让浏览器在资源真正发起请求前,先把域名解析成 IP。
- 它优化的是 “连出去之前的第一步”,不是完整建连;因此它只能省掉一部分等待时间。
- 最适合的场景是:当前页面大概率马上会访问某个跨域静态资源域名,比如图片 CDN、字体 CDN、埋点域名。
- 最常见写法:
<link rel="dns-prefetch" href="//static.example.com" />
- 面试里最好顺手补一句:
dns-prefetch只做 DNS,preconnect才会继续做 TCP/TLS 建连。
一、先建立心智模型:它到底在优化哪一段?
浏览器访问一个跨域资源,通常至少会经过这样几步:
- 解析域名
- 建立 TCP 连接
- 如果是 HTTPS,再做 TLS 握手
- 发送 HTTP 请求
- 接收响应
DNS 预解析只提前做第 1 步,所以它不是“万能提速”,而是把本来要在关键路径里发生的 DNS 查询,尽量挪到浏览器空闲时做掉。
一句话理解:
DNS 预解析优化的是“未来请求的起跑动作”,不是整个请求生命周期。
二、它解决的是什么问题?
如果页面要用到多个第三方域名,浏览器第一次访问每个域名时都要先查 DNS。这个动作在弱网、移动网络、冷启动场景里会更明显。
典型场景包括:
- 页面首屏会马上拉取图片 CDN 资源
- 页面很快会请求字体 CDN
- 跳转后的下一页大概率会访问某个 API 域名
- 页面内嵌了第三方评论、统计、地图、客服脚本
如果这些域名在真正请求前就完成了解析,后续请求就能少等一步。
三、什么时候值得用,什么时候别乱用?
适合使用
- 跨域且高概率会用到 的域名
- 数量不多但访问价值高的关键域名
- 用户进入页面后很快就会访问的资源域名
不太适合使用
- 根本不确定会不会访问的域名
- 一次性塞很多第三方域名
- 当前页面根本不依赖的长尾资源域名
- 同源资源场景下指望它带来明显收益
这里最容易犯的错是:看见“预”字就全开。实际上 DNS 查询也有成本,域名越多,越可能造成无意义的提前解析。
四、dns-prefetch 和 preconnect 到底差在哪?
这是面试高频追问。
| 能力 | dns-prefetch | preconnect |
|---|---|---|
| 提前 DNS 解析 | 是 | 是 |
| 提前 TCP 建连 | 否 | 是 |
| 提前 TLS 握手 | 否 | 是(HTTPS 下) |
| 成本 | 更低 | 更高 |
| 适用对象 | 次关键域名 | 当前页面马上就要访问的关键跨域域名 |
推荐答法:
dns-prefetch更轻,适合“可能很快会用到”的域名。preconnect更激进,适合“当前页马上就要用”的关键域名,比如首屏字体源、关键 API、关键图片 CDN。
示例:
<link rel="dns-prefetch" href="//img.example.com" />
<link rel="preconnect" href="https://font.example.com" crossorigin />
别把它们理解成互斥关系。很多项目里是:
- 非关键域名用
dns-prefetch - 真正关键域名用
preconnect
五、最小可用写法
1. 基础写法
<link rel="dns-prefetch" href="//static.example.com" />
注意点:
href写域名即可,不需要具体文件路径- 常见写法是
//domain.com,表示协议跟随当前页面
2. 一个更贴近真实项目的示例
<head>
<link rel="dns-prefetch" href="//img.example-cdn.com" />
<link rel="dns-prefetch" href="//font.example-cdn.com" />
<link rel="preconnect" href="https://font.example-cdn.com" crossorigin />
</head>
这里的思路是:
- 图片域名很快会请求,但不是最关键,所以做 DNS 预解析
- 字体域名会直接影响首屏文本展示,所以进一步做
preconnect
六、真实收益怎么判断?
不要把它当成“加了就一定肉眼可见”的优化项。它更像一个低成本细节优化,收益通常取决于:
- 用户网络环境是否较差
- 域名是否是首次访问
- DNS 解析是否本来就慢
- 后续资源是否真的很快发起请求
工程上更务实的做法是:
- 先在 DevTools 的 Network 面板看是否存在明显的 DNS 阶段耗时
- 只挑少数关键跨域域名做实验
- 对比优化前后的瀑布图和首屏指标
如果一个域名本来就复用得很好,或者浏览器缓存命中率很高,那么收益可能不明显。
七、典型题与标准答法
Q1:什么是 DNS 预解析?
答法:
DNS 预解析就是浏览器在资源真正请求前,先把目标域名解析成 IP。这样后续真正发请求时可以省掉 DNS 查询时间。它适合跨域静态资源较多、并且这些域名很快就会被访问的场景。
Q2:它和 preconnect 有什么区别?
答法:
dns-prefetch 只提前做 DNS;preconnect 会继续把 TCP 和 TLS 也做掉,所以更重,但收益也可能更大。当前页马上要访问的关键域名更适合 preconnect,次关键域名可以先用 dns-prefetch。
Q3:为什么不能滥用?
答法:
因为提前解析本身也要占用系统和网络资源。如果页面一次性对很多不会访问的域名做预解析,就会造成无效工作,甚至干扰真正关键资源的调度。
八、常见误区
-
误区 1:把 DNS 预解析当成完整预连接。 它不负责 TCP/TLS,别高估收益。
-
误区 2:对所有第三方域名一股脑都加。 这通常是在制造噪音,不是在优化关键路径。
-
误区 3:忽略跨域资源的真实优先级。 关键域名更应该考虑
preconnect,而不是只停留在dns-prefetch。 -
误区 4:只会背标签,不会解释适用场景。 面试时最好能补出“高概率访问的跨域域名”这个前提。
九、速记要点
- DNS 预解析 = 提前做域名解析。
- 它只优化 DNS,不优化 TCP/TLS。
- 轻量,适合高概率会访问的跨域域名。
- 关键域名优先考虑
preconnect。 - 不要批量乱加,先看真实关键路径。