为何要在标题里加上一个业务数据的上报呢,由于在我们前端项目中,可上报的数据维度太多,好比还有性能数据、页面错误数据、console捕获等。这里咱们只讲解业务数据的埋点。javascript
业务数据的上报主要分为:html
通用和必须上报的数据,均在上报的代码中进行固定,好比设备信息、用户信息、cookie等都须要上报的数据,在上报前处理完成,须要异步获取且数据固定的,作好存储,防止每次都要从新获取;其余额外的数据,经过对外暴露的send
方法进行传递。前端
好比获取信息这块,客户端给到的jsapi,有可能只能异步调用,那么咱们就能够这么处理:vue
function getAppInfo() { let appInfo = {}; return ()=> { if (appInfo.deviceId) { return Promise.resolve(appInfo); } else { return new Promise((resolve, reject) => { ABB.getAppInfo(info => { if (info.deviceId) { appInfo = info; resolve(appInfo); } else { reject(new Error('get AppInfo error')); } }) }) } } } const AppInfo = getAppInfo(); console.log( AppInfo() );
各个路由的PV上报能够经过vue router的afterEach来实现,每次路由刷新时,afterEach方法都会执行,那么咱们在这里进行PV的上报:java
// 每一个hash路由的PV上报 router.afterEach((to)=>{ // to为当前已打开的页面,to.name为在router/index.ts中设定的name dataBoss.sendPV(to.name); })
用户点击行为的上报,以前是在每一个点击的业务代码最后,进行一次点击上报。不过这样一个很差的地方是,必须为每一个须要上报的点击元素添加一段业务代码,同时,若是多个点击行为共享某个业务片断时,须要进行点击区分:json
methods: { myClick(value, prarams, act) { // ... 业务逻辑的处理 // 数据的上报 wzp.send({ act: act, pageSource: 'MainPage' }) } }
如今,咱们利用Vue中的自定义指令来实现点击行为的上报,上报的处理与业务代码进行分割:api
// 自定义指令的官方文档: https://cn.vuejs.org/v2/guide/custom-directive.html // 自定义boss指令 // bind: 只对该元素绑定一次 // el: 触发时的DOM元素 // binding.value: 传入的值 // 使用 v-boss="{page: 'MainPage', sop: 'donate'}" Vue.directive('boss', { // bind: function (el: HTMLElement, binding: any) { el.addEventListener('click', ()=>{ // 绑定click事件,触发后进行数据上报 Vue.prototype.$dataBoss.send(binding.value) }) } })
自定义v-boss指令后,咱们就能够在元素上使用这个指令后:cookie
<!-- 为用户头像添加点击数据上报 --> <div class="avatar" v-boss="{pageName: 'MainPage', sop: 'sop_own_click'}" @click="linkTo"> <img :src="user.avatar" :alt="user.nickname"> </div>
这里的数据上报是用户点击行为以后的结果上报,好比用户点击了分享按钮,那么最终他是真的分享成功了,仍是中途又取消了。这种数据的上报,能够分析出用户从意图操做到最终实现的一个流失状况。app
操做结果的数据上报,依赖于客户端或者接口给反馈的结果,这就须要在业务代码中实现了,定义一个全局变量$dataBoss
,经过这个来上报数据:异步
好比分享是否成功的监控:
// 发起分享 handleShare() { share.show(); share.on('shareResult', res => { this.$dataBoss.send({ sop: 'share_success' }); }) }
根据接口中的数据进行上报:
handleUser() { jsonp(url).then(result => { this.$dataBoss.send({ kv: { money: 20 } }); }) }
前端数据上报的维度不少,都是为了方便咱们更加的了解用户、了解产品,方便之后的功能迭代。