你的网站点开总像卡了半拍?图片、JS、CSS都压得够狠了,可用户从首页点进商品页,还是觉得“等了一下”——这锅,DNS可能真得背。

DNS预解析到底是什么?为什么能提速?

DNS预解析,就是让浏览器在用户还没点链接前,先把目标域名的IP地址查好。
它不加载资源,也不发请求,就干一件事:提前把“网址→IP”这步算出来。

打个比方:你朋友约你在国贸见面,你提前查好地铁怎么坐、出口在哪,到了直接上楼——而不是站在A口掏出手机现搜。DNS预解析,就是帮你把那个“地铁攻略”提前缓存好了。

有个做母婴电商的朋友试过:用户从商品页跳结算页时,总有一小段空白。一查发现,结算页调用了物流查询和支付网关两个新域名,每次都要重新查DNS。加上预解析后,跳转那一下的卡顿感明显少了。

怎么判断你的网站是否需要DNS预解析?

先别急着加代码。打开 Chrome,按 F12 → 切到 Network 标签页 → 刷新页面 → 找几个非主站域名的请求(比如 cdn.xxx.comanalytics.google.comfonts.googleapis.com),点开看它的 Timing 详情。

如果 “DNS Lookup” 这一项动不动就占了 80ms 甚至更久,说明这儿有优化空间。

重点盯这些地方:

  • 页面里用到的字体、统计脚本、分享按钮、客服插件,它们的域名大概率没被预热过;
  • 用户常走的路径,比如文章页 → 相关推荐页、列表页 → 商品详情页,只要跳转前后域名不同,就是预解析的好目标;
  • 不是“所有域名都加”,而是“用户下一步最可能去哪,就提前查哪”。

手动添加DNS预解析的3个核心方法

最常用、最稳妥的方式,就是在 HTML 的 <head> 里加一行 link 标签:
<link rel="dns-prefetch" href="https://你要预查的域名">

注意三点:

  • href 里只写协议 + 域名,不用带路径,比如 https://shop.example.com 就行,别写成 https://shop.example.com/checkout
  • 如果你用的是 HTTPS 站点,就老老实实写 https://,别图省事写 //xxx.com,有些浏览器会警告;
  • 主站域名(比如 www.example.com)不用加——它已经在首页加载时查过了。

举个实际例子:
你首页引用了 Google 字体,又有个子站叫 app.example.com,用户看完首页经常点“去应用”。那就加这两行:
<link rel="dns-prefetch" href="https://fonts.googleapis.com">
<link rel="dns-prefetch" href="https://app.example.com">

进阶技巧:预连接(Preconnect)该什么时候用?

dns-prefetch 只管查IP,preconnect 更进一步:它连DNS、TCP握手、TLS协商(HTTPS站点)全给你提前跑完。
相当于不仅查好地图,还把车钥匙插上了,油也加满了,就等你踩油门。

写法是:
<link rel="preconnect" href="https://关键第三方域名" crossorigin>
crossorigin 属性不能少,尤其调用跨域资源时,不然可能白忙活。

什么时候该用 preconnect

  • 那个域名的资源,是首屏渲染强依赖的(比如核心字体、首屏API);
  • 它的请求发起得特别早,且延迟对用户体验影响明显;
  • 全站你只挑 1–2 个最重的用它,别的留给 dns-prefetch ——毕竟它更“重”,开太多反而拖慢主线程。

避免DNS预解析的常见陷阱和错误

❌ 别一口气给二十个域名都加预解析。浏览器并发 DNS 查询有限,加太多反而抢了正常请求的资源。
❌ 别给自己已经在用的域名重复加。比如 CSS 从 cdn.example.com 加载,那这个域名早就查过了,再加就是多此一举。
❌ 别在 HTTPS 页面里预解析 HTTP 域名。现代浏览器基本会无视,甚至报错。统一用 https://,或者干脆别加。
✅ 加完一定要验证:用无痕模式打开页面 → Network 里找对应域名的请求 → 看 DNS Lookup 时间是不是接近 0ms 或大幅缩短。

如何系统化地管理和实施预解析策略?

建议你建一个简单的表格,列三栏:

  • 域名(如 api.example.comstats.mixpanel.com
  • 用途(比如“首屏商品数据接口”“用户行为埋点”)
  • 触发页面(比如“首页”“商品列表页”)

然后按用户真实路径排序:哪个页面跳转最多、哪个资源加载最急,就优先加。
如果你用 WordPress,可以在主题的 header.php 里手动加;用 Vue/React 项目,就加在 public/index.html<head> 里;用 Next.js,可以写在 _document.tsxHead 组件中。

不需要一上来就自动化。先手动加、手动测、手动调,跑通逻辑再说。

今天下班前就能动手的一步操作

打开你正在维护的网站首页,按 Cmd+Option+I(Mac)或 Ctrl+Shift+I(Win),调出开发者工具 → 切到 Network → 刷新页面。

扫一眼所有请求,找出 1–2 个你确定用户会用到、但又不是当前页面主域名的第三方域名,比如:

  • fonts.googleapis.com(如果你用了 Google Fonts)
  • www.googletagmanager.com(如果你用了 GTM)
  • your-shop.example.com(如果你有独立商城子站)

然后,打开你网站的 HTML 模板文件(WordPress 是 header.php,Vue 是 public/index.html,Next.js 是 _document.tsx),在 <head> 里、</head> 之前,贴上对应的标签:
<link rel="preconnect" href="https://fonts.googleapis.com" crossorigin>
<link rel="dns-prefetch" href="https://your-shop.example.com">

保存 → 部署 → 用无痕窗口访问 → 回到 Network,找到刚才那个域名的请求,点开 Timing,看 DNS Lookup 时间有没有掉下来。
搞定。你刚刚,悄悄给用户的下一次点击,省出了几十毫秒。