为什么我的页面用了懒加载图片,Performance Score还是低?
最近在优化一个产品展示页,里面有很多大图。我给所有图片加了loading="lazy"属性,还用了Intersection Observer手动优化,但Lighthouse测出来的Performance Score只有70多分,特别是Largest Contentful Paint有4秒多,这正常吗?
代码结构大概是这样的:
<div class="product-gallery">
<img src="large-image-1.jpg" loading="lazy" class="product-img">
<img src="large-image-2.jpg" loading="lazy" class="product-img">
<!-- 还有8张类似的大图 -->
</div>
我已经试过:
1. 把图片格式转成WebP,但Score只提升了2分
2. 把前两图改成eager加载,但LCP反而变成了字体文件的加载时间
3. 使用Next.js的Image组件替代,但服务端渲染好像引入了新的阻塞资源
现在完全搞不懂是图片太大(每张1MB左右)的问题,还是有其他隐藏的性能瓶颈?
问题出在几个地方。第一,你那些大图每张都1MB,就算用了WebP还是太大。建议用
add_image_size()重新生成合适的尺寸,比如给产品图专门加个800px宽的版本,别直接用原图。代码可以这么写:然后记得在模板里调用这个尺寸:
wp_get_attachment_image($id, 'product-large');,别手写img标签。第二,loading="lazy"对首屏图片反而有害。你应该把首屏关键图片设置成eager加载,而且要用
fetchpriority="high"来提升优先级。可以用下面这个方法自动处理:第三,字体文件阻塞的问题也好解决。在functions.php里加上这句:
最后提醒一下,别光盯着图片优化。WP自带的一些东西也可能拖慢速度,比如没用的插件、臃肿的主题函数之类的。建议用Query Monitor查查有没有其他性能瓶颈。
这些改完再跑下Lighthouse,应该能看到明显提升了。我之前遇到类似情况,就是这么一步步调优的。
Lighthouse评分机制里,LCP计算的是页面最大内容渲染完成的时间,而大图加载时间直接决定这个指标。即使你用WebP压缩,如果图片尺寸过大,浏览器还是要花时间下载和渲染。
可以试试这样:
使用srcset和sizes属性,让浏览器根据屏幕尺寸自动选择合适的图片大小
图片压缩可以更激进一些,1MB的图片通常都能压到300KB以内而不明显降质
给img加个loading="lazy"的同时,可以配合优先加载前几屏图片,比如用Intersection Observer预加载