vue.js 中的埋点方案

272 阅读2分钟

1. 集成方式

  • 在plugin中统一操作,可复用性强
  • 添加到全局实例上,使用 this.$tracker方式可快速调用
  • 提供依赖注入,使用 useTracker 这种组合式方式可快速调用
  • 添加全局指令
  • 扩展埋点库自定义方法

2. 异常处理

2.1 js 异常处理

window 监听 error 事件,捕获异常

2.2 被 vue 捕获的异常处理

vue 提供了 app.config.errorHandler方法,所有 vue 捕获的异常通过此方法可捕获到。

2.3 网络请求异常

axios 为例,可在拦截器中进行捕获。

2.3.1 非 200 的请求异常

这时候是接口调不通,或超时或取消等异常,在拦截器的异常捕获方法里进行埋点

(error: any) => {
    tracker.track('http_error', { ...error })
}

2.3.2 接口请求成功,但业务逻辑返回非正常状态

在拦截器响应回调 response 里判断返回标识是否是成功,捕获不成功的异常。

如成功的状态为 code 字段为 U000000, 则,

(response) => {
    if (response.data.code !== 'U000000') {
        tracker.track('http_error', { ...response.data })
    }
}

3 记录用户交互操作

自定义 vue 全局指令 v-track.

给需要记录操作的元素加上自定义指令,添加相应的事件监听方法,当事件触发时,自动收集信息进行埋点。

  • tracker.ts
const trackFunc = (listenType:string = 'click', callback: Function, tracker:any) => {
  return (event?: Event) => {
    const options = callback && callback()
    tracker.track(listenType, { properties: { ...options } })
  }
}

app.directive('track', {
  created: (el, binding) => {
    const listenType = binding.arg
    const callback = binding.value

    if (typeof callback !== 'function' && import.meta.env.DEV) {
      console.warn('[Tracker] v-track callback must be a function, current callback is:', callback)
    }

    el.addEventListener(listenType, trackFunc(listenType, callback, tracker))
  },
  unmounted(el, binding, vnode) {
    el.removeEventListener('click', trackFunc)
  }
})

  • App.vue
<template>
    <input v-model="userName" v-track:change="() => ({operation: '输入用户名', userName: userName })})"
    <button @click="login" v-track:click="() => ({ operation: '登录', userName: userName })">登录</button>
</template>

<script lang="ts" setup>
import { ref, Ref } from 'vue'
const userName: Ref<string> = ref('')

const login = () => {}
</script>

4 其他系统日志

  • 系统定义统一的日志方法,统一收集起来埋点

如定义一个 Log 库,替代 console.log 或者

重写 console.log 方法,收集使用 congsole.log 的日志信息。

js重写console.log函数_js 重写console.log-CSDN博客