0

0

javascript_前端监控系统搭建

幻影之瞳

幻影之瞳

发布时间:2025-12-03 14:02:02

|

980人浏览过

|

来源于php中文网

原创

前端监控系统需采集JavaScript错误、资源加载异常、性能指标、接口异常及用户行为。1. 通过window.onerror捕获脚本错误,window.onunhandledrejection监听未处理的Promise拒绝。2. 利用Performance API获取FP、FCP、LCP等核心性能数据并在load后上报。3. 重写XMLHttpRequest和fetch实现接口请求监控,记录状态码异常。4. 使用sendBeacon发送日志,降级使用Image上报,并通过sessionStorage防止重复提交。5. 监控脚本可独立引入或构建时注入,服务端接收并分析数据以提升稳定性与体验。

javascript_前端监控系统搭建

前端监控系统能帮助团队及时发现和定位线上问题,提升用户体验和系统稳定性。在 JavaScript 项目中搭建一套基础的前端监控体系,核心目标是收集错误、性能数据和用户行为,并将这些信息上报到服务端进行分析。

1. 监控哪些内容

一个实用的前端监控系统通常关注以下几类数据:

  • JavaScript 错误:包括语法错误、运行时异常、Promise 拒绝未处理等。
  • 资源加载错误:如图片、脚本、样式表加载失败。
  • 页面性能指标:如 FP(First Paint)、FCP(First Contentful Paint)、LCP、CLS、FID 等 Core Web Vitals。
  • 用户行为轨迹:关键操作点击、路由变化等(可选)。
  • 接口异常:Ajax 或 Fetch 请求失败、响应码异常。

2. 错误捕获实现

通过全局事件监听,可以捕获大多数前端异常。

全局错误:

使用 window.addEventListener('error') 捕获脚本、资源等运行时错误。

立即学习Java免费学习笔记(深入)”;

window.addEventListener('error', (event) => {
  const errorData = {
    type: 'error',
    message: event.message,
    filename: event.filename,
    lineno: event.lineno,
    colno: event.colno,
    stack: event.error?.stack || ''
  };
  report(errorData); // 上报函数
});

未处理的 Promise 异常:

监听 unhandledrejection 事件。

window.addEventListener('unhandledrejection', (event) => {
  const reason = event.reason;
  const errorData = {
    type: 'promise',
    message: reason?.message || String(reason),
    stack: reason?.stack || ''
  };
  report(errorData);
});

资源加载失败:

注意这类错误不包含堆,需单独判断。

MusicAI
MusicAI

AI音乐生成工具

下载
window.addEventListener('error', (event) => {
  const target = event.target;
  if (target !== window && target.src || target.href) {
    const resourceError = {
      type: 'resource',
      tagName: target.tagName,
      src: target.src || target.href
    };
    report(resourceError);
  }
}, true); // 使用捕获阶段

3. 性能数据采集

利用 Performance API 获取关键性能指标。

function collectPerformance() {
  const perfData = performance.getEntriesByType('navigation')[0];
  return {
    fp: performance.getEntriesByName('first-paint')[0]?.startTime,
    fcp: performance.getEntriesByName('first-contentful-paint')[0]?.startTime,
    domReady: perfData.domContentLoadedEventEnd,
    loadTime: perfData.loadEventEnd,
    ttfb: perfData.responseStart - perfData.requestStart
  };
}
// 页面加载完成后上报
window.addEventListener('load', () => {
  setTimeout(() => { // 确保 FP/FCP 已记录
    report({ type: 'performance', data: collectPerformance() });
  }, 1000);
});

4. 接口请求监控

通过重写 fetchXMLHttpRequest 实现请求拦截。

以 XMLHttpRequest 为例:
const originalXhrOpen = XMLHttpRequest.prototype.open;
const originalXhrSend = XMLHttpRequest.prototype.send;
<p>XMLHttpRequest.prototype.open = function(method, url) {
this._url = url;
this._method = method;
return originalXhrOpen.apply(this, arguments);
};</p><p>XMLHttpRequest.prototype.send = function(body) {
this.addEventListener('loadend', function() {
if (this.status >= 400) {
report({
type: 'ajax',
method: this._method,
url: this._url,
status: this.status,
response: this.responseText?.slice(0, 200)
});
}
});
return originalXhrSend.apply(this, arguments);
};

