navigator.sendBeacon
前端发送请求的方法有哪些:
- AJAX 的 XMLHttpRequest(axios)
- fetch
- SSE
- Websocket
- jsonp
- image 的 src
navigator.sendBeacon
应用场景
- 发送心跳检测包。
- 做埋点。可以使用 navigator.sendBeacon 在页面关闭或卸载时记录用户的在线时间,pv(page view:页面的浏览量或点击量),uv(unique visitor:独立访客,即访客量),错误日志上报,按钮点击数等。
- 发送用户反馈。如用户意见、bug 报告等,以便进行产品的优化和改进,
对比 AJAX 和 fetch 的优势
- 不受页面卸载过程的影响,确保数据可靠发送。
- 异步执行,不阻塞页面关闭或跳转。
- 能发送跨域请求。
使用 HTML5 新增的 ping 类型,ping 类型的请求不需要等待服务端的返回,能支持发送跨域请求。
ping 类型请求
请求类型 ping 是 HTML5 新增的,并且是 sendBeacon 特有的请求类型,该请求只能携带少量数据,但是他不需要等待服务端响应(因此非常适合做埋点)。
缺点
- 只能发送 post 请求。
- 只能传输少量数据(64kb 以内),并且只能传输 ArrayBuffer、ArrayBufferView、Blob、DOMString、FormData 或 URLSerchParams 类型的数据,不能传送 json。
- 没有办法去定义请求头(比如携带 token 之类的)。
- 如果处理危险的网络环境(比如公共网络),或者开启了广告屏蔽的插件,该请求将失效。
使用
前端
- 在某个监听函数中,使用 navigator.sendBeacon()来发起请求,第一个参数为 url,第二个参数为要传送的数据。
后端
设置 post 请求(由于 sendBeacon 只能发送 post 请求),并返回简单数据。