1.0.3 • Published 2 years ago

vue-event-tracking v1.0.3

Weekly downloads
-
License
MIT
Repository
-
Last release
2 years ago

vue-event-tracking (Vue 路由和事件埋点方案)

兼容 Vue2 Vue3 (暂不支持 IE10 及以下版本)

安装依赖

$ cd <project-name>
$ yarn add vue-event-tracking -S

Vue.use 参数解析

// VueEventTracking 插件
// router 路由 [new VueRouter()]
// parmas 插件参数 [Function | Object]
// fetch Axios 或 用户自定义封装的请求方法 [Function]
// config Axios 的请求配置项也可带入默认接口参数 [Object]
Vue.use(VueEventTracking, {router, parmas, fetch, config});

初始化

  1. vue2
    // main.js
    import Vue from 'vue';
    import App from './App.vue';
    import VueEventTracking from 'vue-event-tracking';
    import router from './router';
    import axios from 'axios';

    const parmas = {
      isIndep: true, // 自定义默认参数
      version: 'vue2', // 自定义默认参数
      _enterPageTimeName: 'enterPageTimeName', // 进入页面的时间埋点入参
      _codeName: 'event' // 埋点code字段名 => meta: {title: '首页', event: '000-100-000'},
    };

    const config = {
      method: 'get',
      url: 'https://jsonplaceholder.typicode.com' + '/photos/1'
      params: {
        vue: 2 // 自定义默认参数
      },
      headers: {'X-Requested-With': 'XMLHttpRequest'}
    };

    Vue.use(VueEventTracking, {router, parmas, fetch: axios, config});
   });
  1. vue3
    // main.js
    import {createApp} from 'vue';
    import App from './App.vue';
    import VueEventTracking from 'vue-event-tracking';
    import router from './router';
    import fetch from '@/utils/http'; // 基于 axios 封装

    const parmas = {
      isIndep: true, // 自定义默认参数
      version: 'vue3', // 自定义默认参数
      _enterPageTimeName: 'enterPageTimeName', // 进入页面的时间戳名字埋点入参
      _leavePageTimeName: 'leavePageTimeName', // 离开页面的时间戳名字埋点入参
      _codeName: 'event' // 埋点code字段名 => meta: {title: '首页', event: '000-100-000'},
    };
    const parmas = () => {
      return {
        isIndep: true, // 自定义默认参数
        version: 'vue3', // 自定义默认参数
        _log: true, // 是否打印日志提示 默认 false 不打印
        _codeName: 'event_v3' // 埋点字段 => meta: {title: '首页', dotName: '000-100-000'},
        _codeNameRouteAlias: 'dotName', // 对应 dotName: '000-100-000'
        _enterPageTimeName: 'enter-page-time-name', // 进入页面的时间戳名字埋点入参
        _leavePageTimeName: 'leave-page-time-name', // 离开页面的时间戳名字埋点入参
        _statTimeName: 'stat-time', // 统计触发的时间戳名字埋点入参
      };
    };

    const config = {
      method: 'get',
      url: '/photos/2',
      params: {
        vue: 3 // 自定义默认参数
      }
    };

    const app = createApp(App);
    app.use(router);
    app.use(VueEventTracking, {router, parmas, fetch, config});
    app.mount('#app');

