作为本地测前端性能,Lighthouse 的 Performance 评分,本质是一个“用户体验代理指标体系”。它并不直接测用户满意度,而是通过一组可量化的时间与行为指标,去逼近用户在“看到内容、能操作、是否流畅、是否稳定”这几个关键阶段的真实感受。
Performance 得分由 6 个核心指标加权计算:
- FCP(First Contentful Paint)
- LCP(Largest Contentful Paint)
- SI(Speed Index)
- TTI(Time to Interactive)
- TBT(Total Blocking Time)
- CLS(Cumulative Layout Shift)
理解这些指标,不是背定义,而是搞清楚三件事:
- 它衡量的是页面生命周期中的哪个阶段
- 它为什么会影响用户体验
- 工程上你可以从哪里动手优化
下面按用户体验时间线来拆解。
一、从“白屏”到“看到内容”:FCP
1. 指标本质
FCP 表示:页面第一次出现任何可见内容的时间。
注意是“任何内容”,哪怕只是一个文本节点、一段背景色,都算。
用户视角:
“页面不是白的了,我知道它在加载”
2. 典型问题
FCP 差,本质是首屏渲染被阻塞:
- CSS 阻塞渲染
- 同步 JS 阻塞 HTML 解析
- 字体加载导致文本不可见(FOIT)
3. 核心优化方向
(1)消除渲染阻塞资源
关键点:
- 同步
<script>会阻塞 HTML 解析 <link rel="stylesheet">会阻塞渲染
优化手段:
- JS 加
defer / async - CSS 提取关键 CSS + 延迟加载非关键 CSS
- JS 代码拆分
(2)关键资源前置
核心思想:
让浏览器更早知道“最重要的资源是谁”
<link rel="preload" as="script" href="critical.js">
<link rel="preload" as="style" href="critical.css">(3)字体策略
避免 FOIT,优先展示系统字体。
4. 本质总结
FCP 优化的核心就是一句话:
尽快让浏览器“画点东西出来”,哪怕不完整。
二、从“有内容”到“核心内容”:LCP
1. 指标本质
LCP 表示:
最大可见内容完成渲染的时间
通常是:
- 首屏大图
- Banner
- 主要文本块
用户视角:
“我真正关心的内容出来了”
2. 为什么 LCP 比 FCP 更重要
FCP 可能只是一个 loading skeleton
但 LCP 才是用户真正“开始阅读”的时刻
3. 影响 LCP 的三大核心因素
(1)服务器响应时间(TTFB)
- HTML 返回慢 → 一切都慢
(2)渲染阻塞资源
- CSS / JS 阻塞 → LCP 延迟
(3)资源加载速度
- 图片太大
- 未压缩
- 未走 CDN
4. 核心优化策略
(1)优化首屏资源加载
- 图片压缩 + WebP
- 使用 CDN
- 响应式图片
(2)预加载 LCP 资源
(3)减少 JS 阻塞
- SSR 或预渲染
- 减少 hydration 负担
5. 本质总结
LCP 优化的核心:让“最重要的内容”尽早出现
三、页面“填充速度”:Speed Index
1. 指标本质
SI 衡量的是:
页面内容“逐步填满”的速度
它不是看某一个时间点,而是看整个过程的“视觉进度”。
2. 直观理解
两种页面:
- A:逐渐加载(骨架屏 → 内容填充)
- B:一直白屏 → 一次性全部出来
两者时间一样,但:
- A 的 SI 更好
- B 用户体验更差
3. 计算逻辑(理解即可)
SI 是对“每一帧未填充区域”的积分:
- 填充越早 → 分数越低(越好)
4. 优化方向
本质还是:
- 提前渲染
- 渐进式加载
- 优化关键渲染路径
5. 本质总结
不要让用户“干等”,要让页面“逐步变完整”
四、从“能看”到“能用”:TTI
1. 指标本质
TTI 表示:
页面什么时候可以稳定响应用户操作
条件:
- 页面已渲染(FCP 已发生)
- 事件监听已绑定
- 主线程空闲(无长任务)
2. 核心问题:JS 过重
JS 会影响:
- 下载时间
- 解析时间
- 执行时间(主线程)
3. 典型问题
- 大 bundle
- 长任务阻塞主线程
- 复杂计算在主线程执行
4. 优化手段
(1)代码拆分
(2)减少主线程压力
- Web Worker
- 拆分长任务
(3)PRPL 模式
- Preload
- Render
- Pre-cache
- Lazy-load
5. 本质总结
TTI 优化的核心是:让 JS 不要“霸占主线程”
五、交互卡顿:TBT
1. 指标本质
TBT 衡量:
从 FCP 到 TTI 期间,主线程被阻塞的总时间
规则:
- 单个任务 > 50ms → 视为“长任务”
- 超出部分计入 TBT
2. 举例
- 一个任务执行 70ms
- 阻塞时间 = 20ms
3. 为什么重要
用户点击按钮没反应,本质原因就是:
主线程被 JS 占住了
4. 优化手段
(1)拆分长任务
requestIdleCallbackrequestAnimationFrame
(2)减少 DOM 操作
错误:
(3)减少 JS 体积
- Tree shaking
- 删除无用代码
- 控制第三方脚本
5. 本质总结
TBT 本质是在量化“页面卡不卡”
六、页面稳定性:CLS
1. 指标本质
CLS 衡量:
页面加载过程中“元素乱跳”的程度
2. 用户感知
典型场景:
- 正要点按钮 → 页面一抖 → 点错
- 内容突然下移
3. 计算逻辑
CLS = 影响区域 × 位移距离
4. 常见问题
(1)图片无尺寸
浏览器不知道大小 → 后加载 → 布局变化
(2)广告 / iframe
动态插入 → 挤压内容
(3)动态内容插入
在顶部插入内容 → 全部下移
5. 解决方案
(1)固定尺寸
(2)预留空间
- skeleton
- 占位符
(3)避免非用户触发的布局变化
6. 本质总结
CLS 本质是在衡量“页面是否稳定”
七、六大指标之间的关系
可以用一个完整的用户体验流程来理解:
- FCP:页面开始有内容
- LCP:核心内容出现
- SI:内容逐步填充
- TTI:页面可以操作
- TBT:操作是否流畅
- CLS:页面是否稳定
如果你要在面试中讲清楚 Lighthouse Performance,可以用这一段:
Lighthouse Performance 本质是围绕用户加载体验构建的一套指标体系,从“是否看到内容”到“是否可以交互”,再到“是否流畅稳定”进行全链路衡量。
FCP 和 LCP 解决的是内容呈现问题,SI 描述渲染过程的平滑性,TTI 和 TBT 衡量主线程是否被阻塞影响交互,CLS 则关注页面布局稳定性。
在工程实践中,优化路径可以抽象为三件事:优化关键渲染路径、降低 JavaScript 主线程负载、以及保证布局稳定性。
若有收获,就点个赞吧