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

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


当前回答

你可以通过Chrome开发工具以及编程来做到这一点。

通过键入查找所有正在运行的实例或service worker chrome: / / serviceworker-internals / 在一个新的选项卡中,然后选择要注销的serviceworker。 打开开发人员工具(F12)并选择应用程序。然后要么 选择“Clear Storage”->取消注册service worker 或 选择Service Workers ->选择“重新加载时更新” 编程

如果窗口。navigator && navigator. serviceworker) { navigator.serviceWorker.getRegistrations () 不要犹豫(函数(注册){ 为(让登记注册){ registration.unregister (); } }); }

其他回答

在谷歌Chrome中,您可以进入开发人员工具(F12) ->应用程序-> Service worker,并从特定域的列表中注销Service worker。

这种方法在网站的开发模式中是有效的,大多数情况下它们运行在本地主机上,这是你可能需要其他项目的开发。

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

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

检测service worker:

navigator.serviceWorker.controller

删除service worker的代码:

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

打开此页面:chrome://serviceworker-internals,单击“取消注册”按钮。

如果你想注销所有的service worker,打开开发人员工具并在上面的页面上运行这段代码。

document.querySelectorAll("button.unregister").forEach(item=>{ item.click()})

对我来说,我只是用一个新的不存在的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);
      }),
    );
  });
}