使用

  1. 点击元素 - 指令
    /**
     * @description 点击按钮埋点 v-dot | v-dotSync 通过上面 配置项 parmas 配置
     * @param {Object} [propName] N个
     * @param {Function} _directiveCbName 指令回调方法名 [cb]
     * @param {Array} _directiveCbArgsName 指令回调方法入参名 [args]
     * @param {Number} _directiveTimeName 指令休眠时间名-防暴点 [time] 毫秒
     *
     * v-dot="{code: '0000', 'cb': toSubmit }"
     * v-dotSync="{name1: 'a', name2: ['b'], 'cb': toSubmit, args: [1,{a:1}], 'time': 2000 }"
     */
    <button v-dot="{test: '0-70', cb: cbMsg, args: ['1', 'async']}">指令Async</button>
    <button v-dotSync="{test: '0-00', cb: cbMsg, args: ['2', {name: 'sync'}]}">指令Sync</button>
  1. 方法调用
    /**
     * @description 调用方法埋点[异步]
     * @param {Object} propsName 方法参数
     * @returns {Function} cb, ...args | (方法名, ...入参)
     *
     * 异步Vue2 ==> this.$dot({code: '1111'})
     * 同步Vue2 ==> this.$dotSync({code: '9999'})(toSubmit, 1, 2, 3)
     * 异步 ==> $dot({code: '1111'})(toSubmit, 1, [1])
     * 同步 ==> $dotSync({code: '9999'})(toSubmit, 1, [1])
     */

    // Vue2 挂载 this 直接用
    sendMsg() {
      // 1.异步埋点调用 cbFunc
      this.$dot({name: 'onsong'})
      this.cbFunc(1);
      // 也可用下面方法
      this.$dot({name: 'onsong'})(this.cbFunc, 1);

      // 2.同步埋点后直接 执行 cbFunc 方法 参数 为 '1', 2
      this.$dotSync({name: 'onsong'})(this.cbFunc, '1', 2);
    },
    cbFunc = (...res) => {
      console.log('cb', ...res);
    };

    // Vue3
    import {getCurrentInstance} from 'vue';
    import Event from 'vue-event-tracking';
    setup() {
      const instance = getCurrentInstance();
      const ctx = instance.appContext.config.globalProperties;

      // ①
      const addDot1 = () => {
        ctx.$dot({test: '100-200'})(sendMsg, '异步');
      };
      // ②
      const addDot2 = () => {
        Event.$dotSync({test: '2000-000', isIndep: true})(sendMsg, '同步', '参数2');
      };
      sendMsg = (...res) => {
        console.log('cb', ...res);
      };
      return {
        sendMsg,
        addDot1,
        addDot2,
      };
    }

配置项

1.parmas

{
  _addMeta: false, // 将路由上的 meta 内所有信息上报埋点 默认不上报

  _log: false, // 埋点信息-默认不打印
  _codeName: 'event', // 路由埋点 上报接口的参数名 | meta: {title: '首页', event: '000-100-000'}
  _codeNameRouteAlias: '', // router meta 中 _codeName 对应的别名 | 对应上面的 "meta.event" 但埋点属性名依旧是上面 _codeName 指定的名字 "event"

  // 时间戳配置
  _statTimeName: 'statTime', // 统计触发的时间戳名字 埋点入参 为空则不入
  _enterPageTimeName: 'enterTime', // 进入页面的时间戳名字 埋点入参 为空则不入
  _leavePageTimeName: 'leaveTime', // 离开页面的时间戳名字 埋点入参 为空则不入

  // 指令配置名
  _directiveTimeName: 'time', // 指令休眠时间名
  _directiveCbName: 'cb', // 指令回调方法名
  _directiveCbArgsName: 'args', // 指令回调方法入参名

  // 埋点方法名字 | 埋点指令名字
  _dotFunctionName: '$dot', // this.$dot()
  _dotFunctionSyncName: '$dotSync', // this.$dotSync()
  _dotDirectiveName: 'dot', // v-dot="{}"
  _dotDirectiveSyncName: 'dotSync' // v-dotSync="{}"
};

2.config Axios 默认配置项 可传入 axios 或自封装的 fetch 请求与之对应

