javascript_前端监控系统搭建

前端监控系统需采集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);});

资源加载失败:

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

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;

XMLHttpRequest.prototype.open = function(method, url) {this._url = url;this._method = method;return originalXhrOpen.apply(this, arguments);};

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() };

// 避免重复上报相同错误(简单去重)const key = ${finalData.message}-${finalData.lineno};if (sessionStorage.getItem(key)) return;sessionStorage.setItem(key, '1');

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. 基本部署结构

前端注入监控脚本方式:

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

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

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

以上就是javascript_前端监控系统搭建的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1540279.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月21日 12:19:10
下一篇 2025年12月21日 12:19:25

相关推荐

  • MongoDB 日期范围查询:避免字符串陷阱与最佳实践

    本文深入探讨了在 node.js 环境下使用 mongodb 进行日期范围查询的正确方法。核心在于强调将日期数据类型一致性地存储为 mongodb 的 `date` 类型,而非字符串。文章详细阐述了因数据类型不匹配导致查询失败的原因,并提供了正确的日期存储方式和高效的 `$gte`、`$lte` 查…

    2025年12月21日
    000
  • 数组去重的多种方法_性能对比与适用场景分析

    首选Set去重基础类型,代码简洁性能高;兼容旧环境用filter+indexOf;对象数组按字段去重推荐Set结合filter,高效且可扩展。 在 JavaScript 开发中,数组去重是一个常见需求。不同的业务场景对性能和兼容性要求不同,因此选择合适的去重方法至关重要。本文将介绍多种数组去重方式,…

    2025年12月21日
    000
  • 掌握React中useState的正确使用:解决变量不响应更新的问题

    本文旨在深入探讨react函数组件中`usestate` hook的关键作用,特别是在管理组件状态和触发ui更新方面的机制。我们将通过一个实际案例,解释为何在组件内部使用普通`let`变量无法实现状态的持久化和响应式更新,以及如何通过`usestate`来正确声明和管理那些需要在组件重新渲染时保持其…

    2025年12月21日
    000
  • JavaScript中格式化对象数组中特定字符串属性的实用指南

    本文详细介绍了如何在JavaScript中高效地格式化对象数组中特定字符串属性的方法。通过利用`Array.prototype.map()`和`String.prototype.split()`,我们可以轻松地去除字符串中特定分隔符后的内容,实现数据的标准化处理。这对于API返回数据清洗或前端展示逻…

    2025年12月21日
    000
  • JavaScript国际化方案_JavaScript多语言支持

    答案:JavaScript通过Intl对象和第三方库实现国际化。使用Intl.DateTimeFormat和Intl.NumberFormat处理日期、数字格式化,如new Intl.DateTimeFormat(‘zh-CN’)输出“2024/5/20”;采用i18next…

    2025年12月21日
    000
  • 优化React中递归函数条件终止的策略

    本文探讨在React组件中如何高效地条件终止递归函数,特别是在路径查找等场景中。我们将分析使用React `useState`管理终止状态可能遇到的异步问题,并提出一种更健壮的解决方案:通过直接检查数据结构中目标元素的属性来控制递归流程,同时优化代码结构,提升可读性和性能。 在开发基于React的复…

    2025年12月21日
    000
  • 深入理解DOM属性操作与HTML序列化

    本文深入探讨了Web API中`setAttribute`和`getAttribute`方法如何处理包含特殊字符的属性值,以及`outerHTML`在HTML序列化过程中对这些字符进行自动转义的机制。我们将揭示浏览器在DOM内部表示和HTML字符串输出之间,如何智能地维护数据完整性和HTML规范性,…

    2025年12月21日
    000
  • 如何从JavaScript对象中精确提取指定属性

    本文详细介绍了如何在javascript中根据一个键名列表,从现有对象中高效地提取出所需属性,并生成一个新的对象。核心方法是利用`object.entries()`将对象转换为键值对数组,通过`filter()`方法筛选出目标属性,最后使用`object.fromentries()`将筛选后的键值对…

    2025年12月21日
    000
  • JavaScript中精准定位特定div内图片实现动画:多种选择器策略

    本教程详细介绍了如何在javascript中精准选择特定div元素内的图片,并对其进行动画操作,避免影响页面上其他图片。我们将探讨getelementsbyclassname、getelementsbytagname以及queryselectorall等多种dom选择器方法,通过代码示例和专业解析,…

    2025年12月21日 好文分享
    000
  • 解决React初学者渲染问题:理解JSX与环境配置

    针对react初学者在简单设置中遇到的`uncaught syntaxerror: unexpected token ‘jsx与浏览器兼容性,并提供两种有效的环境配置方案:一种是利用cdn快速搭建学习环境,另一种是推荐使用现代构建工具进行专业开发,确保react应用正确渲染,从而帮助开发…

    2025年12月21日
    000
  • 如何在JavaScript中正确获取函数的输出

    本文旨在阐述javascript函数中return语句与console.log()的区别,并指导开发者如何正确地从函数中获取并使用其返回值。通过实例代码,我们将深入理解函数如何通过return语句传递数据,以及如何将这些数据捕获到变量中进行后续操作,从而避免初学者常见的混淆。 在JavaScript…

    2025年12月21日
    000
  • Alpine.js组件中外部函数上下文与数据绑定的深度解析与最佳实践

    本文深入探讨了alpine.js中外部javascript函数与组件内部数据交互时可能出现的上下文(`this`)问题。通过分析直接函数调用和函数引用两种场景,揭示了数据绑定失败的原因,并提供了针对alpine.js v2和v3的两种推荐解决方案,包括将函数封装在`x-data`对象内或使用`alp…

    2025年12月21日
    000
  • JavaScript与CSS:实现容器内可拖拽、可缩放且边界受限的DIV元素

    本教程详细介绍了如何利用JavaScript和CSS在Web页面中创建可拖拽、可调整大小的DIV元素,并确保它们在指定的父容器内活动,不会溢出边界。通过事件监听、DOM操作和边界计算,我们能实现流畅的用户交互,提升界面的灵活性和可用性。 在现代Web应用中,构建具有高度交互性的用户界面是提升用户体验…

    2025年12月21日
    000
  • Three.js中OBJLoader异步加载与Mesh对象提取指南

    本教程详细阐述了在three.js中使用objloader加载obj模型时,如何正确处理异步加载机制并从返回的object3d(通常是group)中提取所需的mesh对象。文章强调了使用async/await模式优化异步代码,并通过遍历group来定位并操作mesh,为后续如csg等需要mesh类型…

    2025年12月21日
    000
  • 基于RxJS在Angular+Electron应用中实现应用级空闲屏幕保护

    本教程详细阐述了如何在Angular与Electron构建的应用中,通过RxJS的fromEvent和debounceTime操作符,实现应用级别的空闲检测与屏幕保护功能。文章将引导读者构建一个监听用户交互事件流、并在指定时间内无活动时自动显示屏幕保护、用户再次交互时自动解除的解决方案,同时提供完整…

    2025年12月21日
    000
  • BetterDiscord插件:安全更新用户“关于我”内容的教程

    本教程旨在指导betterdiscord插件开发者如何在不直接获取和使用用户令牌的情况下,安全地更新discord用户的“关于我”内容。文章将详细介绍如何利用discord内部的`dispatch`函数实现此功能,强调规避直接令牌操作带来的安全风险和账户威胁,并提供具体的代码示例和使用说明,确保插件…

    2025年12月21日
    000
  • Knex QueryBuilder:动态为现有查询添加Schema的策略

    本文探讨了在knex querybuilder中动态为已构建查询(包括from子句和join子句中的表)添加或修改数据库schema的策略。由于knex不直接提供api来检索和修改已添加的join信息,我们介绍了一种利用sql字符串替换的变通方法。该方法通过在初始查询中使用占位符,然后将其转换为sq…

    2025年12月21日 好文分享
    000
  • 解决Alpine.js中外部函数上下文问题:数据绑定与组件化实践

    本文深入探讨alpine.js中调用外部函数时可能遇到的上下文丢失问题,该问题会导致组件内部数据无法正确更新。我们将分析问题根源,并提供两种主要解决方案:针对alpine.js v2版本,通过将函数封装在`x-data`返回的对象中;以及针对alpine.js v3及更高版本,利用推荐的`alpin…

    2025年12月21日
    000
  • 解决JavaScript中动态元素事件监听失效问题:以自定义光标效果为例

    本教程旨在解决JavaScript中为多个动态选择的元素添加事件监听时遇到的常见问题,特别是当使用`document.querySelector`错误地只获取单个元素或在`forEach`循环中错误引用变量时。我们将通过一个自定义光标效果的实例,详细演示如何正确使用`document.querySe…

    2025年12月21日
    000
  • 解决 Alpine.js 中函数上下文与数据绑定问题

    本文深入探讨了Alpine.js中因函数`this`上下文不正确导致的组件数据无法更新问题。通过分析直接调用外部函数与传递函数引用之间的差异,文章提供了针对Alpine.js v2和v3的两种专业解决方案,指导开发者如何将方法正确集成到Alpine组件的`x-data`作用域中,确保数据响应式更新,…

    2025年12月21日
    000

发表回复

登录后才能评论
关注微信