vue-event-tracking
v1.0.3
Published
vue-event-tracking (Vue2 | Vue3 路由和事件的埋点方案)
Downloads
3
Maintainers
Readme
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});
初始化
- 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});
});
- 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');
使用
- 点击元素 - 指令
/**
* @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>
- 方法调用
/**
* @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
- 更新 README.md 文件
1.0.1
- vue3 方法埋点 增加 getCurrentInstance 访问实例。
1.0.0
- vue2、vue3 页面埋点 + 方法埋点 + 指令埋点