前端错误/性能监控(vue)

news2024/10/1 19:32:12

配置目录结构

错误监听:可以提前发现前端的错误,并且找到对应的位置进行修改。因为等等环境因素可能导致不同的问题,这些问题难以发现,影响用户体验。
性能监听:可以及时发现问题,比如下载的js文件、image时间过长,白屏、渲染时间长等等问题。做对应的优化处理。

在utils/monitor新建两个js文件,分别是errorLog,js全局错误监听,performanceLog.js全局性能监听
![在这里插入图片描述](https://img-blog.csdnimg.cn/65a4d2799e0742b3bafcca41d819cb97.png
在main.js中引入
在这里插入图片描述
这里是在自己封装的请求拦截器里面,监听请求错误
在这里插入图片描述

代码

errorLog.js

注释很详细,包含所有前端错误监听(请求错误在自己封装的请求拦截器response中收集)
主要用到
1、window.addEventListener(‘error’,error=>{}) 静态资源加载错误 或者 JS错误(不会捕获promise)
2、window.addEventListener(‘unhandledrejection’,error=>{}) 监听promise错误
3、app.config.errorHandler=error =>{} vue渲染或者vue处理错误(react用法自查)
监听在页面刷新或关闭前,将错误发送到服务器(我这里加了个,当50条错误的时候先上传)

/**
 * 前端错误主要有四种: JS错误、静态资源错误、vue逻辑错误、请求错误
 * 
 * 三种方式上传数据
 * 参考:https://developer.mozilla.org/zh-CN/docs/Web/API/Navigator/sendBeacon
 * 1、axios
 * 2、image:get请求,参数大小受限,不同浏览器不一样(2k-8k)
 * 		 let image = new Image()
 * 		 image.src = `https://www.xx.com?log=${encodeURI(JSON.stringify(data))}`
 * 3、sendBeacon:(推荐)post异步请求可以保证数据有效送达,且不会阻塞页面的卸载或加载
 *
 */
import router from '@/router/index'

const SendUrl = process.env.VUE_APP_API_ERROR // https:www.xx.com

const monitor = { // 监控
  errors: [] // 错误
}

// 错误代码
const errCode = new Map([
	// 本地系统错误
	['E1001', '系统未知错误'],
	['E1002', 'vue逻辑错误'],
	['E1003', 'JavaScript错误'],
	['E1004', '静态资源加载错误'],
	['E1005', '请求错误'],
	['E1006', 'Promise错误']
])

/**
 * 开启监听
 * @param {any} app 
 */
export const errorLog = (app) => {
	/**
	 * vue渲染或者vue处理错误
	 * @param {object} error Error对象
	 * @param {object} vm Vue 应用本身
	 * @param {string} info Vue 特有的字符串
	 */
	app.config.errorHandler = (error, vm, info) => {
		console.error('监测到E1002错误');
		console.error(error.filename);
		errorHandler('E1002', error.name + ':' + error.message)
	}
	
	/**
	 * 静态资源加载错误 或者 JS错误(不会捕获promise)
	 * @param {string} message 错误信息
	 * @param {string} source 发生错误的脚本URL
	 * @param {number} lineno 发生错误的行号
	 * @param {number} colon 发生错误的列号
	 * @param {object} error Error对象
	 */
	window.addEventListener('error', (error, message, source, lineno, colon) => {
		// 区分是否是js错误
		if (error.message) {
			console.error('监测到E1003错误');
			errorHandler('E1003', error.message, error.filename)
		} else {
			console.error('监测到E1004错误');
			errorHandler('E1004', error.target.currentSrc, error.filename)
		}
	}, true)
	/**
	 * 监听 promise 错误 缺点是获取不到行数数据
	 * 
	 */
	window.addEventListener("unhandledrejection", error => {
		console.error('监测到E1006错误');
		errorHandler('E1006', error.message, error.filename)
	}, true)
	
	/**
	 * 在即将离开当前页面(刷新或关闭)时执行
	 */
	window.addEventListener('beforeunload',() => {
		saveLog()
	})
}

/**
 * 错误处理函数
 * 加一层判断,如果数据大于50条,将错误信息先上传
 * @param {string} code 错误码
 * @param {string} msg 错误信息 - 请求错误:error错误信息 + url请求地址 + param参数
 * @param {string} file 文件
 */
export const errorHandler = (code, msg, file = 'null') => {
	// 这里处理监听到的错误
	// 保存错误信息
	monitor.errors.push({
		code: code,
		type: errCode.get(`${code}`),
		msg: msg,
		router: router.app._route.fullPath,
		file: file,
		createTime: new Date().toLocaleString()
	})
	if(monitor.errors.length>=50){
		saveLog()
	}
}

/**
 * 数据上报
 */
const saveLog = () => {
	navigator.sendBeacon(SendUrl, JSON.stringify(monitor.errors))
	monitor.errors = []
}



performanceLog.js

在浏览器渲染完成时,上传一次数据。


/**
 * 加载资源:css、img、link、script等等
 * 性能:白屏时间、dom渲染耗时、页面加载耗时等等
 * 
 * 在页面加载完成之后上传 监控数据 数组
 */
import router from '@/router/index'

const SendUrl = process.env.VUE_APP_API_PERFORMANCE // https:www.xx.com

const monitor = { // 监控
  performance: null, // 性能
  resources: [], // 资源
}

export const performanceLog = ()=>{
	/**
	 * 在页面加载完后上报性能数据
	 */
	window.addEventListener('load',()=>{
		if(window.requestIdleCallback) { // 如果浏览器支持这个方法,利用这个方法采集页面性能数据
		  window.requestIdleCallback(() => {
		    monitor.performance = getPerformance()
		    monitor.resources = getResources()
		    savePerformance()
		  })
		} else {
		  setTimeout(function() {
		    monitor.performance = getPerformance()
		    monitor.resources = getResources()
		    savePerformance()
		  }, 0)
		}
	})
}

/**
 * 获取页面加载的时间性能信息
 */
function getPerformance() {
  if (!window.performance) return
  const timing = window.performance.timing
  return {
    whiteScreen: timing.domLoading - timing.navigationStart, // 白屏时间
    redirect: timing.redirectEnd - timing.redirectStart, // 重定向耗时
    dom: timing.domComplete - timing.domLoading, // dom渲染耗时
    load: timing.loadEventEnd - timing.navigationStart, // 页面加载耗时
    unload: timing.unloadEventEnd - timing.unloadEventStart, // 页面卸载耗时
    request: timing.responseEnd - timing.requestStart, // 请求耗时
    time: new Date().toLocaleString(), // 获取性能信息时当前时间
	router: router.app._route.fullPath
  }
}

/**
 * 获取页面资源加载的时间性能信息
*/
function getResources() {
  if (!window.performance) return
  const data = window.performance.getEntriesByType('resource')
  const resources = {
    css: [],
    img: [],
    script: [],
    xmlhttprequest: [],
    link: [],
    fetch: [],
    iframe: [],
    other: [],
    time: new Date().toLocaleString()
  }
  data.forEach(item => {
    let key = resources[item.initiatorType]?item.initiatorType:'other'
    resources[key].push({
      name: item.name, // 资源的名称
      duration: item.duration.toFixed(2), // 资源加载耗时
      size: item.transferSize, // 资源大小
      protocol: item.nextHopProtocol, // 资源所用协议
    })
  })
  return resources
}

function savePerformance(){
	navigator.sendBeacon(VUE_APP_API_PERFORMANCE, JSON.stringify(monitor))
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/348262.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Stream流源码分析及技巧(含大量案例)

Stream流源码分析及技巧(含大量案例) 目录 Stream流源码分析及技巧(含大量案例) 更新说明 简介(这部分摘了部分官方文档) 特性 Stream接口关系图 Stream流接口方法 Stream流之间的转换 与Stream流相…

华为OD面试经验分享,尤其注意机试题部分

文章目录招聘流程和背景介绍面试准备机试题目类型和解答技巧在算法部分在操作系统部分面试官提问和答题技巧面试总结和建议推荐一些华为 od 常见的机试题题目:两数之和题目:二叉树的遍历题目:链表反转题目:最大子序和招聘流程和背…

解决QML debugging is enabled.Only use this in a safe environment.警告

系列文章目录 文章目录系列文章目录前言一、警告原因二、解决办法参考前言 我试图运行一个非常简单的程序,当单击退出按钮时关闭窗口,但获取以下输出,前提是包含按钮的应用程序窗口不显示: 您已启用QML调试(实际上它默认启用)&…

CleanMyMac4.12.5最新版Mac系统清理优化工具

CleanMyMac X可以优化Mac系统。mac系统用久了,用CleanMyMac清理一下效果还不错。可用来清理系统的缓存、日志、语言和垃圾文件,还能卸载应用程序。小编给您带来cleanmymac中文版,CleanMyMac是一款Mac系统清理优化工具,使用只需两个…

Java中Synchronized关键字的基本使用方法

Java中Synchronized关键字的基本使用方法 1.简介 Synchronized是java的关键字,synchronized可以保证在同一个时刻,只有一个线程可以执行某个方法或者某个代码块(主要是对方法或者代码块中存在共享数据的操作),synchronized可保证一个线程的变…

动态规划【Day01】| 669 · 换硬币、114 · 不同的路径、116 · 跳跃游戏

秘诀:确定状态转移方程初始条件和边界情况计算顺序 669 换硬币 669 换硬币 题目描述: 给出不同面额的硬币以及一个总金额. 写一个方法来计算给出的总金额可以换取的最少的硬币数量. 如果已有硬币的任意组合均无法与总金额面额相等, 那么返回 -1。 样…

元宇宙将如何彻底改变 K-12 和高等教育

欢迎来到Hubbleverse 🌍 关注我们 关注宇宙新鲜事 📌 预计阅读时长:9分钟 本文仅代表作者个人观点,不代表平台意见,不构成投资建议。 想象一下,你将作为一个微小的细胞去参观人类的循环系统。这只是元宇…

基于django搭建简单的个人博客

文章目录第一步、在Ubuntu中安装虚拟环境并进入第二步、安装blog所需要的包,在requirements.txt中安装mysqlclient可能会报错,输入下列命令后在安装即可成功第三步、创建好数据库,把测试数据导入第四步、修改DjangoBlog包中 settings中数据库…

企业如何做好EHS环境健康安全管理?

目前随着传统制造业企业安全管理制度的落实,工人的安全意识得到很大的提升,但企业内部的安全管理制度并不能完全避免意外发生。如受限空间人员闯入、特种设备伤人、人员作业不规范、危化品泄露、仓储车间发生火情、有毒有害气体超标等一系列安全隐患。对…

leaflet 修改popup的样式,个性化弹窗(069)

第069个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+leaflet中修改popup组件的样式,个性化弹窗。主要方法是更改css, 中增加custom-popup类名,style的样式要做穿透处理 >>>.具体方法请参考源代码。 直接复制下面的 vue+leaflet源代码,操作2分钟即可运行实…

使用Python绘制股票CCI指标曲线

本文使用Python语言绘制一只股票的CCI(Commodity channel index)曲线,论文参考《Commodity channel index: Tool for trading cyclic trends》,该指标可以用来测量股价、外汇或者贵金属交易是否已超出常态分布范围,​ …

MYSQL数据库-主从复制(原理及搭建)

文章目录1 概述2 原理3 搭建3.1 主库配置3.2 从库配置1 概述 主从复制是指将主数据库的DDL和 DML操作通过二进制日志传到从库服务器中,然后在从库上对这些日志重新执行(也叫重做),从而使得从库和主库的数据保持同步。 MySQL支持一台主库同时向多台从库进…

周立功ZCANPRO基础使用教程

软件及驱动安装 1.安装ZCANPRO软件 ZCANPRO软件官网:USB接口CAN卡-广州致远电子股份有限公司 点击资料下载: 2.安装驱动 本人使用的USBCANFD-200U设备,大家可根据自己的设备下载对应的驱动。 设备驱动官网链接:https://manual.zlg.cn/web/#/42/2462 软件使用教程 1.选择…

嵌入式开发:你需要知道的5种简单

传达嵌入式软件体系结构设计意图通常伴随着基于嵌入式开发人员经验的假设。你可以从资源受限的基于微控制器的系统的角度来看架构设计。如何设计架构将取决于系统的嵌入式软件分类。有许多不同的方法可以对嵌入式软件进行分类。我发现有五种简单的嵌入式软件分类可以帮助我调整…

字符串内存分配

涉及三块区域:栈,堆,字符串常量池(jdk1.7之前在方法区,jdk1.7之后在堆中) 关于字符串常量池到底在不在堆中: jdk1.6及以前,方法区独立存在(不在堆里面)&…

达梦数据库监控指标

一、达梦数据库监控指标 数据库常见性能指标主要有:当前登录数、非阻塞锁数、当前死锁数、阻塞锁数、当前锁数、会话数等内容,如下图所示。 注意:以下是 达梦数据库监控所需要的指标,具体根据需要监控哪些、超阈值而定。 1.1 新建主机群组 1.2 新建模板 1.3 创建主机 1.…

【Airplay_BCT】Bonjour API架构

Bonjour API 架构 OS X 和 iOS 为 Bonjour 服务应用程序提供了多层应用程序编程接口 (API): Foundation 框架中的 NSNetService 和 NSNetServiceBrowser 类; CFNetServices,Core Services 中 CFNetwork 框架的一部分; Java 的 DN…

如何在现实场景中随心放置AR虚拟对象?

随着AR的发展和电子设备的普及,人们在生活中使用AR技术的门槛降低,比如对于不方便测量的物体使用AR测量,方便又准确;遇到陌生的路段使用AR导航,清楚又便捷;网购时拿不准的物品使用AR购物,体验更…

【每天进步一点点】函数表达式和函数声明

函数声明 function 函数名(){} 函数声明会被率先读取。 函数声明后不会立即执行,会在我们需要的时候调用到。 由于函数声明不是一个可执行语句,所以不以分号结束。 函数表达式 表达式赋值给了一个变量 const 变量名 functi…

GT-suite v2016解决许可证过期问题(附新版liscense下载地址)

安装GT-suite v2016时遇到了如图报错的问题。当时的报错找不到了,下图是贴吧相同问题的报错图。 为了解决问题,先根据某网友的如下答复操作: 添加环境变量后仍然有相同报错。 看来需要寻找其他方法。 再尝试着卸载GT-suite v2016&#xff0c…