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

如何删除有问题的服务人员,或实施“终止开关”?

仲孙经赋
2023-03-14

我正在我的计算机上玩服务工作者API,这样我就可以掌握如何在我的现实世界应用程序中从中受益。

在这种情况下,我所知道的删除坏的Service Worker脚本的唯一方法是通过chrome://serviceWorker-内部/控制台。如果这个错误到达一个实时网站,哪个是解决它的最好方法?

谢谢

共有3个答案

姬昀
2023-03-14

这是一个非常糟糕的情况,希望在生产中不会发生在你身上。

在这种情况下,如果你不想在火狐中浏览不同浏览器的开发工具,或者基于眨眼的浏览器的chrome://serviceworker-interals//code>,或者关于: serviceworkers(关于:将来调试#workers)的我想到两件事:

  1. 使用serviceworker更新机制。您的用户代理将检查注册的工作人员是否有任何更改,将获取该更改,并再次进入激活阶段。因此,您可以更改serviceworker脚本,修复(清除缓存等)任何奇怪的情况并继续工作。唯一的缺点是,您需要等待浏览器更新worker,这可能需要1天的时间

我不确定清除浏览器数据是否会删除工作人员,所以这可能是另一个选择。

暨宸
2023-03-14

您可以使用javascript取消注册服务工作人员。这里有一个例子:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.getRegistrations().then(function (registrations) {
    //returns installed service workers
    if (registrations.length) {
      for(let registration of registrations) {
        registration.unregister();
      }
    }
  });
}
朱运诚
2023-03-14

我想在这里扩展一些其他的答案,并从“在将服务人员推广到生产中时,我可以使用什么策略来确保我可以做出任何必要的改变”的角度来处理这个问题?这些更改可能包括修复您在生产中发现的任何小错误,或者它可能(但希望不是)包括由于不可克服的错误而中和服务工作者——所谓的“杀死开关”。

为了回答这个问题,假设你打电话给

navigator.serviceWorker.register('service-worker.js');

在您的页面上,意味着您的服务工作者JavaScript资源是service-worker.js。(如果您不确定所使用的确切的Service Worker URL,请参阅下文-可能是因为您向Service Worker脚本添加了哈希或版本控制信息。)

问题归结为您如何着手解决服务人员的初始问题。jscode。如果这是一个小错误修复,那么您显然可以进行更改并重新部署服务人员。js连接到您的托管环境。如果没有明显的bug修复,并且您不想让用户在花时间制定解决方案的同时运行bug service worker代码,那么最好保留一个简单的、无操作的service worker。jshandy,如下所示:

// A simple, no-op service worker that takes immediate control.

self.addEventListener('install', () => {
  // Skip over the "waiting" lifecycle state, to ensure that our
  // new service worker is activated immediately, even if there's
  // another tab open controlled by our older service worker code.
  self.skipWaiting();
});

/*
self.addEventListener('activate', () => {
  // Optional: Get a list of all the current open windows/tabs under
  // our service worker's control, and force them to reload.
  // This can "unbreak" any open windows/tabs as soon as the new
  // service worker activates, rather than users having to manually reload.
  self.clients.matchAll({type: 'window'}).then(windowClients => {
    windowClients.forEach(windowClient => {
      windowClient.navigate(windowClient.url);
    });
  });
});
*/

这应该是你所有的无操作服务人员。js需要包含。因为没有注册fetch处理程序,所以来自受控页面的所有导航和资源请求最终都会直接与网络冲突,有效地为您提供与没有服务人员时相同的行为。

可以更进一步,强制删除使用缓存存储API存储的所有内容,或者完全显式取消注册服务辅助角色。对于大多数常见的情况,这可能是过度的,遵循上述建议应该足以让您处于当前用户获得预期行为的状态,并且一旦您修复了错误,您就可以重新部署更新。即使启动一个无操作的服务工作人员也会涉及一定程度的开销,因此,如果您没有计划重新部署有意义的服务工作人员代码,您可以选择取消注册服务工作人员。

