前端埋点

yuhuo2024-04-09开发知识
参考链接

概述

埋点又称事件追踪(Event Tracking),用于采集页面的相关数据进行上报,以便后续统计查看。

相关的第三方产品:

埋点分类

PV 埋点

PV(page view) 是页面浏览量,UV(Unique visitor) 是用户访问量。PV 只要访问一次页面就算一次,UV 同一天内多次访问只算一次。

对于前端来说,只要每次进入页面上报一次 PV 就行,UV 则根据 PV 和用户 ID 进行计算。

上报信息参考:

// 根据 pathname 统计某个页面 PV
// 根据 pathname + suid 统计某个页面 UV
let data = {
    project: "xx", // 项目名称
    suid: suid, // 用户标志
    // 访问信息
    url: encodeURIComponent(location.href), // 页面链接
    pathname: encodeURIComponent(location.pathname), // 页面路径
    referrer: encodeURIComponent(document.referrer), // 来源
    channel: query.channel || "", // 渠道
    ts: Date.now(), // 时间
    // 客户端信息
    screen: window.screen.width + "x" + window.screen.height, // 屏幕尺寸
    ua: navigator.userAgent, // 浏览器信息
};

行为埋点

统计用户的某些行为,比如页面停留时长、点击XX按钮、打开XX弹窗等,主要用于运营的效果反馈。

上报信息参考:

// 根据 actId 统计某个行为
let data = {
    project: "qf-pc", // 项目名称
    suid: suid, // 用户标志
    pathname: location.pathname, // 页面路径
    ts: Date.now(), // 时间
    actId, // 行为编号
    attach, // 附加说明
};

日志埋点

用于收集某些关键节点,易错节点,或异常情况的上下文信息,主要用于开发的异常排查。

如果单纯靠异常监控系统,只能收集到报错信息,没有相关的上下文信息(比如接口请求失败时,接口的请求参数和返回值)。

上报信息参考:

// 根据 logType 查询某个类型的日志
let data = {
    project: "qf-pc", // 项目名称
    logType, // 日志类型
    content, // 日志内容
    suid: suid, // 用户标志
    url: location.href, // 页面链接
    ts: Date.now(), // 时间
    ua: navigator.userAgent, // 浏览器信息
};

上报方式

Ajax

可能会存在跨域问题。

Img

img 标签不存在跨域,兼容性好,并且不需要挂载到 DOM 上即可发起请求(其他的跨域标签如 script、link 还需要挂载)。

将上报信息作为 url 参数发起 get 请求,一般返回 1px 的 gif 图(只需要几十个字节)。

let data = {};
// 转url字符串
let params = "";
for (let key in data) {
    params += "&" + key + "=" + data[key];
}
// 发送请求
let img = new Image();
img.src = "//yh.com:3000/stat/pv.gif?" + params.substring(1);

sendBeacon

sendBeacon 方法是一种更规范的上报方式,可能在某些旧版本浏览器不兼容。

Ajax 在页面卸载时异步上报,可能没上报完,页面就卸载了导致请求中断,因此 Ajax 处理这种情况时必须作为同步操作,以此来迫使浏览器延迟卸载文档。

sendBeacon 方法不受同域限制,而且是异步的,作为浏览器的任务,与页面脱离关联,因此可以保证会把数据发出去,不影响页面卸载。

let data = {};
navigator.sendBeacon("//yh.com:3000/stat/log", JSON.stringify(data));
Last Updated 2024/5/11 17:27:33