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

我已经将问题追溯到Service Work的缓存机制,现在我只想删除它,直到有时间调试它。我使用的登录脚本重定向到谷歌的服务器,让他们登录到他们的谷歌帐户。但是我从login.php页面得到的只是一条ERR_FAILED消息。


当前回答

典型的JavaScript循环与所有东西兼容:

navigator.serviceWorker.getRegistrations().then(function(registrations) {
    var registrationslength = registrations.length;
    for (var i = 0; i < registrationslength; i++) {
        registrations[i].unregister();
    }
})

其他回答

对我来说,我只是用一个新的不存在的scope service worker来代替旧的scope service worker,

ServiceWorker: {
        events: true,
        // what range of URLs a service worker can control. Use a nonexistent path to disable ServiceWorker
        scope: '/disable-service-worker/',
      },

对于app.js,我添加了以下代码来注销旧的sw:

if ('serviceWorker' in navigator) {
  navigator.serviceWorker.getRegistrations().then(registrations => {
    for (const registration of registrations) {
      // keep only serviceWorker which scope is /disable-service-worker/, The purpose is to make serviceWorker useless
      if (registration.scope.includes('/disable-service-worker/') === false) {
        registration.unregister()
      }
    }
  });
  // clear cache of service worker
  caches.keys().then(keyList => {
    return Promise.all(
      keyList.map(key => {
        return caches.delete(key);
      }),
    );
  });
}

其他答案都添加代码到实时网站,以删除service worker。然而,我不想让这些活代码永远运行,所以我开发了一个解决方案,从service worker本身工作。步骤如下,我在我的博客上发布了更多的细节和解释。

删除注册service worker的代码。 将service worker脚本替换为以下文件。新代码必须从前一个service worker所在的相同URL中可用。如果您过去有多个service worker url,您应该在所有这些url上复制代码。

console.log("Cleanup Service Worker Starting");

caches.keys()
    .then(keys =>
        Promise.all(
            keys.map(async key => console.log("caches.delete", key, await caches.delete(key)))))
    .then(async () => {
        console.log("registration.unregister", await registration.unregister());
    })
    .then(() => console.log("DONE"))
    .catch(console.error);

这段代码相当直截了当。首先它删除所有缓存,然后注销自己。

用户的浏览器会在下次加载你的网站时自动检查更新的service worker,或者在最后一次service worker检查后24小时内自动检查下一个事件。这意味着现有用户将在下次访问时运行此清理。

除了已经给出的正确答案之外,如果你还想删除SW缓存,你可以调用以下方法:

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

更多内容请参见本文(段落:“注销服务人员”)

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

仅供参考,如果你使用的是MacOS Safari浏览器,有一种方法可以强制注销service worker (Safari 12.1的步骤和图片):

Safari >首选项…>隐私>管理网站数据… 输入域名(例如。'localhost'),点击“删除”

注意:除了service worker之外,这还将删除该域的所有缓存、cookie和数据库。

以编程方式删除Service worker:

你可以像这样通过编程方式删除service worker:

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

文档:getRegistrations, unregister

通过用户界面移除Service worker

你也可以在Chrome Devtools的Application标签下删除service worker。