资源提示是"用一行 HTML 换几百毫秒"的手段。preconnect 提前建立 TCP+TLS,preload 提前下载关键资源,两者配合能明显改善 LCP。
-
dns-prefetch
-
preconnect
-
preload
-
标签总数
-
每个第三方域名生成 1 条 dns-prefetch + 1 条 preconnect;每个关键资源生成 1 条 preload,并根据 as 类型自动补充 crossorigin 属性。
四种提示的区别
| 标签 | 做什么 | 开销 | 使用场景 |
|---|---|---|---|
| dns-prefetch | 只做 DNS 解析 | 极低 | 所有会用到的第三方域名 |
| preconnect | DNS + TCP + TLS 握手 | 中(占用连接) | 确定会用、且延迟高的关键域名 |
| preload | 提前下载当前页面要用的资源 | 高(占带宽) | LCP 图片、首屏字体、关键 CSS |
| prefetch | 空闲时预取后续页面资源 | 低(低优先级) | 下一步可能访问的页面 |
关键区别在于 preload 是"现在就下载",会和其他关键资源抢带宽;prefetch 是"闲着再下载",优先级最低。用错的话,preload 反而会拖慢首屏。
preconnect 别滥用
每个 preconnect 都要建立一个完整的连接(DNS + TCP + TLS),而这个握手本身要消耗时间与资源。经验规则是:
- 同一页面 最多 3–4 个 preconnect。多了会适得其反,浏览器需要排队建立连接。
- 对确定会用的域名用 preconnect;只是"可能会用"的用 dns-prefetch 就够了——DNS 解析成本低,浪费了也无妨。
- 同一域名不要同时写 dns-prefetch 和 preconnect。preconnect 已经包含 DNS 解析,重复声明是浪费(虽然无害)。
字体的 crossorigin 是必须的
这是最常见的 preload 失效原因:网页字体请求默认使用 CORS 匿名模式,如果 preload 时不加 crossorigin,浏览器会把它当成两个不同的请求,导致字体被下载两次——不仅没提速,还多了一次请求。
<link rel="preload" href="/fonts/main.woff2" as="font" type="font/woff2" crossorigin>
注意 crossorigin 即使是同源字体也要加,这是标准规定。同样需要注意 as 属性必须准确,写错等于 preload 无效。
什么该 preload
| 值得 preload | 不要 preload |
|---|---|
| LCP 元素(首屏大图、主标题字体) | 首屏之外的任何图片 |
| 首屏内联关键 CSS 引用的字体 | 整个 CSS 文件(会阻塞渲染) |
| 折叠上方必需的背景图 | 视频、大体积媒体文件 |
| 关键 JS(水合入口) | 懒加载模块 |
原则很简单:preload 只给"少了它首屏就出不来"的资源。判断方法是打开发者工具的 Network 面板,看瀑布图里哪些资源处于关键路径上。
你可能还想问
预加载提示有什么用?
提前告诉浏览器关键资源的位置与优先级,缩短关键路径的等待;用错反而会抢占带宽,拖慢真正重要的资源。
该预加载哪些资源?
只预加载首屏必需的字体、关键样式与图片;范围过宽会与正常加载竞争,效果适得其反。
和缓存策略怎么配合?
提示只是提前发起请求,缓存仍靠响应头控制;两者配合才能既早开始又避免重复下载。
速查在线工具箱