← 返回题目列表

preload、prefetch、preconnect 和 dns-prefetch 有什么区别?

中等 第 23 / 30 题 更新于 2026/07/29
浏览器资源加载性能优化Resource Hints

简化版

preload 是当前页面马上要用的关键资源预加载,prefetch 是未来页面可能用的低优先级预取,preconnect 是提前建立连接,dns-prefetch 只提前解析 DNS。它们都是资源提示,但目的、优先级和误用成本不同。

详细版

区别:

  • preload:当前页面关键资源,例如首屏字体、关键图片、延迟发现的 JS。
  • prefetch:未来导航可能用的资源,例如下一页脚本。
  • preconnect:提前完成 DNS、TCP、TLS,适合确定会访问的跨域源。
  • dns-prefetch:只提前 DNS 解析,成本低但收益也有限。

注意点:

  • preload 必须资源真的会用,否则浪费带宽。
  • as 属性要写对,影响优先级和缓存复用。
  • 跨域字体等资源要处理 crossorigin
  • prefetch 不适合首屏关键资源。
  • 连接提示不要滥用,过多预连接会占连接资源。

完整版教学

一、资源提示解决的是“浏览器发现太晚”

浏览器通常要先解析 HTML,再发现 CSS、JS、图片、字体等资源。有些资源藏得很深:CSS 里引用字体、JS 执行后才创建图片、路由切换后才发现下一页资源。资源提示就是开发者提前告诉浏览器:“这个东西等下要用,可以先准备。”

但提示不是命令,浏览器会结合网络、优先级、缓存和设备情况决定如何执行。正确使用能缩短关键路径,误用则会抢占带宽。

HTML 解析 → 发现资源 → 建连接 → 下载 → 使用
资源提示:把“发现/连接/下载”的部分提前

二、preload 面向当前页面关键资源

preload 的语气最强,表示当前页面很快就要用这个资源。它适合首屏关键字体、关键 CSS、LCP 图片或被 JS 动态加载但首屏必须用的资源。它不应该用于“也许会用”的东西。

数字例子:首屏大图本来要等 JS 执行后 800ms 才被发现,下载需要 600ms,则图片可见可能在 1400ms 后。若用 preload 让它在 100ms 时开始下载,理论上可把 LCP 提前数百毫秒。

<link rel="preload" href="/hero.webp" as="image">
<link rel="preload" href="/font.woff2" as="font" type="font/woff2" crossorigin>

三、prefetch 面向未来页面

prefetch 优先级较低,通常用于用户接下来可能访问的资源。例如用户在列表页停留时,预取详情页路由 JS;或者在登录成功前预取首页数据框架。它不适合当前首屏,否则会因为优先级低而不及时。

可以把它理解为“闲的时候帮我拿一下”。如果用户真的跳转,资源已在缓存里;如果用户不跳转,最多浪费一点空闲带宽。移动弱网下要更谨慎,避免预取大资源。

四、preconnect 和 dns-prefetch 是提前建路

跨域请求通常要经历 DNS、TCP、TLS。preconnect 可以提前完成这些步骤,适合确定会访问的关键第三方源,例如 CDN、接口域名、字体域名。dns-prefetch 只解析域名,成本更低,收益也更小。

假设 DNS 30ms、TCP 80ms、TLS 120ms,连接建立就要 230ms。如果页面关键资源来自第三方 CDN,提前 preconnect 可以把这段时间从关键路径里挪走。

提示提前做什么成本适合
dns-prefetchDNS可能访问的域名
preconnectDNS + TCP + TLS确定访问的关键域名
preload当前资源下载当前页关键资源
prefetch未来资源下载低优先级下一页可能资源

五、as 和 crossorigin 写错会降低效果

preloadas 告诉浏览器资源类型,影响优先级、CSP、缓存复用和请求头。如果字体资源没写 crossorigin,可能导致预加载和实际使用发起两次请求。图片写错类型也可能让优先级不符合预期。

因此 preload 不是“加一行 link 就完事”。要检查 Network 面板里资源是否复用、是否重复下载、优先级是否符合预期。

六、滥用会抢占关键资源

资源提示的风险是抢带宽。首页本来 CSS 和主 JS 最关键,你却 preload 了 5 张轮播图、prefetch 了 3 个未来页面包,弱网用户可能更慢。性能优化不是越早下载越好,而是让关键资源优先。

一个简单原则:首屏必须用且发现晚,用 preload;未来可能用,用 prefetch;确定跨域源很快要连,用 preconnect;只是可能访问域名,用 dns-prefetch。

记忆钩子:preload 是“现在要”,prefetch 是“以后也许要”,preconnect 是“先把路修好”,dns-prefetch 是“先查门牌号”。

七、常见误区与追问

  • 误区:preload 可以随便加,越多越快。 preload 优先级高,滥用会抢占真正关键资源。
  • 误区:prefetch 可以优化当前首屏。 prefetch 面向未来资源,当前关键资源应考虑 preload。
  • 误区:preconnect 没成本。 它会占连接和系统资源,只适合确定要访问的关键源。
  • 追问:字体 preload 为什么可能下载两次? 常见原因是缺少 crossorigin 或实际请求属性不一致。
  • 追问:怎么验证资源提示有效? 看 Network 的开始时间、优先级、是否命中缓存和是否重复请求。
  • 追问:移动端弱网怎么用 prefetch? 谨慎预取大资源,可结合网络状态、用户意图和空闲时机。

八、加强记忆

资源提示用“现在资源、未来资源、提前连线、提前解析”四格记。preload 抢当前关键路径,prefetch 利用空闲准备未来,preconnect 提前建跨域连接,dns-prefetch 只做 DNS。优化前先找关键路径,优化后用 Network 面板验证,别把提示写成带宽抢劫。