老大对我目前手上的项目引入了阿里云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 logger;
开启单页应用的PV上报。
就拿vue来讲,经过vue-router进行页面切换时,每一个url都会带一个#,例如从http://foo.com/#/bar
跳转到http://bar.com/#/baz
。
严格意义上说,这不算是一次page change,可是因为咱们是单页应用,因此也算是一次page change,所以咱们须要一个事件去监听#后面的内容的变化,这个事件就是hashchange,每次#后面的内容变化,都会算作一次PV。
关于hashchange的更多细节,能够到一些低调的浏览器事件查看,或者到[hashchange](
https://developer.mozilla.org...。vue
main.jsnode
import arms from '@/arms'; Vue.config.errorHandler = (err, vm, info) => { arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`}); };
Vue.config是一个对象,包含vue的一些全局配置,能够在启动应用以前修改属性。
它包含slient
,optionMergeStrategies
,devtools
,errorHandler
,warnHandler
,ignoreElements
,keyCodes
,performance
,productionTip
等配置项。git
此次主要的任务是学习Vue.config.errorHandler,附带着把Vue.config.productionTip = false也了解下。github
在组件渲染函数或者watchers期间,分配一个处理器给uncaught error。vue-router
Vue.config.errorHandler = function (err, vm, info) { // err 错误信息 // vm Vue实例 // info Vue-specific error信息 }
关键词:捕获错误 捕获uncaught error 前端错误追踪 避免前端页面崩溃express
vm.$on('eventName', handler)
。Vue.config.errorHandler源码:npm
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源码:segmentfault
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 err } }
arms.error(err, { filename: `${vm.$vnode.tag}, ${info}`});
?https://www.npmjs.com/package... 给出了错误信息上报接口的文档。__bl.error(error, pos)
error为JS的Error对象,filename是pos的一个key,filename后面的模板字符串是为了惟必定位错误信息文件。浏览器
http://foo.com/#/friend 的vm.$vnode.tag为vue-component-136-record。
http://foo.com/#/autoreply 的vm.$node.tag为vue-component-138-autoreply。
源码在vnode.js。
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
。
期待和你们交流,共同进步,欢迎你们加入我建立的与前端开发密切相关的技术讨论小组:
- SegmentFault技术圈:ES新规范语法糖
- SegmentFault专栏:趁你还年轻,作个优秀的前端工程师
- 知乎专栏:趁你还年轻,作个优秀的前端工程师
- Github博客: 趁你还年轻233的我的博客
- 前端开发QQ群:660634678
- 微信公众号: 人兽鬼 / excellent_developers
努力成为优秀前端工程师!