序言
项目里是不是需要埋点?
埋点的时机有哪些呢?
你是不是很好的拿捏了呢?
正确时机上报埋点除了保证数据准确性,还可以帮你做什么?
上报时机
一、用户行为触发时
这个类型我的定义是:也就是用户主观上的动作,比如最常见的点击
<button id="reportButton">点击我进行上报</button>
reportButton() => {
console.log('上报点击操作')
}
二、页面加载时
这个类型的话,主要就是上报一些界面加载时的信息,比如界面加载完成上报
load事件会在以下情况触发:
- 当浏览器完成页面的 DOM(文档对象模型)的解析和构建。
- 当所有页面资源(包括图片、样式表、脚本等)都已经加载完成。
window.performance是一个包含了各种性能相关信息的接口,它提供了对浏览器性能的监控和度量。通过 window.performance.timing 属性,我们可以获取到页面加载过程中各个关键事件的时间戳,这些事件包括:
navigationStart:浏览器开始导航到页面的时间戳。domContentLoadedEventEnd:DOMContentLoaded 事件结束的时间点,表示 DOM 构建完毕。loadEventEnd:load 事件结束的时间戳,表示页面加载完成。
通过对这些时间点的比较,我们可以计算出页面加载所花费的时间,从而评估页面性能。
// 当页面加载完成后执行的函数
window.addEventListener('load', function() {
// 计算页面加载完成时间
const loadTime = window.performance.timing.domContentLoadedEventEnd - window.performance.timing.navigationStart;
// 打印页面加载完成时间
console.log('页面加载完成时间:', loadTime, '毫秒');
});
三、页面交互时
这一类型的话呢,就是滚动页面、停留时间这种用户页面交互时场景,举例一个列表内容单个曝光
需要列表单个元素出现在屏幕的高度>=自身高度50%时候,进行元素内容曝光
这里推荐选用由浏览器直接支持的IntersectionObserver,仅性能更好,而且提供了更为精准和灵活的配置选项。scroll事件性能不是很好,但是可以兼容低版本浏览器。这一点要支持也可以用polyfill库替代IntersectionObserver,react可用react-intersection-observer,vue可用vue-intersect
// 创建一个 IntersectionObserver 实例
const observer = new IntersectionObserver(entries => {
entries.forEach(entry => {
// 当目标元素进入视口时
if (entry.isIntersecting && entry.intersectionRatio >= 0.5) {
// 触发曝光上报事件,可以根据具体需求调用接口或发送数据
console.log('曝光上报:', entry.target.textContent);
}
});
}, {
// 配置项,可以指定根元素、阈值等
threshold: 0.5, // 当目标元素可见部分占比超过50%时触发回调
});
// 获取列表中的所有项
const items = document.querySelectorAll('.list-item');
// 遍历每个项并观察
items.forEach(item => {
observer.observe(item);
});
四、错误发生时
这个比较容易理解也比较简单,但是很重要哦,你想想线上出问题,看错误埋点不到一分钟就查到了原因!
下面简单意思一个使用try catch 来捕捉逻辑错误方法。
function complexCalculation(data) {
try {
return data.reduce((acc, val) => acc + val, 0);
} catch (error) {
// 捕获并处理错误
console.error('错误上报', error.message);
// 返回默认值或执行其他错误处理逻辑
return null;
}
}
五、网络请求完成时
这个类型的话呢,举例一个接口状态上报,也是一个问题排查的保险,
function reportApiStatus(params) {
// 你可以使用Ajax请求、fetch API或其他适合你项目的方式
// 这里只是一个简单的示例
fetch('https://example.com/report_api', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(params)
})
.then(response => {
if (response.success) {
console.log('接口成功上报');
} else {
console.error('接口失败上报');
}
})
.catch(error => {
console.error('逻辑错误上报');
});
}
结尾
针对埋点这一块,
首先,埋点肯定是必要的,不管是前端 服务端 客户端。因为对于整个系统流程,都要有一个链路还有汇总。
数据埋点的话像点击量、下载量、PU\VU啥的,这些是项目统计数据,要注意上报的时机准确,才能保证数据的准确性。
还更要注重技术埋点,主要是有问题能够快速帮助你定位、排查问题原因,细致一些总是不会错的,不要怕麻烦。
JYM对于埋点又是什么看法呢?