{
  // `url` 是用于请求的服务器 URL
  url: '/user',

  // `method` 是创建请求时使用的方法
  method: 'get', // 默认是 get

  // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
  // 它可以通过设置一个 `baseURL` 便于为 axios 实例的方法传递相对 URL
  baseURL: 'https://some-domain.com/api/',

  // `transformRequest` 允许在向服务器发送前,修改请求数据
  // 只能用在 'PUT', 'POST' 和 'PATCH' 这几个请求方法
  // 后面数组中的函数必须返回一个字符串,或 ArrayBuffer,或 Stream
  transformRequest: [function (data) {
    // 对 data 进行任意转换处理
    return data;
  }],

  // `transformResponse` 在传递给 then/catch 前,允许修改响应数据
  transformResponse: [function (data) {
    // 对 data 进行任意转换处理
    return data;
  }],

  // `headers` 是即将被发送的自定义请求头
  headers: {'X-Requested-With': 'XMLHttpRequest'},

  // `params` 是即将与请求一起发送的 URL 参数
  // 必须是一个无格式对象(plain object)或 URLSearchParams 对象
  params: {
    ID: 12345
  },

  // `paramsSerializer` 是一个负责 `params` 序列化的函数
  // (e.g. https://www.npmjs.com/package/qs, http://api.jquery.com/jquery.param/)
  paramsSerializer: function(params) {
    return Qs.stringify(params, {arrayFormat: 'brackets'})
  },

  // `data` 是作为请求主体被发送的数据
  // 只适用于这些请求方法 'PUT', 'POST', 和 'PATCH'
  // 在没有设置 `transformRequest` 时,必须是以下类型之一:
  // - string, plain object, ArrayBuffer, ArrayBufferView, URLSearchParams
  // - 浏览器专属:FormData, File, Blob
  // - Node 专属: Stream
  data: {
    firstName: 'Fred'
  },

  // `timeout` 指定请求超时的毫秒数(0 表示无超时时间)
  // 如果请求话费了超过 `timeout` 的时间,请求将被中断
  timeout: 1000,

  // `withCredentials` 表示跨域请求时是否需要使用凭证
  withCredentials: false, // 默认的

  // `adapter` 允许自定义处理请求,以使测试更轻松
  // 返回一个 promise 并应用一个有效的响应 (查阅 [response docs](#response-api)).
  adapter: function (config) {
    /* ... */
  },

  // `auth` 表示应该使用 HTTP 基础验证,并提供凭据
  // 这将设置一个 `Authorization` 头,覆写掉现有的任意使用 `headers` 设置的自定义 `Authorization`头
  auth: {
    username: 'janedoe',
    password: 's00pers3cret'
  },

  // `responseType` 表示服务器响应的数据类型,可以是 'arraybuffer', 'blob', 'document', 'json', 'text', 'stream'
  responseType: 'json', // 默认的

  // `xsrfCookieName` 是用作 xsrf token 的值的cookie的名称
  xsrfCookieName: 'XSRF-TOKEN', // default

  // `xsrfHeaderName` 是承载 xsrf token 的值的 HTTP 头的名称
  xsrfHeaderName: 'X-XSRF-TOKEN', // 默认的

  // `onUploadProgress` 允许为上传处理进度事件
  onUploadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `onDownloadProgress` 允许为下载处理进度事件
  onDownloadProgress: function (progressEvent) {
    // 对原生进度事件的处理
  },

  // `maxContentLength` 定义允许的响应内容的最大尺寸
  maxContentLength: 2000,

  // `validateStatus` 定义对于给定的HTTP 响应状态码是 resolve 或 reject  promise 。如果 `validateStatus` 返回 `true` (或者设置为 `null` 或 `undefined`),promise 将被 resolve; 否则,promise 将被 rejecte
  validateStatus: function (status) {
    return status >= 200 && status < 300; // 默认的
  },

  // `maxRedirects` 定义在 node.js 中 follow 的最大重定向数目
  // 如果设置为0,将不会 follow 任何重定向
  maxRedirects: 5, // 默认的

  // `httpAgent` 和 `httpsAgent` 分别在 node.js 中用于定义在执行 http 和 https 时使用的自定义代理。允许像这样配置选项:
  // `keepAlive` 默认没有启用
  httpAgent: new http.Agent({ keepAlive: true }),
  httpsAgent: new https.Agent({ keepAlive: true }),

  // 'proxy' 定义代理服务器的主机名称和端口
  // `auth` 表示 HTTP 基础验证应当用于连接代理,并提供凭据
  // 这将会设置一个 `Proxy-Authorization` 头,覆写掉已有的通过使用 `header` 设置的自定义 `Proxy-Authorization` 头。
  proxy: {
    host: '127.0.0.1',
    port: 9000,
    auth: : {
      username: 'mikeymike',
      password: 'rapunz3l'
    }
  },

  // `cancelToken` 指定用于取消请求的 cancel token
  // (查看后面的 Cancellation 这节了解更多)
  cancelToken: new CancelToken(function (cancel) {
  })
};

版本信息

1.0.3

  1. 更新 README.md 文件

1.0.1

  1. vue3 方法埋点 增加 getCurrentInstance 访问实例。

1.0.0

  1. vue2、vue3 页面埋点 + 方法埋点 + 指令埋点