xmon-bury

如果你的项目埋点会严重影响到业务代码,是时候考虑使用 @xmon/bury 了
除了必要的添加 eventId,即为项目添加 ID 标识的行为以外,@xmon/bury 不会影响到你的业务代码,你只需要添加配置就够了!
页面行为埋点,通过事件监听来进行行为监测,目前可以监控事件包括
-
点击事件(Click)
-
页面加载(Load & Unload)
-
特定行为(Action)
-
Axios 请求(Api)
-
路由跳转(Router)
安装
yarn add @xmon/bury
npm install @xmon/bury
pnpm install @xmon/bury
Examples
监听一般事件(开启监听点击、页面加载,特定行为)
import { init } from "@xmon/bury";
import config from "./config.js";
const bury = init(config);
配置
你需要在 config 中指定你要监听的路由,路由对应事件(进入和离开)的 eventId。
同时你需要指定埋点的基础参数,他们通常是环境,埋点版本以及系统版本,这些参数都是可选的。
import { initUrlMap } from "@xmon/bury";
initUrlMap([
{
path: "/user/:id",
leave: "eventIdLeavePage",
enter: "eventIdEnterPage",
},
]);
const config = {
environment: process.env.NODE_ENV,
version: "1.0.0",
};
export default config;
监听 Router
如果你使用的是 Vue 单页面应用,则还需要监听 Vue-Router 跳转,因此你还需要传入 router 实例作为第 2 个参数
import router from "@/router";
const bury = init(config, router);
监听 Api
如果你需要监听 Axios Api ,则需要封装 Axios 实例。
import axios from "axios";
import { trackApi } from "@xmon/bury";
const axiosInstance = axios.create({
...
});
trackApi(axiosInstance);
配置
和页面监听类似,你也需要指定你要监听的 api 路径以及对应的 eventId。
import { initUrlMap, initApiMap } from "@xmon/bury";
initUrlMap([
...
]);
initApiMap([
{
url: "/v3/search/anime",
eventId: "eventIdApi",
},
]);
const config = {
...
};
export default config;
值得注意的是,无论是监听页面加载还是监听 api,都会忽略 query 参数。
监听点击事件
<img :src="item.image_url" data-bupoint="eventId" />
对于需要监听点击事件的元素,添加 data-bupoint 属性,并注入 eventId 即可。
监听特定行为
import { track } from "@xmon/bury";
const increase = track(() => {
console.log("I am tracked");
}, "eventId");
对于行为,你应当使用 track 进行封装,第一个参数是要封装的函数,第二个参数是 eventId 。
track 会在封装后返回被封装的函数。
埋点行为发生在特定行为执行之前。
立即触发
当调用 tracked 方法时,会立即触发 Action 类型埋点回调。
import { tracked } from "@xmon/bury";
...
tracked("eventId");
...
触发埋点事件回调
触发监听行为会同时触发埋点行为,通过 onBury 我们可以获取到埋点行为的回调。
初始化(init)之后才能访问到 instance、track、trackApi、onBury 等方法,否则会抛出未定义错误
import { onBury } from "@xmon/bury";
onBury((value) => {
const buryInfo = value.payload;
const queries = Object.entries(buryInfo)
.map(([key, value]) => {
return key + "=" + encodeURI(value);
})
.join("&");
let img = new Image(1, 1);
img.src = `http://exmapleApi.com/bury?` + queries;
setTimeout(() => {
if (img && (!img.complete || !img.naturalWidth)) {
img.src = "";
}
}, 3000);
});
每当被监听的事件发生的时候,都会注册在 onBury 事件中的回调函数。
在这个例子中,它将会取出回调参数中的 payload ,并将它封装并发出 img 的 Get 请求。
由于 onBeforeUnload 方法在页面即将关闭时执行,此时无法使用 Axios 来发起异步请求。但 img 和 XMLHttpRequest 同步请求仍然可以执行。
API
init
export const init = (config: BuryConfig, router?: VueRouter) => Bury;
export interface BuryConfig {
eventId?: string;
timestamp?: string;
ua?: string;
browser?: "MSIE" | "Firefox" | "Safari" | "Chrome" | "Opera";
referrer?: string;
width?: string;
height?: string;
ip?: string;
cityName?: string;
isPhone?: "phone" | "pc";
userId?: string;
pageUrl?: string;
pageStayTime?: string;
apiUrl?: string;
}
BuryConfig 中通过 "@fingerprintjs/fingerprintjs" 模块 以及 "http://pv.sohu.com/cityjson?ie=utf-8" Api 接口获取了一些预设值,它们分别是
例如说,你可以传入 project、version 和 environment。
const bury = init({
project: "projectName",
version: "v1",
environment: process.env.NODE_ENV,
});
const bury = init(config, router);
config 预定义参数
router 可选参数,如果要监听 VueRouter 跳转的话
Bury.spy
开启监听模式(生产模式下请不要打开),可以在 devtools 的控制台中查看每次触发埋点事件的返回值
bury.spy();
initUrlMap
初始化监听的 url 的页面路径及其 eventId 的数组。
所有的 eventId 都会被包含在回调函数参数中的 payload 中
interface UrlMap: {
path: string;
enter?: string;
leave?: string;
}[]
关于 path https://github.com/pillarjs/path-to-regexp/tree/v1.7.0
initApiMap
interface ApiMap: {
url: string;
method?: Method;
eventId: string;
}[] = [];
url 接口的 url 地址
method 可选参数 Method ,例如 GET POST ,如果未定义,则监听该 url 下的所有 Method
eventId 该埋点接口的 eventId
track
对事件进行埋点监听
function track<T extends () => any>(fn: T, eventId: string): T;
fn 被埋点的方法
eventId 该埋点方法的 eventId
为传入的方法埋点,并返回埋完点的方法。
tracked
立即触发 Action 埋点事件
function tracked(eventId: string): void;
trackApi
对 Axios 进行埋点监听
function trackApi(axiosInstance: AxiosInstance): void;
onBury
当被埋点的时间触发时的回调函数
function onBury(callback: (value: BuryCallBackPayload) => void): void;
BuryCallBackPayload
interface BuryCallBackPayload {
type: "Action" | "Click" | "Leave" | "Enter" | "Api";
payload: BuryConfig;
extra?:
| Payload.ActionPayload
| Payload.ApiPayload
| Payload.ClickPayload
| Payload.LoadPayload
| Payload.RoutePayload;
}
help
如何在 Nuxt2 项目中使用
plugins
在 plugins 文件夹中创建文件 bury.js 或 bury.ts ;
import { init, initUrlMap } from '@xmon/bury';
const bury = init({
version: 'projectVersion',
dataPointVersion: 'v1',
project: 'projectName'
});
initUrlMap([{
path: "/",
enter: "EnterEventPoint",
leave: "LeaveEventPoint"
}, ...])
bury.spy();
bury.onBury((value) => {
})
在 nuxt.config.js 或 nuxt.config.ts 中添加插件配置
{
plugins: [
...
{ src: "@/plugins/bury.ts", mode: 'client' },
...
],
}
TODO
🚀 已完成
添加 tracked 语法糖,当运行tracked()时,就会触发埋点事件,而不需要单独封装行为 | 🚀 |
| 添加配置可选择关闭全局点击事件监听 | 📝 |
| 添加配置可根据页面开启全局点击事件监听 | 📝 |
| 如果未检测到需要监听的页面路由,则不开启路由监听 | 📝 |
| 可开启监听页面 Web 指标,详情请参考 web-vitals | 📝 |
| 可开启监听页面 Error 事件 | 📝 |
| 可以配置项中的部分默认内容,以加速埋点实例的创建(例如 ip + cityName, userId) | 📝 |