LCP元素加载太慢,怎么优化首屏图片的LCP?

欧阳竞兮 阅读 50

我用React做了一个首页,首屏有一张大图,Lighthouse测出来LCP特别差,有4秒多。明明图片已经加了loading=”lazy”,但好像没起作用?

我试过把图片放CDN、压缩到200KB以内,还用了next/image组件(虽然现在是纯React项目),但LCP还是很高。是不是因为图片在useEffect里才设置src?

function HeroImage() {
  const [imgSrc, setImgSrc] = useState('');
  useEffect(() => {
    setImgSrc('/hero-banner.jpg'); // 延迟赋值
  }, []);
  return <img src={imgSrc} alt="hero" loading="lazy" />;
}
我来解答 赞 15 收藏
二维码
手机扫码查看
2 条解答
UE丶艳平
问题就在loading="lazy"和useEffect上。首屏LCP图片绝对不能lazy加载,浏览器会等你滚动才加载,黄花菜都凉了。

直接这样写:

function HeroImage() {
return <img src="/hero-banner.jpg" alt="hero" fetchpriority="high" />;
}


把loading="lazy"删掉,别在useEffect里延迟设置src,加上fetchpriority="high"提升加载优先级。如果还想更快,可以在HTML里加preload:

<link rel="preload" as="image" href="/hero-banner.jpg">


200KB以内的图片这样处理完,LCP应该能降到1秒以内。
点赞
2026-03-14 06:02
志鲜
志鲜 Lv1
问题找到了,你犯了一个很常见的错误。

loading="lazy" 是给首屏外的图片用的,首屏图片千万不能用 lazy,这会导致浏览器延迟加载你本来需要尽快展示的内容。你那个4秒的LCP就是这个属性害的,浏览器一看 lazy 就把图片往后排了。

再加上 useEffect 里才设置 src,图片请求又晚了一拍,更是雪上加霜。

改起来很简单:

直接写死 src,别在 useEffect 里绕一圈:

function HeroImage() {
return <img src="/hero-banner.jpg" alt="hero" fetchpriority="high" />;
}


如果用 next/image(虽然你说现在是纯 React 项目,但如果以后迁移或者别人看这个问题),应该这么用:

import Image from 'next/image';

function HeroImage() {
return (
<Image
src="/hero-banner.jpg"
alt="hero"
priority={true}
fill
sizes="100vw"
/>
);
}


priority={true} 会自动加上 preload 和 fetchpriority="high",这就是 next/image 的正确用法,比你自己加什么都有用。

总结一下要点:
1. 首屏图片去掉 loading="lazy",改成 loading="eager" 或者直接不写
2. 不要在 useEffect 里设置 src,直接写死
3. 加 fetchpriority="high" 告诉浏览器这个图片优先级最高
4. 图片尺寸要指定,避免 layout shift

做完这些再跑 Lighthouse 试试,LCP 应该能降到1秒以内。
点赞
2026-03-12 15:14