如何卸载服务工作者?


161

/serviceworker.js从我的根目录删除后,Chrome仍然运行我从Webroot中删除的服务工作者。如何从我的网站和Chrome卸载服务工作者,以便可以重新登录我的网站?

我已将问题归结为Service Work的缓存机制,我只想暂时将其删除,直到有时间对其进行调试为止。我正在使用的登录脚本重定向到Google的服务器,以便他们登录其Google帐户。但是我从login.php页面获得的只是一条ERR_FAILED消息。


2
我在Firefox中有同样的问题。
哥斯达黎加

Answers:


309

以编程方式删除服务人员

您可以通过编程方式删除服务工作者,如下所示:

navigator.serviceWorker.getRegistrations().then(function(registrations) {
 for(let registration of registrations) {
  registration.unregister()
} })

Docs:getRegistrations注销

通过用户界面删除服务人员

您还可以在Chrome Devtools中的“应用程序”标签下删除服务工作者。


2
我必须添加“使用严格”;在此代码使之起作用之前。
codeKonami '16

8
是否有任何时间基于此?假设某个用户曾经访问过,注册了该工作人员,但此后再也没有回来,我是否需要将该代码段永久保存在我们的代码库中,以防万一?
loganfsmyth,2016年


10
我有一篇博客文章对此进行了评论,并指出
Chris Love

3
那有什么帮助?该页面已由安装的工作程序已缓存,用户将永远不会获取您的新脚本。
riv

107

您也可以转到URL:chrome:// serviceworker-internals /,然后从那里注销服务人员。


9
您可以在开发控制台中键入此命令,以一次注销所有注册。document.querySelectorAll(".unregister").forEach(item=>item.click())
森本

但是,如果您还需要注销其他访问者(朋友,用户,项目经理等),则上面的答案(由Daniel Herr提供)更有效。您还可以获得Firefox,Edge和Safari,以及iOS,Android,macOS和Windows 10风格的每种版本都可以进行测试。
史蒂文·文蒂米利亚

$$('。unregister')。forEach(item => item.click())
Travnikov.dev

37

您可以通过Chrome开发者工具以及以编程方式执行此操作。

  1. 通过键入查找所有正在运行的实例或服务工作者

    chrome:// serviceworker-internals /

    在新选项卡中,然后选择要注销的服务工作人员。

  2. 打开开发人员工具(F12),然后选择“应用程序”。然后

    选择清除存储->取消注册服务人员

    要么

    选择服务人员->选择重新加载时更新

  3. 以编程方式

if(window.navigator && navigator.serviceWorker) {
  navigator.serviceWorker.getRegistrations()
  .then(function(registrations) {
    for(let registration of registrations) {
      registration.unregister();
    }
  });
}


22

在Google Chrome浏览器中,您可以转到开发人员工具(F12)->应用程序->服务工作者,然后从该特定域的列表中注销服务工作者。

屏幕截图

此方法在站点的开发模式下有效,并且大多数情况下localhost可以在其他模型的开发中运行。


5

您应该在设备中检测两个API:getRegistrationsgetRegistration。服务工作者并非在所有平台上都有一套独特的API。例如,某些浏览器只有一个navigator.serviceWorker.getRegistration,没有navigator.serviceWorker.getRegistrations。因此,您应该同时考虑两者。


3

仅供参考,如果您使用的是MacOS Safari浏览器,则有一种方法可以强制注销服务工作者(Safari 12.1的步骤和图像):

  1. Safari>首选项...>隐私>管理网站数据… Safari偏好设置:隐私

  2. 输入域名(例如“ localhost”),然后单击“删除” Safari偏好设置:隐私:管理网站数据

注意:除了服务工作者之外,这还将删除该域的所有缓存,cookie和数据库。


如果通过专用窗口安装了服务工作者,则这似乎不起作用。
阿里斯

3

除了给出的正确答案之外,如果您还想删除软件缓存,则可以调用以下方法:

if ('caches' in window) {
    caches.keys()
      .then(function(keyList) {
          return Promise.all(keyList.map(function(key) {
              return caches.delete(key);
          }));
      })
}


本文的 更多信息(段落:“注销服务工作者”)


通过浏览器的另一种可能性是访问“高速缓存存储”部分,然后单击“清除站点数据”按钮:

在此处输入图片说明


0

安全地卸载Service Worker

if ('serviceWorker' in navigator) {
      navigator.serviceWorker.getRegistrations().then(function (registrations) {
        for (const registration of registrations) {
          // unregister service worker
          console.log('serviceWorker unregistered');
          registration.unregister();
        }
      });
    }

0

检测服务人员:

navigator.serviceWorker.controller

删除服务人员的代码:

navigator.serviceWorker.getRegistrations()
  .then(registrations => {
    registrations.forEach(registration => {
      registration.unregister();
    })
  });

  navigator.serviceWorker.getRegistrations().then(function(registrations) {
   for(let registration of registrations) {
    registration.unregister()
  } })

  if(window.navigator && navigator.serviceWorker) {
    navigator.serviceWorker.getRegistrations()
    .then(function(registrations) {
      for(let registration of registrations) {
        registration.unregister();
      }
    });
  }

  if ('caches' in window) {
      caches.keys()
        .then(function(keyList) {
            return Promise.all(keyList.map(function(key) {
                return caches.delete(key);
            }));
        })
  }

  if ('serviceWorker' in navigator) {
        navigator.serviceWorker.getRegistrations().then(function (registrations) {
          for (const registration of registrations) {
            // unregister service worker
            console.log('serviceWorker unregistered');
            registration.unregister();

            setTimeout(function(){
              console.log('trying redirect do');
              window.location.replace(window.location.href); // because without redirecting, first time on page load: still service worker will be available
            }, 3000);
          }
        });
      }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.