直接用 performanceobserver 监听 paint 类型条目可准确捕获首次内容绘制(fcp)时间点,它是浏览器真实渲染首个文本、图片或 svg 的毫秒级时间戳,需通过 supportedentrytypes 检查支持性并筛选 name 为 'first-contentful-paint' 的条目获取 starttime。

直接用 PerformanceObserver 监听 paint 类型条目,就能准确捕获首次内容绘制(FCP)时间点。它不是估算值,而是浏览器真实渲染出第一个文本、图片或 SVG 的毫秒级时间戳,可直接用于性能分析和上报。
注册 Paint Timing 观察器
FCP 属于 Paint Timing API 的一部分,需通过 PerformanceObserver 主动监听:
- 判断浏览器是否支持:
'PerformanceObserver' in window && PerformanceObserver.supportedEntryTypes.includes('paint') - 创建观察器,只关注
paint类型条目 - 在回调中筛选
entry.name === 'first-contentful-paint',取entry.startTime -
startTime是相对于页面加载起点的高精度时间(单位毫秒),无需再减去performance.timeOrigin
兼容性兜底方案
旧版浏览器(如 Safari 15.4 之前)不支持 paint 条目,可用 Navigation Timing + 启动时机粗略估算:
- 检查
performance.getEntriesByType('navigation')[0]中的domContentLoadedEventStart或loadEventStart - 若页面结构简单且首屏内容为 HTML 内联文本,可将
domContentLoadedEventStart作为 FCP 的保守上界参考 - 注意:这不是真实 FCP,仅作 fallback,需在监控系统中标记为“估算”
结合资源与主线程分析瓶颈
拿到 FCP 时间后,不能只看数值,要联动其他 Performance API 数据定位延迟原因:
- 查
performance.getEntriesByType('resource'),看关键 CSS/JS 是否阻塞了渲染(如duration过长或transferSize偏大) - 调用
performance.getEntriesByType('navigation')[0],对比responseEnd和domContentLoadedEventStart,确认 TTFB 或解析耗时是否异常 - 用
performance.memory(如支持)或主线程任务采样(如 Long Tasks API)判断 JS 执行是否挤压渲染时机
上报与持续追踪
FCP 是核心 Web 指标(CWV),应稳定上报并建立基线:
- 使用
navigator.sendBeacon()上报,避免因页面卸载丢失数据 - 按设备类型(mobile/desktop)、网络条件(effectiveType)、地区分维度聚合,识别差异
- 设置告警阈值(如移动端 FCP > 2500ms 触发排查),并与 LCP、CLS 等指标交叉分析
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