fetch 拦截(建议封装或用代理):

重写 fetch 并保留原逻辑。

const originalFetch = window.fetch;
window.fetch = function(...args) {
  return originalFetch.apply(this, args)
    .then(res => {
      if (!res.ok) {
        report({
          type: 'fetch',
          url: args[0],
          status: res.status
        });
      }
      return res;
    })
    .catch(err => {
      report({ type: 'fetch', url: args[0], error: err.message });
      throw err;
    });
};

5. 数据上报与去重

使用 navigator.sendBeacon 确保页面关闭时数据仍可发送,否则降级为 Image 上报。

function report(data) {
  const finalData = { ...data, url: location.href, timestamp: Date.now(), uid: getUID() };
<p>// 避免重复上报相同错误(简单去重)
const key = <code>${finalData.message}-${finalData.lineno}</code>;
if (sessionStorage.getItem(key)) return;
sessionStorage.setItem(key, '1');</p><p>if (navigator.sendBeacon) {
navigator.sendBeacon('/log', new Blob([JSON.stringify(finalData)], { type: 'application/json' }));
} else {
new Image().src = '/log?d=' + encodeURIComponent(JSON.stringify(finalData));
}
}

6. 基本部署结构

前端注入监控脚本方式:

  • 打包时引入监控模块。
  • 通过 <script> 标签异步加载(推荐用于多项目复用)。
  • 结合构建工具自动注入(如 webpack 插件)。

服务端需提供接收接口(如 /log),存储并分析日志,可用 ELK、Prometheus 或自建数据库。

基本上就这些,核心是稳定采集、合理上报、避免影响主流程。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
ajax教程
ajax教程

php中文网为大家带来ajax教程合集,Ajax是一种用于创建快速动态网页的技术。通过在后台与服务器进行少量数据交换,Ajax可以使网页实现异步更新。这意味着可以在不重新加载整个网页的情况下,对网页的某部分进行更新。php中文网还为大家带来ajax的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。

166

2023.06.14

ajax中文乱码解决方法
ajax中文乱码解决方法

ajax中文乱码解决方法有设置请求头部的字符编码、在服务器端设置响应头部的字符编码和使用encodeURIComponent对中文进行编码。本专题为大家提供ajax中文乱码相关的文章、下载、课程内容,供大家免费下载体验。

170

2023.08.31

ajax传递中文乱码怎么办
ajax传递中文乱码怎么办

ajax传递中文乱码的解决办法:1、设置统一的编码方式;2、服务器端编码;3、客户端解码;4、设置HTTP响应头;5、使用JSON格式。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

124

2023.11.15

ajax网站有哪些
ajax网站有哪些

使用ajax的网站有谷歌、维基百科、脸书、纽约时报、亚马逊、stackoverflow、twitter、hacker news、shopify和basecamp等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

260

2024.09.24

scripterror怎么解决
scripterror怎么解决

scripterror的解决办法有检查语法、文件路径、检查网络连接、浏览器兼容性、使用try-catch语句、使用开发者工具进行调试、更新浏览器和JavaScript库或寻求专业帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

492

2023.10.18

500error怎么解决
500error怎么解决

500error的解决办法有检查服务器日志、检查代码、检查服务器配置、更新软件版本、重新启动服务、调试代码和寻求帮助等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

382

2023.10.25

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

1962

2023.10.19

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

658

2025.10.17

TypeScript类型系统进阶与大型前端项目实践
TypeScript类型系统进阶与大型前端项目实践

本专题围绕 TypeScript 在大型前端项目中的应用展开,深入讲解类型系统设计与工程化开发方法。内容包括泛型与高级类型、类型推断机制、声明文件编写、模块化结构设计以及代码规范管理。通过真实项目案例分析,帮助开发者构建类型安全、结构清晰、易维护的前端工程体系,提高团队协作效率与代码质量。

49

2026.03.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
React 教程
React 教程

共58课时 | 6.1万人学习

TypeScript 教程
TypeScript 教程

共19课时 | 3.5万人学习

Bootstrap 5教程
Bootstrap 5教程

共46课时 | 3.6万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号