首页 > 其他分享 >如何引入阿里云ARMS前端监控?

如何引入阿里云ARMS前端监控?

时间:2022-10-07 23:03:58浏览次数:49  
标签:Vue err 前端 ARMS errorHandler vm 阿里 error config

老大对我目前手上的项目引入了阿里云ARMS前端监控,但是我自己对ARMS SDK的API以及如何注入到Vue中不是很懂,因此这篇博客诞生了。

/**
* 阿里前端监控
* 配置文档 https://www.npmjs.com/package/alife-logger
*/
import BrowerLogger from 'alife-logger';
const logger = (() => {
if (process.env.NODE_ENV === 'production') {
try {
return BrowerLogger.singleton({
pid: '241asf2342141@dfaf1', // 这是项目ID,新建一个应用站点后自动生成,在单个应用站点内部的`设置->应用设置`查看
imgUrl: 'https://arms-retcode.aliyuncs.com/r.png?', // 日志上传地址,源码中默认值就是这个地址
enableSPA: true, // 是否监听页面的 hashchange 事件并重新上报 PV,适用于单页面应用场景
sendResource: true, // 是否上报资源数据
});
} catch (e) {
// eslint-disable-next-line no-console
console.error('init logger fail', e);
}
} else {
return {
error() {},
};
}
})();

export default

enableSPA: true和hashchange事件是什么意思呢?

开启单页应用的PV上报。 就拿vue来说,通过vue-router进行页面切换时,每个url都会带一个#,例如从​​http://foo.com/#/bar​​​跳转到​​http://bar.com/#/baz​​​。 严格意义上说,这不算是一次page change,但是由于我们是单页应用,所以也算是一次page change,因此我们需要一个事件去监听#后面的内容的变化,这个事件就是hashchange,每次#后面的内容变化,都会算做一次PV。 关于hashchange的更多细节,可以到​​​一些低调的浏览器事件​​​查看,或者到​​hashchange​​查看。

如何注入到vue项目中呢?

main.js

import arms from '@/arms';

Vue.config.errorHandler = (err, vm, info) => {
arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`});
};

Vue.config是什么?

Vue.config是一个对象,包含vue的一些全局配置,可以在启动应用之前修改属性。 它包含​​slient​​​,​​optionMergeStrategies​​​,​​devtools​​​,​​errorHandler​​​,​​warnHandler​​​,​​ignoreElements​​​,​​keyCodes​​​,​​performance​​​,​​productionTip​​等配置项。

这次主要的任务是学习Vue.config.errorHandler,附带着把Vue.config.productionTip = false也了解下。

Vue.config.errorHandler

在组件渲染函数或者watchers期间,分配一个处理器给uncaught error。

Vue.config.errorHandler = function (err, vm, info) {
// err 错误信息
// vm Vue实例
// info Vue-specific error信息

关键词:捕获错误 捕获uncaught error 前端错误追踪 避免前端页面崩溃

  • 2.2.0版本开始,钩子会捕获组件生命周期的错误。
  • 2.4.0+,可以捕获Vue custom event handler中的错误,最典型的自定义事件就是​​vm.$on('eventName', handler)​​。

Vue.config.errorHandler源码:

function globalHandleError (err, vm, info) {
if (config.errorHandler) {
try {
return config.errorHandler.call(null, err, vm, info) // 有定义就返回自定义的运行后的Vue的config.errorHandler。可以用于将错误上报给第三方前端错误追踪服务,例如阿里云ARMS,Sentry,Bugsnag等等
} catch (e) {
logError(e, null, 'config.errorHandler'); // 运行错误的话抛出异常
}
}
logError(err, vm, info); // 当errorHandler为undefined时,被捕获的错误会通过console.error输出避免崩溃,其实也就是默认会捕获uncaught error并且输出,避免崩溃。

logError源码:

function logError (err, vm, info) {
{
warn(("Error in " + info + ": \"" + (err.toString()) + "\""), vm);
}
/* istanbul ignore else */
if ((inBrowser || inWeex) && typeof console !== 'undefined') {
console.error(err);
} else {
throw

errorHandler内部函数为什么是​​arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`});​​?

​www.npmjs.com/package/ali…​​​ 给出了错误信息上报接口的文档。 ​​​__bl.error(error, pos)​​ error为JS的Error对象,filename是pos的一个key,filename后面的模板字符串是为了唯一定位错误信息文件。

vm.$vnode.tag是什么?

