navigator.sendBeacon
发送网络请求的方式
- AJAX(xml 是代表)
- fetch
- sse
- websocket
- jsonp
- image 的 src
- navigator.sendBeacon
使用 navigator.sendBeacon
实现高效的数据上报
在 web 开发中,我们经常需要将用户行为或性能数据上报到服务器。为了不影响用户体验,开发者通常会在页面卸载时进行数据上报。然而,传统的数据上报方式,如 XMLHttpRequest
或 Fetch API
,容易受到页面卸载过程中的阻塞,导致数据丢失。为了解决这个问题,navigator.sendBeacon
API 被引入,它可以在页面卸载时安全、可靠地发送数据。
navigator.sendBeacon 基于 ping 请求 是 html5 新增的 并且是 sendBeacon 特有的 ping 请求 只能携带少量数据,并且不需要等待服务端响应,因此非常适合做埋点统计,以及日志统计相关功能。
对比 ajax fetch 的优点
- fetch 和 ajax 受页面卸载过程的影响,而 sendBeacon 不受
- 异步执行,不阻塞页面关闭或跳转
- 原生支持发送跨域请求
对比 ajax fetch 的缺点
fetch 和 ajax 都可以发送任意请求 而 sendBeacon 只能发送 POST。
fetch 和 ajax 可以传输任意字节数据 而 sendBeacon 只能传送少量数据(64KB 以内),因为 ping 请求只能发送少量数据
fetch 和 ajax 可以定义任意请求头 而 sendBeacon 无法自定义请求头,难以携带 token 等信息
sendBeacon 只能传输
ArrayBuffer
、ArrayBufferView
、Blob
、DOMString
、FormData
或URLSearchParams
类型的数据,不能直接传 JSON 数据如果处于危险的网络环境比如公共网络,或者开启了广告屏蔽插件 此请求将无效
应用场景
- 发送心跳包:可以使用
navigator.sendBeacon
发送心跳包,以保持与服务器的长连接,避免因为长时间没有网络请求而导致连接被关闭。 - 数据埋点:可以使用
navigator.sendBeacon
在页面关闭或卸载时记录用户在线时间,pv uv,以及错误日志上报 按钮点击次数。 - 发送用户反馈:可以使用
navigator.sendBeacon
发送用户反馈信息,如用户意见、bug 报告等,以便进行产品优化和改进
客户端
1 |
|
服务端
1 |
|
navigator.sendBeacon
https://hugtyftg.github.io/2024/01/30/navigator.sendBeacon/