加了预加载,为什么页面反而更慢了?

4 个讲解板块 · 关联 3 款站内工具 · 内容最后核对 2026-10-09

少写一个属性,浏览器就认不出你预加载的是同一个文件,于是同一份资源下载两遍。

直接答案

最常见的原因是缺少必要的属性。预加载要声明资源类型,否则浏览器按错误的模式发请求,之后真正的请求匹配不上这份下载,只能再下一遍——不但没加速,还多花了一份带宽,而且先后两次请求会互相排挤。字体更特殊:字体请求按跨域匿名模式发出,所以哪怕是同源文件,预加载也必须带上跨域标记,否则同样会下载两次。

第二个原因是优先级被用滥。预加载是高优先级的强制下载,写十个就等于把所有资源都提到「紧急」,等于没有优先级。有经验的做法是只预加载一两个真正关键、且很晚才被发现的文件。

第三个原因是白预加载:当前页面根本用不到的资源被提前下载,既耗流量又挤占关键请求的带宽,窗口加载完成后约三秒仍未使用,浏览器还会在控制台给出性能告警。

这类提示的目的,是把「浏览器很晚才发现的关键资源」提前拉起来。但只要属性写错,收益立刻变成负值——最典型的就是同一个文件下载两次。

所以判断要不要加,先问一句:这个资源当前页面会用吗?会在很晚才被发现吗?两个都是「是」,才值得加。

这一篇把四种提示的分工、两个致命属性、以及数量上的克制原则讲清楚。

1四种提示各干什么

名字很像,服务对象与优先级完全不同。

提示做的事优先级用在什么场合
dns-prefetch只解析域名很低稍后会碰到的很多第三方域名
preconnect建好连接,含握手与加密协商高当前页面真正依赖的两到四个关键域名
preload完整下载当前页要用的某个文件高,按类型定档晚被发现的关键文件
prefetch空闲时下载下一次导航要用的资源最低几乎确定要去的下一个页面

把两者用反是最常见的错:给下一跳的资源做预加载会白花当前页面的带宽,给当前页的关键字体做预取又赶不上时间。

2两个致命属性

不写这两个,预加载就从加速变成减速。

声明资源类型
不写类型,浏览器按错误的请求模式与头信息发送,之后的真实请求匹配不上,于是下载两遍
字体的跨域标记
字体请求一律按匿名跨域模式发起,同源也一样;不写跨域标记,预加载落在另一个缓存里,字体照样下载两次
顺带要写对的
确认地址与真实请求完全一致(含查询参数),差一个字符就匹配不上
顺序也有讲究
运行时动态插入提示时,先把类型与跨域属性设好,再设地址,避免用错模式发出请求

最常见的现象就是网络面板里同一个字体出现两次请求,其中一次完全没被使用。

3数量上的克制

这类提示的共同特点是「多了就互相抵消」。

提示建议数量超了会怎样
preload一到两个关键文件优先级通胀,等于没有优先级,超过十个基本失去意义
preconnect两到四个域名连接占满套接字池,真实请求排队,反而更慢
dns-prefetch可以很多代价极低,适合铺给长尾域名
prefetch按需受缓存策略影响,且要照顾按流量计费的用户

一次连接的开销并不小:一次域名解析加两次往返,弱网环境下可能就是几百毫秒;所以连接要开在真正会用的域名上。

4三条落地经验

想加之前先自问这三句。

剪掉白预加载
当前页不用的资源不要提前拉;控制台的未使用告警就是这条的信号
注意缓存策略
预取依赖缓存,响应头里若声明不缓存,预取就是空操作
先测量再加
用真实设备测一遍加前加后的关键指标,没有改善就撤掉——提示是优化手段,不是装饰

一句话总结:属性写全、数量克制、确认当前页真的会用;这三条守住,预加载才会是正的收益。

相关疑问

预加载会不会让首屏更快?

只有当它提前拉的是「晚被发现且确实关键」的资源时才会。资源本来就会被早早发现,或者当前页根本不用,加了只会挤占带宽。

预取会影响按流量计费的用户吗?

会。它在空闲时下载下一跳的资源,用户未必会访问那个页面。对流量敏感的场景应当保守,或改用能感知省流设置的机制。

为什么连接预热了却好像没生效?

最常见是跨域模式不匹配:页面开的是普通连接,真实请求走的是跨域模式,那就无法复用,只能再开一条。

老浏览器不支持会怎样?

这些提示都是渐进增强:不认识的浏览器直接忽略,页面照常工作,只是少了这段提前量。所以不必做特性检测才能用。

内容标识:本页内容由人工智能辅助生成,并经人工核对与编辑。详见 人工智能生成内容标识说明。
内容说明:本页针对具体使用问题作答,方法步骤与数值由本站自行整理与复算,事实性内容以对应官方规范与文档为准。内容最后核对日期:2026-10-09。若发现错误,欢迎通过页脚反馈入口告知。