vue-trackjs 是一个基于vue自定义指令开发的声明式自动埋点方案,压缩后只有2.5K,对业务代码没有侵入影响。使用localStorage对统计数据进行缓存,默认每60s轮询上报一次数据。入手毫无难度,插件也预留了自定义扩展API,给你充分的发挥空间。

前言

埋点技术,即在正常的功能逻辑中添加统计逻辑,进行数据收集,后续经过各种自定义的数据整理,为对应的产品提供数据分析,实现数据可视化。

常见的前端埋点技术有:代码埋点、可视化埋点、无埋点。

代码埋点:手动在需要埋点的节点调用接口发送数据。
优点:发送数据时间可控,可自定义属性,自定义事件。
缺点:时间、人力成本大。

可视化埋点:利用可视化交互手段,通过可视化界面配置控件操作与事件操作发生关系。
优点:成本低,速度快
缺点:行为记录信息少,支持的分析方式少

无埋点:前端自动采集全部事件并上报埋点数据。
优点:无需埋点,方便快捷
缺点:行为记录信息少,传输压力大

vue-trackjs推荐用法

插件安装

// npm
npm i --save vue-trackjs
// yarn
yarn add vue-trackjs

插件引入

import TrackDirective from 'vue-trackjs'
import { options } from './track.config.js'

// vue 3
createApp(App).use(TrackDirective, options)
// vue 2
Vue.use(TrackDirective, options)

新建track.config.js

import { setTrackBaseInfo, throttle } from 'vue-trackjs'

// 你的自定义通用埋点信息, vue-trackjs集成的通用信息下面会有介绍
const trackBaseInfo = {
  ip: '127.23.112.3',
  version: '1.0.0',
  deviceId: 'vue-track',
  language: 'us',
  network: '3G',
}

// 存储到localstorage
setTrackBaseInfo(trackBaseInfo)

// 下面三个函数建议都是返回Promise
// 获取你的每个埋点配置信息函数,规范的埋点统计都是支持系统配置,从接口取埋点配置,例如:
function getTrackConfig() {
  // 该函数必须return如下结构,eventId和action字段固定不可更改,其他随意
  return {
    // 该key对应后续自定义指令里面的id
    "moduleName_xxx_show": {
      "eventId": "moduleName_xxx_show",
      "resourceModule": "",
      "action": "show"
    },
    "moduleName_xxx_click": {
      "eventId": "moduleName_xxx_click",
      "resourceModule": "12323",
      "action": "click"
    }
  }
}

// 获取埋点信息上传id函数,埋点批次上传前获取上传权限,根据业务需要,可不配置
export function getUploadId() {
  // vue-trackjs只接收下面两个字段
  return { liftTime, uploadKey }
}

// 轮询上传埋点信息回调函数, 会有3个入参  埋点信息数组  通用信息  getUploadId函数返回的uploadKey(可选)
export function uploadTracks(trackList, baseInfo, uploadKey) {
  return Promise<any>
}

export const options = {
  appId: 'projectName',
  getTrackConfig,
  getUploadId,
  uploadTracks
}

指令用法,自带的埋点类型有4种:

// click 点击事件
<div v-track="{ id: 'moduleName_xxx_click', eventResource: '{xxid: 12}' }">...</div>

// scoll_up 用户浏览滚动深度
<div v-track="{ id: 'moduleName_xxx_scoll_up' }">...</div>

// 为了数据准确性,下面两个注意不能绑定在v-if的元素上
// stay 用户停留时长
<div v-track="{ id: 'moduleName_xxx_stay' }">...</div>

// show 页面加载时间 
<div v-track="{ id: 'moduleName_xxx_show'  }" :data-track="getLoadingTime">...</div>

computed: {
    getLoadingTime() {
        // 注意自定义data属性里面只接收字符串,所以eventResource也建议为字符串
        return JSON.stringify({ loadingTime: xxx })
    }
}

注:因为vue自定义bind.value不是响应式的,如果你的eventResource是需要响应式时,需要像上面的show一样新增一个data-track,用来替换eventResource

自定义埋点事件

但集成的埋点类型不够满足你时,在options新增配置customActionFn,任你造。

function getTrackConfig() {
  return {
    "moduleName_xxx_mouseenter": {
      "eventId": "moduleName_xxx_mouseenter",
      "action": "mouseenter"
    },
  }
}

const options = {
  // ...
  getTrackConfig,
  customActionFn: {
    // key对应自定义事件里面的action
    // 入参会返回3个参数, callback函数必须调用传入trackInfo才会成功
    mouseenter: (trackInfo, callback, el) => {
      const fn = () => {
        trackInfo.haha = "guapi"
        callback(trackInfo)
      }
      el.addEventListener('mouseenter', throttle(fn, 300))
    }
  }
}

手动埋点

当你足够懒不想做过多配置或者以上不能满足你的需求时,可以尝试手动埋点

import { manualBurying } from 'vue-trackjs'

function clickHandler() {
  // manualBurying接收两个入参  埋点信息  另一个localstorage的key(可选,默认appId)
  const trackInfo = { //... }
  manualBurying(trackInfo)
}

最后说一下项目的缺点,首先就是需要手动声明和配置,其次呢就是基于localStorage,是容易被删除的,最后是由于60s轮询上报带来的问题,就是用户在下一上报周期前关闭tab或浏览器,该周期内的埋点是无法被上报的,只能等待再次打开应用,为此也增加了一个配置项options.immediate,设置为true时用户再次打开应用会直接上传上一周期的数据。

附上项目源码地址:https://github.com/hansonGong/vue-trackjs,如果有帮助到你就留个star,谢谢!!!

Logo

前往低代码交流专区

更多推荐