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

服务工作者到期

江宏放
2023-03-14

一旦安装了Service Worker,Chrome浏览器需要多长时间来检查它的更新版本?当前客户端服务工作人员通常什么时候到期?

我正试图找出与服务人员一起开发并将更改推送到prod的最佳实践。目前,一旦对服务人员的行为方式实施了更改,如果已经安装了以前的服务人员,则客户机并不总是会接受该更改。

这个问题也有一定的相关性:以编程方式更新服务工作人员——理想情况下,一旦对SW实现了更改,您会希望在所有可能已经拥有先前版本的客户端上强制更新它。

共有3个答案

强承望
2023-03-14

我一直在Chrome电脑和Chrome Android手机上测试服务人员。

结果是:

>

另一个问题是在生产服务器上将文件更新为html、js等时的典型缓存问题。

首先,我感到困惑,因为我认为服务工作者缓存问题之间的混合只是一个大混乱。

我所看到的是,如果我更改了一个. js文件,导航器不会捕获它。所以我解决它的方法是在脚本调用中使用版本:

<script src="jquery-functions.js?ver=1.54"></script>

每次更改文件中的代码时,请确保增加版本(在我的示例中:ver=1.55)

这只适用于计算机和Android系统,服务器工作者根本不会干预。它对web版本和webApp版本的工作原理相同。

另一个问题是如何更改或更新服务工作者本身。我尝试的第一件事是删除对服务工作者文件的脚本调用。这不会删除服务工作者。

我寻找代码删除服务工作者,这似乎在Chrome计算机和ChromeAndroid正常工作。

// REMOVE ALL SERVICE WORKERS
navigator.serviceWorker.getRegistrations().then(
    function(registrations) {
        for(let registration of registrations) {
            registration.unregister();
        }
});

// AND REMOVE ALL CACHES 
caches.keys().then(function(names) {
    for (let name of names)
        caches.delete(name);
});

在计算机上:在不使用服务工作者脚本的情况下应用此代码后,它仍会运行,但会显示以下控制台消息:domain。名称-已删除。第二次重新加载后,服务人员的状态显示以下消息:“#状态为冗余”。(这似乎没问题;服务人员已被移除)

如果我再次运行服务工作者,如果我在chrome控制台上向下滚动,我可以看到另一个服务工作者正在运行;所以它似乎工作正常;这是杀死服务工作者并唤醒他们的方法。

在Android手机上启动webApp主屏幕图标时:第一次像往常一样打开时:服务人员似乎继续正常工作。(行为与Chrome计算机相同)

当我第二次尝试打开带有“飞行模式”的webApp主屏幕图标(以测试服务人员的功能)时,当没有互联网连接时,我得到了导航器的典型错误。我理解这种行为是正确的,因为服务人员已被杀害。

我认为这是对服务人员感到有点自信的第一步,但如果您有更多信息或测试,请将反馈发送给我。

使用带有“应用程序”选项卡的Chrome控制台非常重要-

作为一个小小的奖励,当用户没有互联网连接时,最好通知用户无法保存更改。这是我做这件事的简单方法:

setInterval(() => {
    if (!navigator.onLine) { niceAlert("No Internet connection detected. Your changes will not be saved"); }
},5000);
郏志诚
2023-03-14

仔细阅读MDN文档可以得出以下答案:

https://developer.mozilla.org/en-US/docs/Web/API/Service_Worker_API/Using_Service_Workers#Updating_your_service_worker

如果以前安装过service worker,但刷新或页面加载时新版本的worker可用,则新版本将在后台安装,但尚未激活。只有当加载的页面不再使用旧的service worker时,它才会被激活。一旦不再加载此类页面,新的服务工作者就会激活。

阴高寒
2023-03-14

默认情况下,服务人员在24小时后到期。但最好的方法是使用max age=0头。因为我们希望我们的变化能尽快反映出来。我不知道强制更新的情况,但是当他们没有缓存service worker文件并且没有为以前的service worker打开选项卡时,新的service worker将自动安装。

有关更多信息,请参阅此链接https://jakearchibald.com/2016/caching-best-practices/

 类似资料:
  • 我注意到,当服务工作人员脚本本身加载到浏览器中时,不再触发服务工作人员的读取事件。例如,当我们有一个新版本的服务辅助角色时,旧的服务辅助角色读取事件不会被触发。因此,旧的服务工作者不能再检查新服务工作者的内容。 我确信这以前是可能的,我想知道这是否是一个bug,或者是否对此进行了任何更改。我在官方存储库或W3C草稿中没有找到与此更改相关的任何内容。 为了验证fetch事件没有被触发,我用版本号(参

  • 服务工作者可以做哪些web工作者做不到的事情?或者反之亦然? 看来web工作者是服务工作者功能的一个子集。这是正确的吗?

  • 问题内容: 从我的根目录删除后,Chrome仍然运行我从Webroot中删除的服务工作者。如何从我的网站和Chrome卸载服务工作者,以便可以重新登录我的网站? 我已将问题归结为ServiceWork的缓存机制,我只想暂时将其删除,直到有时间对其进行调试为止。我正在使用的登录脚本将重定向到Google的服务器,以便他们登录其Google帐户。但是,我从login.php页面获得的只是一条消息。 问

  • 从根目录中删除后,Chrome仍然运行我从webroot中删除的服务工作者。我如何从我的网站和Chrome卸载服务工作者,以便我可以重新登录到我的网站? 我已经将问题追溯到Service Work的缓存机制,我现在只想删除它,直到我有时间调试它。我正在使用的登录脚本重定向到谷歌的服务器,以便他们登录到他们的谷歌帐户。但是我从login.php页面得到的只是一条消息。

  • 我正在使用Service Worker创建一个渐进式Web应用程序,我正在使用Service Worker工具箱来缓存我的内容。Service Worker代码来缓存我的内容: 代码运行正常,因为我在控制台上没有看到任何错误。但是我如何检查是否从云前或上面配置的网址的图像正在缓存和从缓存本身渲染。

  • 我们在reactjs应用程序中安装了离线插件,该应用程序使用service worker缓存构建文件,未检查新构建的任何更新,因此,具有旧构建的用户仍在使用service worker中的缓存数据访问旧站点。这些文件没有过期设置,所以我想知道是否有任何解决方案可以强制用户刷新页面或将更新推给用户? 我在新版本中进行了更新,没有缓存头,离线插件自动更新,但我仍然无法找到将此更新推送到旧用户文件的方法