我在一个典型的 移动端 H5 资讯页 上做了测试(非缓存状态,4G 弱网模拟):

| 指标 | 优化前 | 优化后 | 提升 |
|---|---|---|---|
| FCP(首次内容绘制) | 1.8 s | 1.2 s | ↓33% |
| LCP(最大内容绘制) | 2.9 s | 2.1 s | ↓27% |
| 页面可交互时间 | 2.3 s | 1.6 s | ↓30% |
就靠下面 3 行代码,没有动任何打包配置,没有引入任何第三方库。
复制代码<link rel="preconnect" href="https://api.example.com">
<link rel="preload" href="/fonts/main.woff2" as="font" crossorigin>
<link rel="dns-prefetch" href="https://cdn.example.com">
你只需要把 href 换成你自己项目的实际地址即可。
preconnect —— 提前握手,省下 DNS + TCP + TLS 时间 复制代码<link rel="preconnect" href="https://api.example.com">
浏览器要请求一个第三方域名(比如接口 API、CDN、统计服务),正常流程是:
DNS 解析 → TCP 连接 → TLS 协商(如果是 HTTPS)→ 然后才发请求。
每一步都是几十到几百毫秒。
preconnect 告诉浏览器:“这个域名我等下要用,你现在就去把连接建立好”。
等到真正发请求时,连接已经 ready,直接发送即可。
节省时间:平均 120~300ms(尤其在弱网下非常明显)。
preload —— 提前加载关键资源,不让浏览器排队 复制代码<link rel="preload" href="/fonts/main.woff2" as="font" crossorigin>
浏览器解析 HTML 是顺序的,一般要到 CSS 里遇到 @font-face 才会去下载字体。
但字体往往阻塞文字渲染?实际上不会阻塞,但会晚到——导致 FOIT(Flash of Invisible Text) 或 FOUT。
preload 强制浏览器 以最高优先级 提前下载这个资源,不依赖 CSS/JS 的解析顺序。
适用资源:
注意:as 属性必须写对,否则浏览器可能不生效或重复下载。
dns-prefetch —— 轻量版 preconnect,只管 DNS 复制代码<link rel="dns-prefetch" href="https://cdn.example.com">
preconnect 虽然强大,但会做 DNS + TCP + TLS,开销较大。
如果只是猜测可能会用到的域名,或者想更轻量地覆盖更多域名,用 dns-prefetch。
浏览器只做 DNS 解析,存到本地缓存。后面真正请求时,跳过 DNS 这一步。
典型场景:
复制代码<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<!-- 1. 最关键的当前页面 API 域名,用 preconnect -->
<link rel="preconnect" href="https://your-api.com">
<!-- 2. 字体或首屏大图,用 preload -->
<link rel="preload" href="/static/fonts/Inter.woff2" as="font" crossorigin>
<!-- 3. 多个第三方域名,用 dns-prefetch(轻量覆盖) -->
<link rel="dns-prefetch" href="https://google-analytics.com">
<link rel="dns-prefetch" href="https://cdn.yourimg.com">
<!-- 其它 head 内容 -->
</head>
顺序建议:
preconnect 最先,因为它最重但最有效;
preload 其次;
dns-prefetch 可以放多个,放在最后。
每个 preconnect 都会维持一个连接,占用浏览器资源。
建议不超过 4~6 个。超过后浏览器可能会忽略或延迟。
preconnectpreloaddns-prefetch/api/xxx 接口的 Waiting for server 时间你会在 Waterfall 里看到:
preconnect 域名旁边会出现一个灰色的连接建立阶段,发生在实际请求之前。preload 的资源会出现在非常靠前的加载位置,颜色标识为 Highest。这三行代码属于 “投入产出比极高” 的优化手段:
下次你接到“页面加载慢”的性能优化任务,第一件事不是改代码,而是在 <head> 里加上这三行。
如果测试数据好看,记得回来点个赞