Jak odinstalować narzędzie Service Worker?

161

Po usunięciu /serviceworker.jsz mojego katalogu głównego Chrome nadal uruchamia narzędzie Service Worker, które usunąłem z mojego webroota. Jak odinstalować program Service Worker z mojej witryny internetowej i przeglądarki Chrome, aby móc ponownie zalogować się do mojej witryny internetowej?

Wyśledziłem problem do mechanizmu pamięci podręcznej usługi Service Work i chcę go teraz usunąć, dopóki nie będę miał czasu na debugowanie. Skrypt logowania, którego używam, przekierowuje na serwery Google, aby mogli zalogować się na swoje konto Google. Ale wszystko, co otrzymuję ze strony login.php, to ERR_FAILEDwiadomość.

Mark Tomlin
źródło
2
Mam ten sam problem w przeglądarce Firefox.
Costa

Odpowiedzi:

309

Programowe usuwanie elementów Service Workers

Możesz usunąć Service Workery programowo w następujący sposób:

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

Dokumenty: getRegistrations , unregister

Usuwanie Service Workers za pomocą interfejsu użytkownika

Możesz także usunąć pracowników usługi na karcie Aplikacja w Chrome Devtools.

Daniel Herr
źródło
2
Musiałem dodać „użyj ścisłego”; przed tym kodem, aby działał.
codeKonami
8
Czy istnieje czas wokół tego? Powiedz, że użytkownik odwiedził raz, zarejestrował pracownika i od tamtej pory nie wrócił. Czy na wszelki wypadek muszę przechowywać ten fragment kodu w naszej bazie kodu na zawsze?
loganfsmyth
3
Wersja pełna
mrienstra
10
Mam posta na blogu, w którym recenzuję ten i inne pracownik serwisu, opcje usuwania / odinstalowywania love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love,
3
Jak by to pomogło? Strona jest już buforowana przez zainstalowanego pracownika, a Twój nowy skrypt nigdy nie zostanie pobrany przez użytkowników.
riv
107

Możesz również przejść do adresu URL: chrome: // serviceworker-internals / i wyrejestrować pracownika serwisu.

k00k
źródło
9
Możesz wpisać to w konsoli programisty, aby wyrejestrować je wszystkie za jednym zamachem. document.querySelectorAll(".unregister").forEach(item=>item.click())
senbon
Jeśli jednak masz innych gości, których również musisz wyrejestrować (znajomych, użytkowników, kierowników projektów itp.), Powyższa odpowiedź (autorstwa Daniela Herr) jest bardziej skutecznym rozwiązaniem. Masz również Firefox, Edge i Safari, a także wersje iOS, Android, macOS, Windows 10 do przetestowania.
Steven Ventimiglia
$$ ('. unregister'). forEach (item => item.click ())
Travnikov.dev
37

Możesz to zrobić za pomocą narzędzia Chrome Developer Tool, a także programowo .

  1. Znajdź wszystkie uruchomione instancje lub elementy Service Worker, wpisując

    chrome: // serviceworker-internals /

    w nowej karcie, a następnie wybierz pracownika serwisu, którego chcesz wyrejestrować.

  2. Otwórz narzędzia deweloperskie (F12) i wybierz aplikację. Wtedy albo

    Wybierz Wyczyść pamięć -> Wyrejestruj pracownika serwisu

    lub

    Wybierz Service Workers -> Wybierz Update on Reload

  3. Programowo

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

Sakshi Nagpal
źródło
22

W Google Chrome możesz przejść do Narzędzia programistyczne (F12) -> Aplikacja -> Pracownik serwisu i wyrejestrować pracowników serwisu z listy dla tej konkretnej domeny.

Zrzut ekranu

Ta metoda jest skuteczna w trybie deweloperskim witryny i przeważnie działają na localhostktórych możesz potrzebować do rozwoju innych projektów.

Asim KT
źródło
5

Powinieneś wykryć dwa API na swoich urządzeniach: getRegistrations i getRegistration . Service-Worker nie ma unikalnego zestawu interfejsów API na wszystkich platformach. Na przykład niektóre przeglądarki mają tylko rozszerzenie navigator.serviceWorker.getRegistration, nie navigator.serviceWorker.getRegistrations. Więc powinieneś rozważyć oba.

GuoX
źródło
3

Do Twojej wiadomości, jeśli używasz przeglądarki MacOS Safari , istnieje jeden sposób na wymuszenie wyrejestrowania pracownika serwisu (instrukcje i obrazy dla Safari 12.1):

  1. Safari> Preferencje ...> Prywatność> Zarządzaj danymi witryny… Preferencje Safari: Prywatność

  2. Wpisz nazwę domeny (np. „Localhost”), kliknij „Usuń” Preferencje Safari: Prywatność: zarządzaj danymi witryny

Uwaga: Oprócz pracowników usługowych spowoduje to również usunięcie wszystkich pamięci podręcznych, plików cookie i baz danych dla tej domeny.

terrymorse
źródło
Wygląda na to, że to nie działa, jeśli mechanizmy Service Worker zostały zainstalowane przez okno prywatne.
aris
3

Oprócz podanych już poprawnych odpowiedzi, jeśli chcesz również usunąć pamięć podręczną SW, możesz wywołać następującą metodę:

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


Więcej w tym artykule (akapit: „Wyrejestruj pracownika serwisu”)


Inną możliwością, poprzez przeglądarkę, jest przejście do sekcji „Pamięć podręczna” i kliknięcie przycisku „Wyczyść dane witryny”:

wprowadź opis obrazu tutaj

Francesco
źródło
0

bezpiecznie odinstaluj 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
źródło
0

aby wykryć pracownika serwisu:

navigator.serviceWorker.controller

Kod do usunięcia pracownika serwisu:

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);
          }
        });
      }
Istotny
źródło