javascript - Firefox - 我认为每个选项卡都有一个单独的 Service Worker 实例 - 为什么?
问题描述
问题陈述
我目前正在开发一个 Web 应用程序,它尝试使用服务人员在不同的选项卡之间共享数据。
在此过程中,我注意到 Firefox 和 Chrome 表现出不同的行为:
- 在 Chrome 中,有一个服务工作者实例控制在其范围内打开的所有选项卡/窗口。
- 在 Firefox 中,每个打开的选项卡/窗口似乎都有一个单独的服务工作者实例。
在缩小原因范围的同时,我已将问题简化为下面看到的最小示例。在 Firefox 和 Chrome 中分别打开此测试页面两次(并重新加载以让工作人员控制),我发现虽然 Chrome 计算两个选项卡上的按钮点击次数,但 Firefox 似乎为每个选项卡保留单独的计数。为什么会这样?
最小的例子
测试.html
<!doctype html>
<html lang="en">
<head></head>
<body>
<script src="test-client.js"></script>
<input type="button" id="test-button" value="Click me!" />
<div id="test-output">Click the button!</div>
</body>
</html>
测试客户端.js
navigator.serviceWorker.register('/test-worker.js');
document.addEventListener('DOMContentLoaded', () =>
{
let output = document.getElementById('test-output');
document.getElementById('test-button').addEventListener('click', () =>
{
fetch('/worker/count').then((r) => r.text()).then((t) => { output.innerText = t; });
});
});
测试工作者.js
let count = 0;
self.addEventListener('fetch', (e) =>
{
if ((new URL(e.request.url).pathname) === '/worker/count')
{
++count;
e.respondWith(new Response(''+count));
}
else
e.respondWith(fetch(e.request));
});
解决方案
推荐阅读
- python - 如何正确迁移 Django 中的 Enumfield 值?
- json - 如何在液体 json 到 json 转换中使用子字符串操作?
- sql - Oracle 更新非索引和非分区表的有效方法?
- ldap - WebLogic LDAP 可调度 CRUD 操作
- python - Tensorflow 数据集 - 地图 json
- snowflake-cloud-data-platform - 如何在 Snowflake 的 INNER SELECT 语句中使用声明的变量?
- javascript - MS Graph 创建 onlineMeeting:“onlinemeeting 不能为空。”
- ios - UITextField 的下边框为 tintColor
- cordova - 在 Ionic (ionic native push / phonegap-plugin-push) 上接收通知附加数据
- xml - 如何在 ASP.net Core 2.1 中生成动态 API