你的网站点开总像卡了半拍?图片、JS、CSS都压得够狠了,可用户从首页点进商品页,还是觉得“等了一下”——这锅,DNS可能真得背。
DNS预解析到底是什么?为什么能提速?
DNS预解析,就是让浏览器在用户还没点链接前,先把目标域名的IP地址查好。
它不加载资源,也不发请求,就干一件事:提前把“网址→IP”这步算出来。
打个比方:你朋友约你在国贸见面,你提前查好地铁怎么坐、出口在哪,到了直接上楼——而不是站在A口掏出手机现搜。DNS预解析,就是帮你把那个“地铁攻略”提前缓存好了。
有个做母婴电商的朋友试过:用户从商品页跳结算页时,总有一小段空白。一查发现,结算页调用了物流查询和支付网关两个新域名,每次都要重新查DNS。加上预解析后,跳转那一下的卡顿感明显少了。
怎么判断你的网站是否需要DNS预解析?
先别急着加代码。打开 Chrome,按 F12 → 切到 Network 标签页 → 刷新页面 → 找几个非主站域名的请求(比如 cdn.xxx.com、analytics.google.com、fonts.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.com、stats.mixpanel.com) - 用途(比如“首屏商品数据接口”“用户行为埋点”)
- 触发页面(比如“首页”“商品列表页”)
然后按用户真实路径排序:哪个页面跳转最多、哪个资源加载最急,就优先加。
如果你用 WordPress,可以在主题的 header.php 里手动加;用 Vue/React 项目,就加在 public/index.html 的 <head> 里;用 Next.js,可以写在 _document.tsx 的 Head 组件中。
不需要一上来就自动化。先手动加、手动测、手动调,跑通逻辑再说。
今天下班前就能动手的一步操作
打开你正在维护的网站首页,按 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 时间有没有掉下来。
搞定。你刚刚,悄悄给用户的下一次点击,省出了几十毫秒。