首屏主图写在 CSS 里用 image-set 切 1x 和 2x,HTML 里也加了 preload。Lighthouse 13 仍报 LCP 4.3 秒,网络面板显示主图在 CSS 解析完之后才开始下载。
一开始怀疑是「CSS 里的图片要等样式表下载完才被发现」,查了一圈,方向不对。
原因不止一个,得分开看。preload 指向的地址和 image-set 实际选中的地址不一致。另一种情况是preload 缺 imagesrcset,浏览器匹配不到 2x 图。
少数情况下是LCP 图放在媒体查询里,移动端命中了另一条规则。
动手时先确认实际预加载的地址
curl -s https://www.example.com/ | grep -o '<link rel="preload"[^>]*>'
给 preload 补 imagesrcset
<link rel="preload" as="image" imagesrcset="/img/hero.avif 1x, /img/hero@2x.avif 2x">
接着把主图改成 img 并提优先级
<img src="/img/hero.avif" fetchpriority="high" width="1200" height="600">
复测 LCP
https://pagespeed.web.dev/
白天有业务在跑,能验证的部分都压到了晚上做。
当时还开着另一个排查窗口,两边日志对照着看才定位到。
别只看报错消失,验证要多做一步。主图请求提前到 HTML 解析阶段,LCP 降到 2.2 秒以内,瀑布图里图片不再排在 CSS 之后。
提醒一点。image-set 的选择权在浏览器,preload 必须把每种候选都写进去,否则预加载等于没做。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。
