Navigator.sendBeacon()数据大小限制

Zbu*_*bun 8 javascript firefox google-chrome navigator

我想使用相当新的beacon api.我在网上搜索但我找不到数据发送数据的大小限制.在参考文献中,它写的是用于少量数据,但我必须知道有多少......

not*_*ary 11

最大大小(如果已设置)将取决于用户代理(浏览器或其他).

http://www.w3.org/TR/beacon/#sec-sendBeacon-method

您可以data通过创建可变长度的字符串N(从任意高的值开始N,并使用二进制搜索)轻松地为网页中的大小限制创建测试,并检查返回值sendBeacon(根据规范,在用户sendBeacon返回false时)超出代理数据限制).

例如,我使用此方法确认在Windows 7上的Chrome 40中限制为65536(2^16).

示例代码(没有二进制搜索n):

var url = 'http://jsfiddle.net?sendbeacon';
var n = 65536; // sendBeacon limit for Chrome v40 on Windows (2^16)

// this method courtesy of http://stackoverflow.com/questions/14343844/create-a-string-of-variable-length-filled-with-a-repeated-character
var data = new Array(n+1).join('X'); // generate string of length n

if(!navigator.sendBeacon(url, data))
{
   alert('data limit reached');
}
Run Code Online (Sandbox Code Playgroud)

  • 2021 年 Windows 10 上的 Chrome 91 仍存在 65536 限制 (2认同)

edw*_*fox 6

在评论中回答Zbun 的问题

简而言之,sendBeacon()请求队列的总字节大小以及单个sendBeacon()请求的有效负载大小都有限制。

正如在nothingisnecessary的回答中提到的,W3C 规范说:

用户代理必须发起一个带有 keepalive 标志设置的获取,这限制了此类请求可以排队的数据量,以确保信标请求能够快速及时地完成。

这仍然为每个实现留下了实际的字节大小限制,目前大多数浏览器通常为 64KB。

同样在一个相关的 GitHub 问题中,通过 Fetch API #39 强制实施有效载荷限制,提到传输中有效载荷的字节大小被计算在内,并且有类似的限制。您可以查看 Chromium 的测试文件,看到 64KB 是 Chromium 的限制,并且与您指出的完全相同的行为(超出限制后的后续请求)是合适的。

https://chromium.googlesource.com/chromium/src/+/c1a211aa583ade023aca652e9493c01603623aa3/third_party/WebKit/LayoutTests/http/tests/sendbeacon/beacon-allowance-limit.html

  • @MichalTsadok `sendBeacon` 是在 [Beacon API](https://w3c.github.io/beacon/#sendbeacon-method) 规范中定义的,它构建在 [fetch 标准](https://fetch .spec.whatwg.org/)。`navigator.sendBeacon()` 和 `window.fetch()` 是完全不同的 API,但据我了解,它们在内部都使用相同的 `fetch` 机制。 (2认同)