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