JS Navigator.sendBeacon 可靠的、异步地向服务器发送数据

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: Navigator.sendBeacon 是一个用于发送少量数据到服务器的 API,尤其适用于在页面即将卸载时发送数据,如日志记录、用户行为分析等。与传统的 AJAX 请求不同,sendBeacon 方法的设计目标是确保数据在页面卸载(例如用户关闭标签页或导航到新页面)时能够可靠地发送。Navigator.sendBeacon 方法可用于通过 HTTP POST 将少量数据异步传输到 Web 服务器。它主要用于将统计数据发送到 Web 服务器,同时避免了用传统技术(如:XMLHttpRequest)发送分析数据的一些问题。

一、Navigator.sendBeacon 是什么&能做什么?


Navigator.sendBeacon 是一个用于发送少量数据到服务器的 API,尤其适用于在页面即将卸载时发送数据,如日志记录、用户行为分析等。

与传统的 AJAX 请求不同,sendBeacon 方法的设计目标是确保数据在页面卸载(例如用户关闭标签页或导航到新页面)时能够可靠地发送。

Navigator.sendBeacon 方法可用于通过 HTTP POST 将少量数据异步传输到 Web 服务器。

它主要用于将统计数据发送到 Web 服务器,同时避免了用传统技术(如:XMLHttpRequest)发送分析数据的一些问题。

二、Navigator.sendBeacon 详细介绍

1、使用场景

  1. 页面卸载时的日志记录:在用户离开页面时记录行为数据,如页面停留时间、点击行为等。
  2. 分析和监控:发送用户行为数据到分析服务器,用于网站性能监控和用户行为分析。
  3. 状态报告:向服务器报告应用程序状态或错误信息。

2、不使用 Navigator.sendBeacon 时,如何处理?

  1. 发起一个同步 XMLHttpRequest 来发送数据(open() 方法的第三个参数为 false)。
  2. 创建一个 <img> 元素并设置 src,大部分用户代理会延迟卸载(unload)文档以加载图像。
  3. 创建一个几秒的 no-op 循环。

3、不使用 Navigator.sendBeacon 可能会带来哪些问题?

3.1. 同步 XHR

  1. 同步请求会阻塞浏览器的主线程,导致页面在请求完成之前无法响应用户操作。这会严重影响用户体验,尤其是在请求需要较长时间才能完成时。
  2. 许多现代浏览器会对同步请求发出警告,提示开发者这种方法可能会导致性能问题,并建议改用异步请求。

3.2. 创建 img 元素

  1. 页面卸载流程被阻塞。
  2. 后面页面的加载时机被延迟,用户体验不好。

3.3. 创建循环

  1. 页面卸载流程被阻塞。
  2. 后面页面的加载时机被延迟,用户体验不好。

4、Navigator.sendBeacon 的优点

  1. 可靠性:sendBeacon 的主要设计目标是确保数据在页面卸载时能够可靠地发送。浏览器会在后台继续尝试发送数据,即使页面已经关闭或正在导航到新页面。
  2. 非阻塞:sendBeacon 方法是非阻塞的,不会阻碍页面的卸载过程。相比于传统的同步 AJAX 请求,不会影响用户体验或导致页面卸载延迟。
  3. 简单性:接口简单,只需提供目标 URL 和数据,无需处理响应。适用于只需要发送数据而不需要从服务器获取数据的场景。
  4. 安全性:与其他 AJAX 请求方法一样,sendBeacon 遵循同源策略,不能发送跨域请求,除非服务器设置了适当的 CORS 头。

5、使用限制

  1. 数据大小限制(通常为几十 KB),适用于发送少量数据。
  2. 因为数据大小有限,sendBeacon 不适合用于发送大量或大文件的数据。
  3. sendBeacon 方法始终使用 HTTP POST 请求。
  4. 不返回响应,不提供处理服务器响应的机制,无法检查请求是否成功以及服务器的返回结果。

6、浏览器兼容性

Navigator.sendBeacon 支持主流的现代浏览器,包括 ChromeFirefoxSafariEdge 等,但不支持较老的浏览器(如 IE 11 及更早版本)。

三、Navigator.sendBeacon 如何使用

1、语法

navigator.sendBeacon(url);
navigator.sendBeacon(url, data);

2、参数

2.1. url

url 参数表明 data 将要被发送到的网络地址。

2.2. data 可选

