← 返回目录

第 1 卷

第 1 / 13 卷日期:

前端监控全面解析

你提出的这几个问题覆盖了前端监控的核心维度,我将逐一为你详细解答,同时兼顾理论与实践可操作性。

一、前端监控的目的和重要性

核心目的

前端监控的核心目的是全面、实时地掌握前端应用在生产环境中的运行状态,及时发现并定位问题、量化应用性能和用户行为特征,最终为应用优化、业务决策提供数据支撑。

重要性
  1. 问题排查效率提升:生产环境的前端问题(如兼容性bug、异步错误)具有偶发性、环境特异性,

无法通过本地调试复现,监控系统可提供错误堆栈、用户环境、操作路径等关键信息,大幅降低排查成本。

  1. 保障用户体验:及时发现页面加载缓慢、交互卡顿、功能异常等问题,在用户大规模反馈前主动介

入修复,避免用户流失。

  1. 量化优化效果:性能优化、交互优化后,可通过监控数据对比(如加载时间下降、错误率降低)验

证优化成果,避免主观判断。

  1. 支撑业务决策:基于用户行为数据,明确用户偏好、核心功能使用情况,为产品迭代(如功能优先

级排序、交互改进)提供数据依据。

  1. 提升系统稳定性:通过监控建立预警机制,当错误率、性能指标超过阈值时及时告警,防止小问题

演变为大规模故障。

二、前端错误监控的实现方式(附示例)

前端错误主要分为代码运行时错误、资源加载错误、Promise 未捕获错误三大类,需针对性捕获,核心实现方案如下:

1. 捕获各类错误的核心方法

(1)运行时同步错误: window.onerror

用于捕获 JavaScript 同步执行过程中的错误(如变量未定义、语法错误等),无法捕获 Promise 错误和资源加载错误。

4// source:错误发生的脚本URL 5// lineno:错误发生的行号

6// colno:错误发生的列号 7// error:Error对象(包含堆栈信息)

8const errorInfo = {

9type: 'runtimeError',//错误类型标识
10message: message,
11source: source,
12line: lineno,
13column: colno,
14stack: error?.stack || '无堆栈信息',//堆栈信息(关键,用于定位代码)
15userAgent: navigator.userAgent,//用户环境(浏览器、系统)
16timestamp: Date.now()//错误发生时间
17};

18 19// 上报错误信息到后端监控服务

20reportErrorToServer(errorInfo);

21

22//返回true表示已处理错误,浏览器不再默认打印错误到控制台;返回false则保留默认行为
23return true;
24};

(2)Promise 未捕获错误: window.unhandledrejection

用于捕获所有未被 catch 处理的 Promise 错误(如异步请求失败、async/await 未加 try/catch 等)。

Code block

1window.addEventListener('unhandledrejection', function(event) {
2//阻止浏览器默认提示
3event.preventDefault();

4 5const errorInfo = {

6type: 'promiseError',

7reason: event.reason?.message || 'Promise执行失败',//错误原因
8stack: event.reason?.stack || '无堆栈信息',
9userAgent: navigator.userAgent,
10timestamp: Date.now()
11};

用于捕获图片、脚本、样式表等静态资源加载失败的错误(需通过事件捕获阶段监听,因为资源加载错误不会冒泡)。

Code block

1window.addEventListener('error', function(event) { 2// 区分资源加载错误和运行时错误

3const target = event.target;

4if (target instanceof HTMLScriptElement ||
5target instanceof HTMLLinkElement ||
6target instanceof HTMLImageElement) {
7//资源加载错误
8const errorInfo = {
9type: 'resourceError',
10resourceType: target.tagName.toLowerCase(),// script/link/img
11resourceUrl: target.src || target.href,//资源URL
12userAgent: navigator.userAgent,
13timestamp: Date.now()
14};

15 16reportErrorToServer(errorInfo);

17} 18}, true); // 第三个参数为true,表示在捕获阶段监听事件

2. 错误上报方式

Code block

1//简单的错误上报函数(支持跨域,优先使用navigator.sendBeacon,兼容性差时用xhr)
2function reportErrorToServer(errorInfo) {
3const reportUrl = 'https://xxx.com/api/front/error/report';//后端上报接口
4const data = JSON.stringify(errorInfo);

5

6// navigator.sendBeacon:异步上报,不阻塞页面卸载,优先使用
7if (navigator.sendBeacon) {
8const blob = new Blob([data], { type: 'application/json; charset=utf-8' });
9navigator.sendBeacon(reportUrl, blob);
10} else {
11//兼容方案:XMLHttpRequest
12const xhr = new XMLHttpRequest();
全站分卷索引 · 13 卷
  1. 1第 1 卷
  2. 2第 2 卷
  3. 3第 3 卷
  4. 4第 4 卷
  5. 5第 5 卷
  6. 6第 6 卷
  7. 7第 7 卷
  8. 8第 8 卷
  9. 9第 9 卷
  10. 10第 10 卷
  11. 11第 11 卷
  12. 12第 12 卷
  13. 13第 13 卷