​foo.com/#/friend​​ 的vm.

vnode.tag为vue-component-136-record。
http://foo.com/#/autoreply 的vm.

node.tag为vue-component-138-autoreply。

源码在vnode.js。

Vue.config.errorHandler中的info可能是哪些值?

​vue/src/core/util/error.js​​ 源码会暴露一个handlerError函数,通过搜索'handlerEroor'关键词,找到可能输出的值。

handleError(err, vm, `@render`); // src/platforms/weex/runtime/recycle-list/render-component-template.js
handleError(e, vm, `render`); // src/core/instance/render.js
handleError(e, vm, `event handler for "${event}"`); // src/core/instance/events.js
handleError(e, vnode.context, `directive ${dir.name} ${hook} hook`); // src/core/vdom/modules/directives.js
handleError(e, vm, `getter for watcher "${this.expression}"`); // src/core/observer/watcher.js
handleError(e, ctx, 'nextTick'); // src/core/util/next-tick.js
handleError(e, vm, `${hook} hook`); // src/core/instance/lifecycle.js
handleError(e, vm, `data()`); // src/core/instance/state.js
handleError(e, ctx, 'nextTick'); // packages/weex-vue-framework/factory.js,dist目录下的文件基本都有此方法
handleError(e, vm, (hook + " hook"));// packages/vue-server-renderer/build.js,basic.js

​filename: `${vm.$vnode.tag}, ${info}`​​对应ARMS前端监控平台的什么位置?

在访问明细表格的File字段,可以找到filename对应的信息,例如​​File: vue-component-109-chatFriend, nextTick​​。

  • 微信公众号: 大大大前端

标签:Vue,err,前端,ARMS,errorHandler,vm,阿里,error,config
From: https://blog.51cto.com/u_15725382/5735202

相关文章

  • 前端语音转文字实践总结
    最近准备一个技术分享,看到以前做的一个语音转文字的功能,放在slides上落灰了,索性整理到这里和大家分享下。从技术选型,到方案设计,到实际落地,可以说把全链路都覆盖到了。语音转......
  • 前端三剑客快速入门(三)
    前言前端三剑客快速入门(一)前端三剑客快速入门(二)书接上文,重新排版了。CSSCSS定位基本属性:<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8">......
  • 阿里巴巴开源限流组件Sentinel初探之集成Gateway
    1Sentinel主页​​github.com/alibaba/Sen…​​1.1Sentinel介绍随着微服务的流行,服务和服务之间的稳定性变得越来越重要。Sentinel是面向分布式服务架构的流量控制组件,......
  • 前端周刊第三十八期
    前端周刊发表每周前端技术相关的大事件、文章教程、一些框架的版本更新、以及代码和工具。每周定期发表,欢迎大家关注、转载。如果外链不能访问,关注公众号「前端每周看」,里......
  • 前端妹子问我 position fixed 失效问题该如何解决?
    背景这两天公司一位妹子问我,“我这边调试的时候本地显示没问题,到手机端就有问题,该怎么办呢?”测试环境没问题到线上就有问题了?对此我也很纳闷。下图是复现的效果图,这个是一......
  • 玻璃拟态是什么?前端该如何实现
    你好,玻璃拟态玻璃拟态是目前市面上的新风格,越来越受欢迎。新拟态(Neumorphism)模仿了受到挤压的塑料材质(凹凸质感,凸显层次感),这个新的视觉风格更加注重垂直空间z轴的使用。它......
  • 一份工作 6 年前端的 Git 备忘录
    前言熟练的使用git指令,是一个程序员的基本功,本文记录了我这些年常用的一些git操作。进入新团队需要做的一系列git操作高频使用的指令1.注册内网gitLab账户2.项目......
  • 阿里云移动端热修复-Sophix(for Android)-问题解答
    前段时间了解了阿里云的热修复Sophix的基本使用,在使用过程中遇到很多问题,特此记录一下。 1、热修复可以发多个补丁么?答:补丁可以发好多次,但只能发布一个补丁。例如:我已......
  • Vuex与前端表格施展“组合拳”,实现大屏展示应用的交互增强
    Vuex是一个专为Vue.js应用程序开发的状态管理模式。它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化。下图是一个产品开发......
  • 表现层与前端传输数据协议定义
    表现层数据封装整体的思路就是统一前端接受数据格式,创建一个类,用类的属性来封装表现层传输到前端的数据。packagecom.rsh.ssm.controller;publicclassResult{......