为了省流量给全站图片统一加了 loading=lazy,上线后移动端 LCP 从 2.4 秒涨到 4 秒,首屏那张图要等布局完成才开始下载。
一开始怀疑是「srcset 的候选图在懒加载时被推迟到解析之后」,查了一圈,方向不对。
把日志和配置对完,能解释这个现象的基本就这几处。懒加载让首屏图不再参与预加载扫描。也可能是图片没有写尺寸,布局稳定后才确定位置。
还有一种情况,CDN 的图片处理首次访问需要回源,叠加了延迟。
上来先确认首屏图的 loading 属性
curl -s https://www.example.com/ | grep -o '<img[^>]*loading="[^"]*"' | head
给首屏图去掉 lazy 并加优先级
<img src="/hero.webp" fetchpriority="high" width="1200" height="600" alt="">
其余图片保留懒加载
add_filter('wp_img_tag_add_loading_attr', fn($v,$img) => str_contains($img,'hero') ? false : $v, 10, 2);
预加载首屏图
<link rel="preload" as="image" href="/hero.webp" imagesrcset="/hero.webp 1200w">
这类改动我都写进变更记录,过两周再出问题时能对上号。
恢复的判定其实很直接。首屏图恢复立即加载,移动端 LCP 回到 2 秒左右,其余图片仍然按需加载。
这里还有个坑。懒加载不是全站一刀切,首屏内的资源要反过来给最高优先级,否则等于人为推迟 LCP。这类问题最好一次改到位,反复小改反而容易把原因搅混。
