当前位置: 首页 > 知识库问答 >
问题:

如何使ServiceWorker在缓存重置/移位F5中存活?

通令
2023-03-14

我想创建一个网站,即使当它的服务器离线时也可以工作——我发现这就是服务工人的目的。

当我重新加载带有service worker且没有连接的页面时,它工作正常。但是,轮班重新加载(例如,绕过缓存)会解除服务工作人员的防护,并出现“无法连接到服务器”错误。

我的问题是-我是否可以以某种方式防止轮班重新加载(shift f5、ctrl f5等)破坏服务人员,或者至少在不恢复连接的情况下使其恢复?

共有2个答案

邹举
2023-03-14

如何使ServiceWorker在缓存重置/移位F5中存活?

从理论上讲(*),你可以用js插件来检测按下CtrlShift键的情况。。。然后防止“强制刷新”发生

...但是在这个Ctrl/Shiftreload的背后有一个故事。

(*)免责声明:我还没有试过

这实际上是一个服务工作者规范。并且只存在于最近的Chrome变化中。对于Chrome的早期版本,Service Worker在“强制刷新”中没有任何问题。

连同W3C的规格

navigator.serviceWorker.controller返回null,如果请求是强制刷新(移位刷新)。

此外,有许多人(**)建议“强制刷新”应始终清除所有类型的缓存。这与其存在的目的和规格相匹配。

...此外,我们甚至在维基百科上看到了它。。。

维基百科:绕过缓存意味着强迫你的浏览器从头开始重新html" target="_blank">下载网页

(**)我们,网站开发人员的早期服务工作者。

在我看来,我认为让一支力量刷新它的工作是可以的。因为当我们这样做的时候,几乎所有人都希望浏览器不使用任何缓存。

从智明
2023-03-14

通过以下方法,即使在按住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();
    }
};

简而言之,我们要求服务工作者再次声明所有客户端,这甚至适用于使用Ctrl F5的客户端。

如果要遵守服务人员代码中的Ctrl F5,可以:

  1. 在声明之前清除缓存。请注意,这也会影响可能不需要的任何其他现有客户端
 类似资料:
  • 我调用服务器数据通过使用ajax在index.html.它是完美的获取这些数据。现在,我正在和服务人员一起工作。我可以缓存所有的静态资产(图像,js,css),并在Chrome开发工具的应用程序选项卡中的缓存存储中检查这些缓存的资产。我可以在网络选项卡中看到这些资产也被缓存(磁盘缓存)。 现在,我想使用ServiceWorker缓存这些ajax响应(图像文件数组)。在“网络”选项卡中,我可以看到它

  • 我在Eclipse包资源管理器中看到以下信息: 是否可以更改此位置?

  • 我有一个数据流,其中包含一个键,我需要将其与与该键关联的数据进行混合和匹配。每个键都属于一个分区,每个分区都可以从数据库加载。 数据非常大,在一个任务管理器中,几十万个分区中只有几百个可以容纳。 我目前的方法是基于并将分区数据缓存在中,以混合和匹配分区数据,而无需多次重新加载分区数据。 当同一分区上的消息速率过高时,我遇到了热点/性能瓶颈。 在这种情况下,我在Flink中有哪些工具可以提高吞吐量?

  • 我搜索了如何在Angular2中缓存XHR,发现使用了< code>share()方法。但是我创建的服务并不像我预期的那样工作。 我错过了什么?(当然,导入所需的类和接口)

  • 问题内容: 对于我的10,000点,我决定在这个很酷的网站上做出一些贡献:一种将位图缓存在本机内存中的机制。 背景 Android设备为每个应用程序分配的内存非常有限-堆的范围从16MB到128MB,具体取决于各种参数。 如果超过此限制,则会得到OOM,并且在使用位图时可能会发生多次。 很多时候,应用可能需要克服这些限制,对巨大的位图执行繁重的操作,或者只是将其存储以备后用,而您需要 我想出的是一

  • 我正在尝试使用android Studio3.1.1开发一个简单的android应用程序。在构建时,我从Gradle得到一个同步失败的错误。底部生成面板显示此错误消息。 无法为“http://jcenter.bintray.com/org/jetbrains/kotlin/kotlin-stdlib-jre8/1.2.0/kotlin-stdlib-jre8-1.2.0.pom”添加头。从服务器接