为什么页面FCP很高但Lighthouse评分却不错?
我在用 Lighthouse 测速时发现 FCP(首次内容绘制)经常超过 3 秒,但整体性能评分却有 80 多分,这合理吗?是不是我哪里监控错了?
我页面里有个 loading 动画,用 CSS 控制的,会不会影响了 FCP 的计算?相关样式如下:
.loading {
position: fixed;
top: 0;
left: 0;
width: 100%;
height: 4px;
background: #eee;
animation: pulse 1.5s infinite;
}
@keyframes pulse {
0% { opacity: 0.3; }
100% { opacity: 1; }
}
关于你提到的loading动画,它实际上不会影响FCP的计算。官方文档里说,FCP是指页面从开始加载到页面内容的任何部分在屏幕上完成渲染的时间点。你的loading动画属于CSS控制的内容,只要HTML结构已经渲染出来,就算是达到了FCP的标准。
不过为了进一步优化FCP,你可以检查下首屏资源的加载情况,确保关键请求尽早发出。还有就是看看有没有不必要的阻塞渲染的JavaScript或者样式文件。把一些非关键的样式放到
print或者media查询里,这样就不会阻碍首屏内容的渲染了。这个改动可以把一些不影响首屏展示的样式延迟加载。当然这些都是优化建议,具体还得结合你的项目实际情况来看。有时候网络环境差异也会导致测试结果不一样,多跑几次测试取平均值更靠谱些。
先说 Lighthouse 评分这个事。性能评分不是只看 FCP 一个指标,而是多个指标的加权组合。以 Lighthouse 10 为例,权重分布大概是这样的:LCP(最大内容绘制)占 25%,TBT(总阻塞时间)占 30%,CLS(累积布局偏移)占 25%,FCP 其实只占 10%,SI(速度指数)占 10%。所以你的 FCP 确实拖了后腿,但如果 LCP、TBT、CLS 表现还可以,整体评分拉到 80 多分完全正常。
再来分析你的 loading 动画问题。你这段 CSS 本身不会影响 FCP 的计算时机,但问题可能出在 HTML 结构上。FCP 测量的是浏览器首次渲染任何「文本、图像、非空白 canvas 或 SVG」的时间。注意这里的关键词:文本和图像。
你那个 loading 条是纯 CSS 的背景色块加动画,它不算「内容」,不会触发 FCP。浏览器会觉得「这页面还没渲染出真正的内容呢」,所以 FCP 计时器一直在等,等到真正的文字或图片出来才记录。
我猜你的页面结构可能是这样的:loading 动画先显示,然后 JS 加载数据,最后渲染真正的内容。这种情况下 FCP 被推迟到内容渲染完成,而不是 loading 出现的时间。
要验证这个问题,你可以在 loading 区域加一点文字: