feng xiaohan

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 请求),并返回简单数据。