dns-prefetch 仅在格式正确(协议相对域名)、位置靠前(head 中 meta/title 后)、场景匹配(首屏后立即使用的第三方域名)时生效;错误即静默失效,且不可与 preconnect 混用同一域名。

link 标签加 rel="dns-prefetch" 确实能让浏览器提前解析第三方域名,但**只在写对格式、放对位置、用对场景时才生效**;写错就静默失效,DevTools 里查不到报错,Network 面板也看不到记录,非常难定位。
href 必须是协议相对域名,不能带路径或协议头
浏览器只从 href 中提取主机名,其余内容全被忽略。写错格式等于没写。
- ✅ 正确:
<link rel="dns-prefetch" href="//cdn.example.com">(推荐,自动适配当前页 HTTP/HTTPS) - ✅ 可接受(HTTPS 页面更稳):
<link rel="dns-prefetch" href="https://fonts.googleapis.com"> - ❌ 错误:
<link rel="dns-prefetch" href="https://cdn.example.com/js/app.js">(含路径,整条标签被忽略) - ❌ 错误:
<link rel="dns-prefetch" href="http://api.example.com">(HTTPS 页面大概率跳过) - ❌ 错误:
<link rel="dns-prefetch" href="cdn.example.com">(缺//,被当成本地路径)
必须放在 最前面,早于首个外部资源
浏览器流式解析 HTML,一读到 <link rel="dns-prefetch"> 就立即排队执行 DNS 查询。放晚了,相关请求早就发出去了。
- ✅ 推荐顺序:
<meta charset>→<title></title>→<link rel="dns-prefetch">× N → 首个<link rel="stylesheet">或<script src="https://..."></script> - ❌ 无效位置:塞在
里、包在<template></template>中、用 JS 动态创建并插入(如document.createElement('link')) - ⚠️ 即使位置正确,若前面堆了大量阻塞渲染的 CSS/JS,DNS 查询可能被首屏关键资源抢占调度优先级(Safari 尤其保守)
只对“首屏后立刻用”的第三方域名有效
dns-prefetch 不加速首屏资源本身,只对后续真实发起的跨域请求起作用——比如 DOM ready 后 100ms 内调用的 fetch("https://api.example.com/"),或懒加载图片、字体 CSS 的加载阶段。
- ✅ 值得加:
//api.example.com(首页卡片数据)、//auth.example.com(登录态校验)、//fonts.gstatic.com(注意和fonts.googleapis.com是两个独立域名,需分别声明) - ❌ 不该加:
//log.example.com(用户行为上报,可延后)、//backup-api.example.com(兜底接口,99% 不触发)、//www.example.com(同源,浏览器已缓存解析) - ⚠️ 每个
dns-prefetch都是一次真实 DNS 查询,浏览器并发上限通常为 6~10 个;乱加不仅白耗资源,还可能挤占真实请求队列
别和 preconnect 混用同一域名
preconnect 已隐含 dns-prefetch 的功能,且会进一步完成 TCP 连接与 TLS 握手。两者同时写,preconnect 会直接覆盖前者,后者白加。
- ✅ 如果确定 1–2 秒内必用该域名(如字体、首屏图片),优先用
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin> - ✅ 如果只是“可能用到”或用户交互后才触发(如分享按钮调用微博接口),用
dns-prefetch更轻量 - ⚠️
preconnect到重定向跳转后的最终域名(比如api.v1.example.com301 到api.v2.example.com)会导致预连接白做
最常被忽略的一点:它不保证执行。弱网、内存紧张、或浏览器主动降级时,dns-prefetch 可能被丢弃。你得确认 JS 真的在首屏后极短时间内发出了对应域名的请求,否则加了也没意义。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











