Wie deinstalliere ich einen Service Worker?

161

Nach dem Löschen /serviceworker.jsaus meinem Stammverzeichnis führt Chrome weiterhin den Service Worker aus, den ich von meiner Webroot entfernt habe. Wie deinstalliere ich den Service Worker von meiner Website und Chrome, damit ich mich wieder auf meiner Website anmelden kann?

Ich habe das Problem auf den Cache-Mechanismus von Service Work zurückgeführt und möchte es erst einmal entfernen, bis ich Zeit habe, es zu debuggen. Das Anmeldeskript, das ich verwende, leitet auf die Server von Google weiter, damit diese sich bei ihrem Google-Konto anmelden können. Aber alles, was ich von der Seite login.php bekomme, ist eine ERR_FAILEDNachricht.

Mark Tomlin
quelle
2
Ich habe das gleiche Problem in Firefox.
Costa

Antworten:

309

Servicemitarbeiter programmgesteuert entfernen

Sie können Servicemitarbeiter programmgesteuert wie folgt entfernen:

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

Docs: getRegistrations , austragen

Entfernen von Servicemitarbeitern über die Benutzeroberfläche

Sie können Servicemitarbeiter auch auf der Registerkarte "Anwendung" in Chrome Devtools entfernen.

Daniel Herr
quelle
2
Ich musste "use strict" hinzufügen; vor diesem Code, damit es funktioniert.
CodeKonami
8
Gibt es zu irgendeinem Zeitpunkt eine zeitliche Grundlage dafür? Angenommen, ein Benutzer hat ihn einmal besucht, den Mitarbeiter registriert und ist seitdem nicht mehr zurückgekehrt. Muss ich dieses Snippet für immer in unserer Codebasis behalten, nur für den Fall?
Loganfsmyth
10
Ich habe einen Blog-Beitrag, der diese und andere Optionen zum Entfernen / Deinstallieren von Service-Mitarbeitern überprüft. Love2dev.com/blog/how-to-uninstall-a-service-worker
Chris Love
3
Wie würde das helfen? Die Seite wird bereits vom installierten Worker zwischengespeichert, und Ihr neues Skript wird von den Benutzern niemals abgerufen.
Riv
107

Sie können auch zur URL gehen : chrome: // serviceworker-internals / und die Registrierung eines Servicearbeiters von dort aufheben.

k00k
quelle
9
Sie können dies in die Entwicklungskonsole eingeben, um die Registrierung aller auf einen Schlag aufzuheben. document.querySelectorAll(".unregister").forEach(item=>item.click())
Senbon
Wenn Sie jedoch andere Besucher haben, die Sie ebenfalls abmelden müssen (Freunde, Benutzer, Projektmanager usw.), ist die obige Antwort (von Daniel Herr) eher eine effektive Lösung. Sie haben auch Firefox, Edge und Safari in den Varianten iOS, Android, MacOS und Windows 10 zum Testen.
Steven Ventimiglia
$$ ('. unregister'). forEach (item => item.click ())
Travnikov.dev
37

Sie können dies sowohl über das Chrome Developer Tool als auch programmgesteuert tun .

  1. Suchen Sie alle laufenden Instanzen oder Servicemitarbeiter, indem Sie Folgendes eingeben

    chrom: // serviceworker-internals /

    Klicken Sie in einer neuen Registerkarte auf den Servicemitarbeiter, dessen Registrierung Sie aufheben möchten.

  2. Öffnen Sie die Entwicklertools (F12) und wählen Sie Anwendung aus. Dann entweder

    Wählen Sie Speicher löschen -> Service Worker abmelden

    oder

    Wählen Sie Service Worker -> Wählen Sie Update beim erneuten Laden

  3. Programmatisch

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

Sakshi Nagpal
quelle
22

In Google Chrome können Sie gehen Entwicklertools (F12) -> Anwendung -> Service Arbeitnehmer und austragen der Service - Mitarbeiter aus der Liste für die jeweilige Domäne.

Bildschirmfoto

Diese Methode ist im Entwicklungsmodus einer Site effektiv und wird meistens ausgeführt, auf localhostder Sie möglicherweise für die Entwicklung anderer Projekte benötigen.

Asim KT
quelle
5

Sie sollten zwei APIs auf Ihren Geräten erkennen: getRegistrations und getRegistration . Der Service-Worker verfügt nicht auf allen Plattformen über einen eindeutigen Satz von APIs. Zum Beispiel haben einige Browser nur ein navigator.serviceWorker.getRegistration, nein navigator.serviceWorker.getRegistrations. Sie sollten also mit beiden überlegen.

GuoX
quelle
3

Zu Ihrer Information: Wenn Sie den MacOS Safari- Browser verwenden, gibt es eine Möglichkeit, die Registrierung eines Servicemitarbeiters zwangsweise aufzuheben (Schritte und Bilder für Safari 12.1):

  1. Safari> Einstellungen ...> Datenschutz> Website-Daten verwalten ... Safari-Einstellungen: Datenschutz

  2. Geben Sie den Domainnamen ein (z. B. 'localhost') und klicken Sie auf "Entfernen". Safari-Einstellungen: Datenschutz: Verwalten von Website-Daten

Hinweis: Zusätzlich zu den Servicemitarbeitern werden dadurch auch alle Caches, Cookies und Datenbanken für diese Domain gelöscht.

Frottee
quelle
Dies funktioniert anscheinend nicht, wenn die Servicemitarbeiter über ein privates Fenster installiert wurden.
Aris
3

Zusätzlich zu den bereits korrekten Antworten können Sie, wenn Sie auch den SW-Cache löschen möchten, die folgende Methode aufrufen:

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


Mehr in diesem Artikel (Absatz: "Registrierung eines Servicemitarbeiters aufheben")


Eine andere Möglichkeit über den Browser besteht darin, auf den Abschnitt "Cache-Speicher" zuzugreifen und auf die Schaltfläche "Site-Daten löschen" zu klicken:

Geben Sie hier die Bildbeschreibung ein

Francesco
quelle
0

Deinstallieren Sie Service Worker sicher

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
quelle
0

Servicemitarbeiter erkennen:

navigator.serviceWorker.controller

Code zum Löschen des Servicemitarbeiters:

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
quelle