Unregistering/Removing 一名服务工作者

Unregistering/Removing a Service Worker

我有一个糟糕的服务工作者不再更新。我首先注意到 Chrome 中的问题。然后,我将以下代码放入 index.html 文件和 sw.js(服务工作者)文件中。在大多数情况下,它似乎工作正常。 Firefox 似乎是唯一没有移除 service worker 的浏览器。我使用下面的文章创建了注销脚本。

我也用过这篇文章和代码,得到了相同的结果。

我还收到一条关于 getRegistrations() 的错误消息,说它未定义。也不知道如何解决。

非常感谢能帮助解决这两个问题。

<script>
navigator.serviceWorker.getRegistrations().then(function(registrations) {
 for(let registration of registrations) {
  registration.unregister();
} });</script>

我偶然发现了这个似乎是 better-than-most 解决方案的答案。

博客Post:https://medium.com/@nekrtemplar/self-destroying-serviceworker-73d62921d717

Github: https://github.com/NekR/self-destroying-sw

它用这段代码自我毁灭:

self.addEventListener('install', function(e) {
  self.skipWaiting();
});

self.addEventListener('activate', function(e) {
  self.registration.unregister()
    .then(function() {
      return self.clients.matchAll();
    })
    .then(function(clients) {
      clients.forEach(client => client.navigate(client.url))
    });
});

这里对上面的代码进行了更in-depth的解释和进一步的改进。 https://love2dev.com/blog/how-to-uninstall-a-service-worker/

下面的示例代码将检查在您的浏览器中注册的 Service Worker 并获取它。

registration.active.scriptURL 将为您提供所有服务人员的确切 url。

registration.unregister();将删除该服务人员。

LINK: https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/unregister

if ('serviceWorker' in navigator) {
    navigator.serviceWorker.getRegistrations()
        .then(function(registrations) {
            for(let registration of registrations) {
               if(registration.active.scriptURL == 'http://localhost/my-push/myworker.js'){ registration.unregister(); }
            }
        });
}

如果你想更新 service worker 代码而不是使用 https://developer.mozilla.org/en-US/docs/Web/API/ServiceWorkerRegistration/update