javascript - 如何让 ServiceWorker 在缓存重置/Shift+F5 后存活下来?

标签 javascript html service-worker

我想创建一个即使服务器离线也能正常工作的网站 — 我发现这就是 ServiceWorkers是为了。

当我使用 Service Worker 重新加载页面但没有连接时,它工作正常。但是,shift+reload(例如绕过缓存)会解除 service worker 的武装,我会收到“无法连接到服务器”错误。

我的问题是——我能否以某种方式防止 shift+reload(shift+f5、ctrl+f5 等)破坏 service worker,或者至少在不恢复连接的情况下使其恢复?

最佳答案

通过以下方法,即使在 Ctrl+F5 之后,我也能够继续使用 service worker:

在窗口脚本中:

navigator.serviceWorker.register(<...>).then (registration => {
    if (navigator.serviceWorker.controller === null) {
        // we get here after a ctrl+f5 OR if there was no previous service worker.
        navigator.serviceWorker.ready.then(() => {
            registration.active.postMessage("claimMe");
        });
    }
    <...>
});

在服务脚本中:

self.onmessage = (event) => {
    if (event.data === "claimMe") {
        self.clients.claim();
    }
};

简而言之,我们要求 service worker 再次声明所有客户端,这甚至适用于使用 Ctrl+F5 的客户端。

如果您想在 Service Worker 代码中使用 Ctrl+F5,您可以:

  1. 在声明之前清除缓存。请注意,这也会影响任何其他现有的客户端,这可能是不需要的。
  2. 做一些更复杂的事情,例如发送请求 Ctrl+F5 的客户端的 ID,并专门处理此类客户端的提取请求。

关于javascript - 如何让 ServiceWorker 在缓存重置/Shift+F5 后存活下来?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37559415/

相关文章:

javascript - 如果缓存名称不同,则手动更新 servceworker 缓存

javascript - 如何从另一个组件调用一个组件方法?

c# - 通过数组作为 $ajax 参数 MVC

html - 臭名昭著的两个 Div 彼此相邻

html - 文档类型破坏了我的 CSS,为什么?

javascript - workbox 3 - 忽略运行时缓存的 URL 参数

javascript - 如何更改请求的 header ?

javascript - 如何在特定行暂停JS脚本执行?

javascript - 从 json 源导入图像 (create-react-app)

javascript - HTML 和 Javascript "Hamburger Menu"不工作