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.


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.


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í.


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


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.


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.


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.


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


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

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);
          }
        });
      }
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.