页面 head 里写了六个 preconnect 加四个 dns-prefetch,覆盖统计、字体、客服、支付,首屏反而慢了 200ms,LCP 从 2.4 秒涨到 2.6 秒。

一开始怀疑是「preconnect 和 preload 重复,抢了首图带宽」,查了一圈,方向不对。

真正麻烦的地方在于,几个原因的现象几乎一样。每个 preconnect 都占一条连接,超过浏览器并发上限。另一种情况是部分域名已经下线,握手失败还要白等超时。

还有一种情况,关键域名没写 crossorigin,连接无法复用。

动手时先列出所有预连接域名

curl -s https://www.example.com/ | Select-String "preconnect|dns-prefetch"

只保留首屏真正用到的两个

echo '<link rel="preconnect" href="https://cdn.example.com" crossorigin>';

接着删掉已下线的域名

curl -s https://www.example.com/ | Select-String preconnect

复核首屏耗时

npx lighthouse https://www.example.com/ --only-audits=largest-contentful-paint --chrome-flags="--headless"

这类改动我都写进变更记录,过两周再出问题时能对上号。

我习惯把每一步的执行时间和结果记在一边,后面复盘省事。

改完先别撤,确认这几项。预连接域名降到两个,首屏 LCP 回到 2.4 秒,控制台不再出现连接超时告警。

preconnect 是抢跑不是越多越好,首屏之外的域名交给预取就行。报错文案容易误导,真正的原因往往在相邻那一层的日志里。

作者 9823189