前端埋点技术方案选型
背景
前端需要添加埋点,记录用户行为,会大量使用到
埋点是什么?
可以理解为,需要发送请求,并带一些信息给后台
技术可选项
- 直接发ajax请求
- 是否有其他更高效的办法?
- 结果还真有:用img请求
为什么是img?
img请求 能够完成整个 HTTP 请求+响应(尽管不需要响应内容), 执行过程无阻塞
优点
- 性能上比较好(是简单请求,不用多一步预检请求的时间消耗)
- 跨域友好(img标签 天然支持跨域,可以容易迁移使用)
封装img请求
// json转url
const parseUrl = (url, json) => {
return url + '?' + Object.keys(json).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(json[key])).join('&')
}
const imgAjax = (params) => {
const url = parseUrl('http://xxx', params)
const img = new Image()
img.src = url
img.style.display = 'none'
document.body.appendChild(img)
document.body.removeChild(img)
}
imgAjax({
text: 123
})
7.26更新,有比img更好的方法
Navigator.sendBeacon()
对比上面的img请求的优点:
- img优点他都有
- 写法更简单
- 更彻底的异步(可以在浏览器空闲的时候发请求,img请求也做不到)
// json转url
const parseUrl = (url, json) => {
return url + '?' + Object.keys(json).map(key => encodeURIComponent(key) + '=' + encodeURIComponent(json[key])).join('&')
}
navigator.sendBeacon( parseUrl('http://xxx', { text: 123 }) )
验证第三点:更彻底的异步(可以在浏览器空闲的时候发请求,img请求也做不到)
如图,红色部分是 navigator.sendBeacon,可以在浏览器空闲的时候发请求
另外,生产环境中 埋点请求如果报错了怎么办?
一般埋点请求是最简单的get请求,只要经过测试,正常是通的,那么一般就没有问题,用户偶尔的网络导致埋点丢失,也是极少量的,无大影响