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

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


当前回答

如果你的服务人员不让你更新文件。你需要用下面的代码替换serviceworker文件(sw.js / serviceworker .js):

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))
    });
});

源在这里

其他回答

其他答案都添加代码到实时网站,以删除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小时内自动检查下一个事件。这意味着现有用户将在下次访问时运行此清理。

此代码与Internet Explorer兼容:

if (navigator.serviceWorker) {
    navigator.serviceWorker.getRegistrations().then(                
        function(registrations) {
            for (let idx in registrations) {
                registrations[idx].unregister()
            }
        })
}

IE不支持'for…and的意思是…的“构造可能导致”“SCRIPT1004: Expected”错误

它也可以在Chrome通过应用程序选项卡:

您应该在设备中检测到两个API: getRegistrations和getregiregistration。service-worker并不是在所有平台上都有一组唯一的api。例如,一些浏览器只有navigator.serviceWorker。getregiregistration,没有navigator.serviceWorker.getRegistrations。所以你应该两者都考虑。

在Chrome中打开

chrome: / / serviceworker-internals / ?devtools

然后在控制台中F12 $ $ (' .unregister”)。forEach(b => b.click())