关键在于确保rum数据准、全、轻、稳:聚焦navigation/resource/paint/longtask四类条目,用performanceobserver+getentriesbytype替代过时timing api,延迟上报+beacon兜底+采样裁剪,并附设备、网络、业务上下文。

直接用 Performance API 做 RUM 数据采集,关键不是“能不能”,而是“怎么确保数据准、全、轻、稳”。它不依赖第三方 SDK,原生、低侵入,但需要合理组织监听逻辑和上报时机。
聚焦核心条目类型,按需注册 PerformanceObserver
别一股脑监听所有类型。移动端真实场景下,优先关注四类条目:
-
navigation:获取页面级加载时序(如
domContentLoadedEventEnd、loadEventEnd),用于计算白屏时间、首屏时间、TTI 等; - resource:捕获每个脚本、CSS、图片、XHR/Fetch 的完整生命周期(DNS、TCP、SSL、request、response),是分析网络瓶颈的主数据源;
-
paint:监听
first-paint和first-contentful-paint,反映用户视觉感知起点; - longtask:识别执行超 50ms 的 JS 任务,定位卡顿根源,尤其在低端设备上价值突出。
每个 observer 应独立创建、独立处理,避免混杂逻辑影响稳定性。例如 resource 监听器可单独做资源分类、失败标记、慢请求告警。
避开 timing API 过时陷阱,统一用 getEntriesByType + PerformanceObserver
performance.timing 已废弃,且在 SPA 路由切换后无法反映新视图加载过程。应全程使用:
-
performance.getEntriesByType('navigation')替代 timing 对象,支持单页应用多导航记录; -
performance.getEntriesByType('resource')获取已加载资源快照,配合 observer 持续捕获新增资源; - 对 paint 和 longtask 类型,必须用
PerformanceObserver异步监听,否则可能错过首屏关键指标。
注意:首次调用 getEntriesByType 可能返回空数组,需在 DOMContentLoaded 后再读取已存在条目,再启动 observer 补充后续条目。
设计轻量、可靠的数据上报机制
RUM 数据要真实,就不能干扰用户操作。上报策略需满足三点:
- 延迟上报:不在
load事件立即发请求,改用setTimeout(..., 0)或queueMicrotask推迟到空闲时段; - 卸载前兜底:监听
beforeunload或visibilitychange(当页面隐藏),用navigator.sendBeacon发送未上报数据,防止跳转/关闭丢失; - 采样与裁剪:对高活页面做动态采样(如 10% 用户全量、其余仅报 LCP/CLS/FID),并对长 URL、大 response headers 等字段做长度截断或哈希处理,控制单条数据体积在 2KB 内。
补充环境上下文,让性能数据可归因
脱离用户环境的性能数字没有意义。每次上报时,至少附带:
- 设备信息:
navigator.userAgent(提取机型、OS 版本)、screen.width × screen.height、deviceMemory(如有); - 网络状态:
navigator.connection.effectiveType(如 4g、slow-2g)、rtt、downlink; - 业务维度:当前路由 path、是否登录、AB 实验分组 ID、页面模块标识等。
这些字段不参与性能计算,但能让后续按“Android 低端机 + 2G 网络 + 详情页”这类组合快速下钻,锁定真实瓶颈场景。
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!










