Como desinstalo um Service Worker?

161

Depois de excluir /serviceworker.jsdo meu diretório raiz, o Chrome ainda executa o trabalhador do serviço que eu removi da minha raiz da web. Como desinstalo o técnico de serviço do meu site e do Chrome para que eu possa fazer login novamente no meu site?

Eu rastreei o problema até o mecanismo de cache do Service Work e só quero removê-lo por enquanto até ter tempo para depurá-lo. O script de login que estou usando redireciona para os servidores do Google para que eles acessem a conta do Google. Mas tudo o que recebo da página login.php é uma ERR_FAILEDmensagem.

Mark Tomlin
fonte
2
Eu tenho o mesmo problema no Firefox.
Costa

Respostas:

309

Remoção de trabalhadores de serviço programaticamente

Você pode remover trabalhadores de serviço programaticamente assim:

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

Documentos: getRegistrations , cancelar registro

Remoção de trabalhadores de serviço por meio da interface do usuário

Você também pode remover trabalhadores de serviço na guia Aplicativo no Chrome Devtools.

Daniel Herr
fonte
2
Eu tive que adicionar "use strict"; antes desse código para fazê-lo funcionar.
usar o seguinte código
8
Existe a qualquer momento baseado em tempo em torno disso? Digamos que um usuário visitou uma vez, registrou o trabalhador e não voltou mais desde então, preciso manter esse trecho em nossa base de código para sempre?
Loganfsmyth 02/08/19
10
Eu tenho um post rever esta e outras trabalhador do serviço de remover / desinstalar opções love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Amor
3
Como isso ajudaria? A página já está em cache pelo trabalhador instalado e seu novo script nunca será buscado pelos usuários.
riv
107

Você também pode acessar a URL: chrome: // serviceworker-internals / e cancelar o registro de um serviceworker a partir daí.

k00k
fonte
9
Você pode digitar isso no console dev para cancelar o registro de todos eles de uma só vez. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon
No entanto, se você tem outros visitantes que também precisam se registrar (amigos, usuários, gerentes de projeto etc.), a resposta acima (de Daniel Herr) é mais uma solução eficaz. Você também tem o Firefox, Edge e Safari, nos sabores iOS, Android, macOS e Windows 10 para testar.
Steven Ventimiglia
$$ ('. unregister'). forEach (item => item.click ())
Travnikov.dev 11/03
37

Você pode fazer isso usando a Ferramenta de desenvolvedor do Chrome e também de forma programática .

  1. Encontre todas as instâncias em execução ou trabalhador de serviço digitando

    chrome: // serviceworker-internals /

    em uma nova guia e selecione o técnico que deseja cancelar o registro.

  2. Abra as Ferramentas do desenvolvedor (F12) e selecione Aplicativo. Qualquer então

    Selecione Limpar Armazenamento -> Cancelar Registro do Trabalhador de Serviço

    ou

    Selecione Trabalhadores do Serviço -> Escolha Atualizar ao Recarregar

  3. Programaticamente

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

Sakshi Nagpal
fonte
22

No Google Chrome, você pode acessar Ferramentas do desenvolvedor (F12) -> Aplicativo -> Trabalhador de serviço e cancelar o registro dos trabalhadores de serviço da lista desse domínio específico.

Captura de tela

Esse método é eficaz no modo de desenvolvimento de um site e, principalmente, eles são executados nos localhostquais você pode precisar para o desenvolvimento de outros projetos.

Asim KT
fonte
5

Você deve detectar duas API em seus dispositivos: getRegistrations e getRegistration . O trabalhador do serviço não possui um conjunto exclusivo de APIs em todas as plataformas. Por exemplo, alguns navegadores têm apenas um navigator.serviceWorker.getRegistration, não navigator.serviceWorker.getRegistrations. Então você deve considerar com ambos.

GuoX
fonte
3

Para sua informação, caso esteja usando o navegador MacOS Safari , existe uma maneira de cancelar o registro forçado de um trabalhador de serviço (etapas e imagens para o Safari 12.1):

  1. Safari> Preferências ...> Privacidade> Gerenciar dados do site ... Preferências do Safari: Privacidade

  2. Digite o nome do domínio (ex. 'Localhost'), clique em "Remover" Preferências do Safari: Privacidade: gerenciar dados do site

Nota: Além dos funcionários de serviço, isso também apagará todos os caches, cookies e bancos de dados desse domínio.

terrymorse
fonte
Parece que isso não funcionará se os trabalhadores do serviço foram instalados por meio de uma janela privada.
aris
3

Além das respostas já corretas fornecidas, se você também deseja excluir o cache do SW, pode invocar o seguinte método:

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


Mais neste artigo (parágrafo: "Cancelar o registro de um trabalhador de serviço")


Outra possibilidade, através do navegador, é acessando a seção "Armazenamento em cache" e clique no botão "Limpar dados do site":

insira a descrição da imagem aqui

Francesco
fonte
0

desinstalar com segurança o 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();
        }
      });
    }
Pankaj Rupapara
fonte
0

para detectar trabalhador de serviço:

navigator.serviceWorker.controller

Código para exclusão do trabalhador de serviço:

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