data 参数是将要发送的 ArrayBufferArrayBufferViewBlobDOMStringFormDataURLSearchParams 类型的数据。

3、返回值

类型:boolean

当用户代理成功把数据加入传输队列时,sendBeacon() 方法将会返回 true,否则返回 false

4、Navigator.sendBeacon 使用举例

4.1. 参数格式为 ArrayBuffer

适用于传递二进制数据,如文件或图像片段。

const buffer = new ArrayBuffer(8);
navigator.sendBeacon('/log', buffer);

4.2. 参数格式为 ArrayBufferView

ArrayBufferView 是一种表示二进制数据视图的类型。常见的 ArrayBufferView 类型包括 Uint8Array, Int8Array, Uint16Array, Int16Array, Uint32Array, Int32Array, Float32Array, Float64Array 等等。


// 创建一个包含字符串的 Uint8Array
const text = 'Hello, world!';
const textEncoder = new TextEncoder();
const textArray = textEncoder.encode(text); // 将字符串编码为 Uint8Array
// 创建一个包含其他二进制数据的 Uint8Array
const binaryData = new Uint8Array([1, 2, 3, 4, 5]);
// 将两部分数据合并到一个大的 Uint8Array
const combinedArray = new Uint8Array(textArray.length + binaryData.length);
combinedArray.set(textArray, 0);
combinedArray.set(binaryData, textArray.length);
// 发送合并后的 Uint8Array
navigator.sendBeacon('xxx/xxx', combinedArray);

4.3. 参数格式为 Blob

适用于传递文件或其他大块的二进制数据。


const blob = new Blob(['user=gqk'], { type: 'text/plain' });
navigator.sendBeacon('xxx/xxx', blob);

4.4. 参数格式为 DOMString

适用于简单的文本数据。


navigator.sendBeacon('xxx/xxx', 'this is sendBeacon case');

4.5. 参数格式为 FormData

适用于发送表单内容或复杂的键值对数据。


const formData = new FormData();
formData.append('user', 'gqk');
navigator.sendBeacon('xxx/xxx', formData);

4.6. 参数格式为 URLSearchParams

适用于发送 URL 编码的查询参数。


const params = new URLSearchParams();
params.append('user', 'gqk');
navigator.sendBeacon('xxx/xxx', params);


四、Navigator.sendBeacon 和 XHR、fetch 有什么异同点

1、相同点

  1. 发送网络请求:所有这三种方法都用于从客户端向服务器发送数据。
  2. 支持多种数据格式:它们都可以发送字符串、JSON、二进制数据等多种格式的数据。

2、不同点

2.1. Navigator.sendBeacon

  1. 用于在页面卸载时发送少量数据,适合日志、分析数据等用途。
  2. 发送数据是异步的,但不返回任何信息给调用者,无法处理服务器的响应。
  3. 设计为在页面卸载时保证数据发送,即使在浏览器关闭或页面跳转时。
  4. 始终使用 HTTP POST 请求。
  5. 不需要处理响应,使用简单。

2.2. XMLHttpRequest

  1. 用于更复杂的、需要处理响应的 AJAX 请求。
  2. 可以进行同步或异步请求。
  3. 可以处理服务器的响应,并进行进一步处理(如解析 JSON、处理状态码等)。
  4. 提供丰富的事件(如 onloadonerroronprogress 等),可以监控请求的各个阶段。
  5. 在所有主流浏览器中都得到了广泛支持,包括一些较老的浏览器。
  6. 使用较复杂,需要处理请求的各个阶段和状态。

2.3. Fetch

  1. 现代化的请求接口,用于替代 XMLHttpRequest,支持更简单和更灵活的请求和响应处理。
  2. 始终进行异步请求,返回 Promise 对象。
  3. 支持链式处理响应,可以轻松解析 JSON、处理状态码等。
  4. 支持 async/await 语法,更符合现代 JavaScript 开发习惯。
  5. 更好地支持跨域请求和 CORS(跨域资源共享)。
  6. 允许在请求中添加更多的选项(如自定义头部、请求方法等)。

3、三者使用场景

  • Navigator.sendBeacon:简单、适合在页面卸载时发送少量数据,不处理响应。
  • XHR:功能全面、适合复杂的 AJAX 请求,但使用较复杂。
  • Fetch:现代化接口,简洁灵活,适合处理复杂请求和响应。