如果您已经在为服务人员服务的情况下。js由于HTTP缓存指令赋予它比用户可以等待的时间更长的生存期,请记住,桌面浏览器上的Shift重载将迫使页面在service worker控制之外重新加载。并不是每个用户都知道如何做到这一点,但这在移动设备上是不可能的。因此,不要依赖轮班重新加载作为可行的回滚计划。

上面的信息假设您知道服务辅助角色URL是什么-service-worker.jssw.js,或者其他有效不变的东西。但是,如果您在服务工作人员脚本中包含某种版本控制或哈希信息,例如service-worker.abcd1234.js,该怎么办?

首先,在将来尽量避免这种情况,因为这违背了最佳实践。但是,如果您已经部署了许多版本化的服务工作者URL,并且您需要为所有用户禁用这些内容,不管他们可能注册了哪个URL,那么有一个解决方法。

每次浏览器对Service Worker脚本发出请求时,不管是初始注册还是更新检查,它都会设置一个名为Service-Worker:的HTTP请求标头。

假设您对后端HTTP服务器拥有完全控制权,则可以检查传入请求是否存在此服务工作者:头,并始终使用无操作服务工作者脚本响应进行响应,而不管请求URL是什么。

最后一点注意:当作为任何响应的一部分返回特殊HTTP响应头时,某些浏览器将自动清除特定数据,并可能注销服务工作人员:清除站点数据:

当试图从错误的Service Worker部署中恢复时,设置此标头会很有帮助,并且作为示例用例包含在功能的规范中。

在您完全依赖浏览器作为终止开关之前,查看浏览器支持故事中的清除站点数据:,这一点很重要。截至2019年7月,100%支持服务人员的浏览器都不支持该功能,因此,目前,如果您想从所有浏览器中的故障服务人员中恢复,最好使用清除站点数据:以及上述技术。

 类似资料:
  • 我在这个链接的页面中实现的service worker演示有一些问题。我试着为这个演示尽可能地减少代码,但是粘贴到这里太长了。 一个问题是,当页面完全加载时,我转到Chrome devtools的“应用程序”选项卡,我在缓存中看到了很多内容: 不清楚为什么有这么多缓存...可能是我正在加载的字体,但仍然...似乎很大。 更令人担忧的是,当我单击该部分中的按钮(所有选项均已打勾)时,饼图中红色的部分

  • 情况: 在我的网站上。com/game,我在 在我的服务器上,的最大值为。 问题: 。 问题是,每当用户访问,它显示空页面,不再执行任何操作。我无法让客户端获取新的。 如何让客户端获取新的?

  • 我在上传到谷歌云存储的图像文件上创建了一个imageServing url,使用: 但似乎没有删除此url的方法。可用方法“deleteServingUrl”接受一个我不使用的bloKey。 这是否意味着我不需要删除servingUrl? ///////编辑 将Appengine与objectify一起使用。创建了一个servlet,UserImageEndpoint在web中定义了它。xml格式

  • 我坐下来试着实施脑力操。语法似乎很简单。我很难让这个愚蠢的东西发挥作用。我做这件事已经有一段时间了;我承认我需要一些睡眠。也许这就是问题所在。翻译没有输出任何东西。我很确定问题很简单;我知道,在我更好地掌握了这个程序的发展方向之后,我需要对一些函数调用进行模块化。为什么我没有得到输出? 是大脑操的“你好世界”

  • 本文向大家介绍基于Vue 服务端Cookies删除的问题,包括了基于Vue 服务端Cookies删除的问题的使用技巧和注意事项,需要的朋友参考一下 一般在我们做项目时,我们都会通过POST请求拿到服务器给到的set-Cookies,保存在浏览器的Cookie里 这里需要明确一点。缓存有三类 cookie、 sessionStorage 、localStorage cookie: 存储在用户本地终端

  • 硬重装或硬刷新(例如,Chrome中的移位重装)似乎绕过了服务辅助角色。 例如,加载一个服务人员控制的页面,如https://airhorner.com/或https://wiki-offline.jakearchibald.com/,在开发工具中将网络设置为“离线”,然后重新加载页面会导致一个破碎的“没有互联网连接”页面。正常的重新加载会显示缓存的页面。) 有没有办法防止这种情况发生,或者在设备