
前端埋点
页面销毁
数据上报时机:
1 |
|
注意:在移动设备下,一些浏览器并不支持
beforeunload
事件,最可靠的方式是在visibilitychange
事件中处理。
1 |
|
页面关闭应该可以细分为两类:
1、目前浏览器打开了多个tab页面,只是关闭浏览器的一个tab页面,浏览器进程或主界面还在
2、目前浏览器就打开一个tab页面,关闭页面也就是关闭了浏览器进程【此时无法发送成功】
推荐使用fetch、sendBeacon上报
数据上报
ajax
(XMLHttpRequest)sendBeacon
(Navigator.sendBeacon)fetch
(Fetch keepalive)
ajax
对于 ajax 发起异步请求,若在发送过程中 刷新或关闭 浏览器,请求会被自动终止
如果想在控制台查看刷新前页面接口调用情况,可勾选
Preserve log
选项,Network 会保留上个页面的请求记录。
一般使用异步请求上报,目前,谷歌浏览器已经不允许在页面关闭期间发起 同步 XHR 请求,建议使用 sendBeacon
或者 fetch keep-alive
1 |
|
sendBeacon
1 |
|
url
: 指定将要被发送到的网络地址;data
: 可选,是将要发送的 ArrayBuffer、ArrayBufferView、Blob、DOMString、FormData 或 URLSearchParams 类型的数据。return
: 返回值。当用户代理成功把数据加入传输队列时,**sendBeacon()
** 方法将会返回true
,否则返回false
。
1 |
|
sendBeacon
发送请求有以下几个特点:
- 通过
HTTP POST
请求方式 异步 发送数据,同时不会延迟页面的卸载或影响下一导航的载入性能; - 支持跨域,但不支持自定义
headers
请求头,这意味着:如果用户信息Access-Token
是作为请求头信息传递,需要后台接口支持url querystring
参数传递解析。 - 考虑其兼容性。
fetch
1 |
|
但它也有一些限制需要注意:
传输数据大小限制
:无法发送兆字节的数数据,我们可以并行执行多个keepalive
请求,但它们的 body 长度之和不得超过64KB
。无法处理服务器响应
:在网页文档卸载后,尽管设置keepalive 的 fetch 请求
可以成功,但后续的响应处理无法工作。所以在大多数情况下,例如发送统计信息,这不是问题,因为服务器只接收数据,并通常向此类请求发送空的响应。
其他
对于无法查看控制台的页面
可以考虑把错误上发到后台查看日志
例如:
1 |
|