五、总结

  1. Navigator.sendBeacon 是一个专为可靠性设计的 API,特别适用于在页面卸载时发送少量数据。
  2. 它具有简单、非阻塞、可靠等优点,特别适合日志记录和用户行为分析等场景。
  3. 发出的是异步请求,并且是 POST 请求。
  4. 只能判断出是否放入浏览器任务队列,不能判断是否发送成功。
  5. 无需处理返回值。
  6. 需要注意浏览器兼容问题。
相关实践学习
日志服务之使用Nginx模式采集日志
本文介绍如何通过日志服务控制台创建Nginx模式的Logtail配置快速采集Nginx日志并进行多维度分析。
目录
相关文章
|
1天前
|
JSON 前端开发 JavaScript
在 JavaScript 中,如何使用 Promise 处理异步操作?
通过以上方式,可以使用Promise来有效地处理各种异步操作,使异步代码更加清晰、易读和易于维护,避免了回调地狱的问题,提高了代码的质量和可维护性。
|
3天前
|
数据采集 JavaScript 搜索推荐
服务器端渲染(SSR)(Nuxt+Next.js)
服务器端渲染(SSR)技术在服务器上生成页面HTML,提升首屏加载速度和SEO效果。Nuxt.js和Next.js分别是基于Vue.js和React.js的流行SSR框架。Nuxt.js提供自动化路由管理、页面级数据获取和布局系统,支持SSR和静态站点生成。Next.js支持SSR、静态生成和文件系统路由,通过`getServerSideProps`和`getStaticProps`实现数据获取。SSR的优点包括首屏加载快、SEO友好和适合复杂页面,但也会增加服务器压力、开发限制和调试难度。选择框架时,可根据项目需求和技术栈决定使用Nuxt.js或Next.js。
|
8天前
|
缓存 负载均衡 监控
性能优化:Node.js高效服务器开发技巧与最佳实践
【10月更文挑战第29天】在Node.js服务器开发中,性能优化至关重要。本文介绍了几种高效开发的最佳实践,包括使用缓存策略、采用异步编程、实施负载均衡和性能监控。通过示例代码展示了如何实现这些技术,帮助开发者构建更快、更稳定的Node.js应用。
22 2
|
11天前
|
数据采集 存储 JavaScript
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
本文介绍了如何使用Puppeteer和Node.js爬取大学招生数据,并通过代理IP提升爬取的稳定性和效率。Puppeteer作为一个强大的Node.js库,能够模拟真实浏览器访问,支持JavaScript渲染,适合复杂的爬取任务。文章详细讲解了安装Puppeteer、配置代理IP、实现爬虫代码的步骤,并提供了代码示例。此外,还给出了注意事项和优化建议,帮助读者高效地抓取和分析招生数据。
如何使用Puppeteer和Node.js爬取大学招生数据:入门指南
|
17天前
|
存储 数据挖掘
服务器数据恢复—用RAID5阵列中部分盘重建RAID5如何恢复原raid5阵列数据?
服务器数据恢复环境: 一台服务器挂接一台存储,该存储中有一组由5块硬盘组建的RAID5阵列。 服务器故障: 存储raid5阵列中有一块硬盘掉线。由于RAID5的特性,阵列并没有出现问题。工作一段时间后,服务器出现故障,用户方请人维修。维修人员在没有了解故障磁盘阵列环境的情况下,用另外4块硬盘(除去掉线的硬盘)重新创建了一组全新的RAID5阵列并完成数据同步,导致原raid5阵列数据全部丢失。
|
30天前
|
前端开发 JavaScript
JS-数据筛选
JS-数据筛选
32 7
|
28天前
|
网络协议 Unix Linux
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
一个.NET开源、快速、低延迟的异步套接字服务器和客户端库
|
28天前
|
前端开发 JavaScript 开发者
JS 异步解决方案的发展历程以及优缺点
本文介绍了JS异步解决方案的发展历程,从回调函数到Promise,再到Async/Await,每种方案的优缺点及应用场景,帮助开发者更好地理解和选择合适的异步处理方式。
|
29天前
|
JavaScript 数据安全/隐私保护
2024了,你会使用原生js批量获取表单数据吗
2024了,你会使用原生js批量获取表单数据吗
45 4
|
25天前
|
JSON JavaScript 前端开发
使用JavaScript和Node.js构建简单的RESTful API服务器
【10月更文挑战第12天】使用JavaScript和Node.js构建简单的RESTful API服务器
15 0
下一篇
无影云桌面