DNS 预解析优化网页加载速度
使用 dns-prefetch 提前解析域名,减少 DNS 查询延迟
问题
什么是 DNS 预解析?如何通过 dns-prefetch 优化网页加载性能?
解答
DNS 优化的两个方向
DNS 解析通常需要 20-120ms,优化可以从两方面入手:减少 DNS 请求次数和缩短 DNS 解析时间。
什么是 dns-prefetch
dns-prefetch(DNS 预获取)是一种前端性能优化技术。它让浏览器提前解析后续可能用到的域名,将解析结果缓存到系统中,从而缩短 DNS 解析时间,提升网站访问速度。
为什么需要 dns-prefetch
浏览器向第三方服务器发送请求时,必须先通过 DNS 解析将域名转换为 IP 地址。如果短时间内有多个请求发往同一服务器,DNS 解析会重复触发,造成页面加载延迟。DNS 解析虽然占用带宽不大,但延迟较高,在移动网络上尤为明显。
实现方式
在 HTML 中添加 link 标签:
<link rel="dns-prefetch" href="https://baidu.com/">
或通过 HTTP 响应头设置:
Link: https://fonts.gstatic.com/; rel=dns-prefetch
工作原理
DNS 解析按以下顺序查找缓存:
浏览器缓存 → 系统缓存 → 路由器缓存 → ISP(运营商)DNS 缓存 → 根域名服务器 → 顶级域名服务器 → 主域名服务器
dns-prefetch 将解析后的 IP 缓存在系统中。当浏览器首次解析域名并缓存到操作系统后,下次 DNS 解析时间可降至 0-1ms。如果不缓存在系统,需要读取路由器缓存(约 15ms)或 ISP 缓存(常见域名 80-120ms,不常见域名 200-300ms)。
dns-prefetch 可为 DNS 解析带来 15-300ms 的性能提升,对于引用大量第三方域名资源的网站效果更明显。
浏览器 DNS 缓存
现代浏览器自带 DNS 缓存机制。Chrome 的缓存过期时间是 1 分钟,在此期间不会重新请求 DNS。Chrome 启动时会自动解析上次启动时记录的前 10 个域名,因此常访问的网站打开速度更快。
dns-prefetch 相当于在浏览器缓存之后,在操作系统层面再做一层 DNS 缓存,为浏览器缓存提供保障。系统 DNS 缓存时间通常大于浏览器。
缓存时间说明
TTL(Time-To-Live)是域名解析记录在 DNS 服务器中的存留时间。浏览器 DNS 缓存时间与 DNS 服务器返回的 TTL 值无关,取决于浏览器自身设置。系统缓存会参考 TTL 值,但不完全等于 TTL 值。很多平台的默认 TTL 值是 3600 秒(1 小时)。
注意事项
dns-prefetch 的主要缺点是过度使用。过多的预获取会导致过量 DNS 解析,增加网络负担。
最佳实践
仅用于跨域域名:dns-prefetch 仅对跨域 DNS 查找有效,不要用于同域,因为浏览器看到提示时,当前域名的 IP 已经被解析。
配合 preconnect 使用:dns-prefetch 仅执行 DNS 查找,而 preconnect 会建立完整连接。对于 HTTPS 站点,组合使用可以涵盖 DNS 解析、TCP 连接和 TLS 握手,进一步减少延迟:
<link rel="preconnect" href="https://fonts.gstatic.com/" crossorigin>
<link rel="dns-prefetch" href="https://fonts.gstatic.com/">
避免过度使用 preconnect:如果需要连接多个第三方域,全部使用 preconnect 会适得其反。preconnect 应仅用于最关键的连接,其他连接使用 dns-prefetch 即可。
关键点
- dns-prefetch 通过提前解析域名并缓存到系统,可减少 15-300ms 的 DNS 解析时间
- 使用
<link rel="dns-prefetch" href="域名">实现,仅对跨域资源有效 - 避免过度使用,过多预解析会增加网络负担
- 建议与 preconnect 配合使用,preconnect 用于关键连接,dns-prefetch 用于其他连接
- 系统 DNS 缓存时间通常大于浏览器缓存(1 分钟),提供更持久的优化效果
目录