性能指标采集
通过浏览器原生 API 采集页面性能数据,是白屏问题排查和体验优化的基础。本文介绍 FP、FCP、LCP、INP、CLS、TTFB、DNS、TCP 等核心指标的采集方式和代码实现。
性能指标体系
有关 FP 与 FID
- Google 废弃 FP 作为 Core Web Vitals 考核指标,是因为它仅反映"有像素变化"而非"有内容",过于粗糙。LCP + CLS 的组合能更好地替代它的作用。FP 对白屏排查仍有参考价值——若 FP 有数据但 FCP 为空,说明渲染了但无实际内容。
- 2024 年正式替代 FID,衡量所有用户交互(点击、键盘、触控)到下一次渲染的完整耗时,比仅衡量首次交互更全面。
实时数据
采集方案
所有指标通过三大 API 获取:
- Performance Observer — 渲染体验类(FP、FCP、LCP、INP、CLS)
- Navigation Timing — 页面加载阶段类(TTFB、DNS、TCP)
- Resource Timing — 单个资源维度(分析资源层面的性能损耗)
- performance.mark / measure — 业务自定义打点
Performance Observer API
统一监听 FP / FCP / LCP / INP / CLS 五项渲染体验指标。buffered: true 必须开启——不加的话,注册 Observer 之前已发生的 paint / layout-shift 事件会被遗漏,导致 CLS 始终为 0。
INP 计算
entry.processingStart + entry.duration - entry.startTime,即从用户触发事件到浏览器完成渲染的完整耗时。
Navigation Timing API
页面级别的加载阶段耗时,通过 performance.getEntriesByType('navigation')[0] 一次性获取。
Resource Timing API
针对每个静态资源的耗时分析,用于判断哪些资源拖慢了整体加载。
前置条件
Resource Timing API 只能在安全上下文 HTTPS 中获取数据,非 HTTPS 环境下返回空数组。
自定义性能打点
业务特有的耗时,如接口请求、复杂计算等,通过 performance.mark 手动标记起止点。
指标阈值建议
阈值说明
以下阈值基于 Google 官方推荐,实际应用时应结合业务场景、目标用户群体(如不同地区网络环境差异)调整。
指标数据上报
使用 navigator.sendBeacon 或 fetch 配合 keepalive 确保页面关闭后仍能完成上报。
白屏时间长 / 首屏渲染慢
首屏优化四大方向: