前端性能监控与错误捕获,用户侧的点得注意

举报
海是岛思念的泪 发表于 2026/09/02 14:51:37 2026/09/02
【摘要】 前端代码在用户浏览器里跑,出错了未必知道。本文讲讲前端怎么采集性能数据(FP/FCP/加载耗时)、怎么全局捕获 JS 错误与 Promise 异常、怎么做错误边界,以及把数据上报到服务端形成监控闭环。附一段可直接用的采集与上报代码。

一、要监控的两类东西

  • 性能数据:页面加载多快、首屏什么时候出来、接口耗时多久。直接影响用户体验和留存。
  • 错误数据:JS 运行时异常、未被 catch 的 Promise、资源加载失败、接口报错。这些不抓,你就活在"我这边好好的"幻觉里。

二、性能:用 Performance API 拿真实指标

浏览器自带 performance 接口,能拿到从导航到渲染各阶段的时间戳:

const nav = performance.getEntriesByType('navigation')[0];
console.log('DNS:', nav.domainLookupEnd - nav.domainLookupStart);
console.log('TCP:', nav.connectEnd - nav.connectStart);
console.log('请求响应:', nav.responseEnd - nav.requestStart);
console.log('DOM 解析:', nav.domContentLoadedEventEnd - nav.responseEnd);

// 首屏关键指标
const paint = performance.getEntriesByType('paint');
const fcp = paint.find(p => p.name === 'first-contentful-paint');
console.log('FCP(首次内容绘制):', fcp?.startTime);

FCP(首次内容绘制)能反映用户"看到东西"的快慢,比单纯看 window.onload 更贴近体感。

三、错误:全局兜住漏网的异常

代码里 try/catch 只能覆盖你写到的地方,真正的坑常在意料之外。用全局监听兜住:

// 普通 JS 错误
window.onerror = (msg, src, line, col, error) => {
  report({ type: 'js', msg, src, line, col, stack: error?.stack });
  return true; // 阻止默认打印也行
};

// Promise 未捕获的拒绝
window.addEventListener('unhandledrejection', (e) => {
  report({ type: 'promise', reason: e.reason?.message, stack: e.reason?.stack });
});

// 资源加载失败(img/script/link)
window.addEventListener('error', (e) => {
  if (e.target && (e.target.src || e.target.href)) {
    report({ type: 'resource', url: e.target.src || e.target.href });
  }
}, true); // 注意 capture 用 true 才能捕获资源错误

unhandledrejection 是很多人漏掉的——fetch 失败不进 onerror,如果你没在业务里 catch,就靠它兜底。

image.png

四、框架里的错误边界

React 用错误边界(Error Boundary)拦住组件渲染时的崩溃,避免整页白屏:

class ErrorBoundary extends React.Component {
  state = { hasError: false };
  static getDerivedStateFromError() { return { hasError: true }; }
  componentDidCatch(error, info) { report({ type: 'react', error, info }); }
  render() {
    return this.state.hasError ? <Fallback /> : this.props.children;
  }
}

Vue 则可用 app.config.errorHandler 统一接住组件内抛出的错误。

五、上报:别把监控变成负担

  • 采样上报:全量上报量太大,可按一定比例采样,错误类建议全报、性能类可抽样。

  • 批量+异步:攒一批再发,用 navigator.sendBeacon 在页面关闭时也能可靠送出:

    navigator.sendBeacon('/log', JSON.stringify(payload));
    
  • 加 traceId:和后端链路追踪串起来,用户报问题时能一路追到服务端日志。

小结

前端监控的本质是"把用户侧的无形变成可见"。性能上用 Performance API 拿真实指标,错误上用全局 onerror/unhandledrejection 和资源监听兜住漏网异常,框架内再补错误边界。最后通过采样 + sendBeacon 可靠上报,和后端链路打通。上线前花半天接监控,能省下之后无数个"复现不了"的夜晚。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。