答案:需协同performanceobserver监听longtask与window.onerror/onunhandledrejection,并引入worker双通道自检,覆盖崩溃与卡顿两类问题。performanceobserver须在最早初始化、过滤第三方、按3秒桶聚合;错误上报携带堆栈与上下文;worker通过心跳+自检交叉验证卡顿,数据滑动窗口压缩上报。

要构建一个兼顾全局错误和卡顿的监控系统,不能只靠单一 API。Performance API 提供高精度时间与长任务数据,但不捕获 JS 崩溃;而 window.onerror 等事件能抓异常,却无法感知无报错的卡顿。二者必须协同,才能覆盖“崩溃”与“卡顿”两类核心体验问题。
用 PerformanceObserver 监听 longtask 捕获卡顿根源
主线程执行超 50ms 的任务会直接阻塞渲染,导致掉帧。这不是 FPS 下降,而是用户操作响应延迟——最典型的卡顿场景。
- 在 最早位置 初始化 observer,避免错过首屏关键长任务
- 只监听
longtask类型,且确认浏览器支持:if ('longtask' in PerformanceObserver.supportedEntryTypes) - 按时间桶聚合(如每 3 秒一组),统计密集程度:3 秒内 ≥3 次 longtask 就触发卡顿标记
- 结合用户交互打点,在 click、scroll 前后调用
performance.mark(),便于定位卡顿是否发生在业务操作链路中 - 过滤掉 attribution 为 iframe 或第三方域名的条目,聚焦主文档自身逻辑
用 window.onerror + onunhandledrejection 捕获全局错误
JS 崩溃不会触发 longtask,但会导致功能中断或白屏。这类问题必须靠错误事件兜底。
- 尽早注册
window.onerror(同步错误)和window.onunhandledrejection(异步 Promise 拒绝) - 错误上报需携带上下文:当前 URL、userAgent、deviceMemory、错误堆栈(经 sourcemap 还原)、以及可选的用户会话 ID
- 避免在错误处理函数中执行耗时操作(如 DOM 查询、大量计算),防止雪上加霜
- 使用
navigator.sendBeacon()发送,确保页面卸载前数据不丢失 - 对重复错误做简单节流(如 1 分钟内同错误码最多上报 2 次),减少冗余
交叉验证:用 Worker 实现心跳 + 自检双通道卡顿判断
单纯依赖主线程上报有盲区——万一主线程彻底卡死,消息发不出去。Worker 可作为独立探针提供反向佐证。
- 主线程每 500ms 向 Worker 发送一次心跳,携带
performance.now()时间戳 - Worker 收到后比对间隔,若超过 1200ms(2.4 倍周期)视为疑似卡顿,记录连续超时次数
- Worker 同时运行自检定时器(如每 100ms 执行一次),对比理论执行时间与实际
performance.now(),延迟 >200ms 表明系统级调度受压 - 仅当“主线程心跳停滞”与“Worker 自身延迟升高”同时发生,才判定为高置信度卡顿事件
- 聚合最近 60 秒数据后压缩上传,避免高频通信开销
上报策略与轻量可视化
监控本身不能成为性能负担,数据要精炼、传输要克制、反馈要可用。
- 错误与卡顿事件分开上报,但共用同一 endpoint,后端按 type 区分处理
- 卡顿数据采用滑动窗口统计:每 5 秒汇总平均延迟、P95 延迟、超时次数,而非原始时间戳流
- 前端可内置简易 canvas 折线图,仅在开发环境或灰度流量中启用,生产环境默认关闭
- 控制台输出带颜色标识的 warn 日志(如 [PERF] 卡顿|[ERROR] 崩溃),方便快速排查
- 所有上报请求设置 timeout(如 3s),失败不重试,避免阻塞主线程
大量免费API接口:立即使用
涵盖生活服务API、金融科技API、企业工商API、等相关的API接口服务。免费API接口可安全、合规地连接上下游,为数据API应用能力赋能!











