Ich wollte einige der anderen Antworten hier erweitern und dies unter dem Gesichtspunkt betrachten: "Welche Strategien kann ich anwenden, wenn ich einen Servicemitarbeiter in die Produktion einbringe, um sicherzustellen, dass ich die erforderlichen Änderungen vornehmen kann?" Diese Änderungen können das Beheben kleinerer Fehler umfassen, die Sie in der Produktion entdecken, oder das Neutralisieren des Servicemitarbeiters aufgrund eines unüberwindlichen Fehlers - eines sogenannten "Kill-Schalters".
Nehmen wir für diese Antwort an, Sie rufen an
navigator.serviceWorker.register('service-worker.js');
auf Ihren Seiten, dh Ihre Service-Worker-JavaScript-Ressource ist service-worker.js
. ( Siehe unten, wenn Sie nicht sicher sind, welche URL des Service Workers genau verwendet wurde - möglicherweise, weil Sie dem Service Worker-Skript einen Hash oder Versionsinformationen hinzugefügt haben. )
Die Frage läuft darauf hinaus, wie Sie das ursprüngliche Problem in Ihrem service-worker.js
Code lösen . Wenn es sich um eine kleine Fehlerbehebung handelt, können Sie die Änderung natürlich einfach vornehmen und sie erneut service-worker.js
in Ihrer Hosting-Umgebung bereitstellen . Wenn es keine offensichtlichen Fehler zu beheben ist, und Sie nicht möchten , dass Ihre Benutzer, die den Buggy - Service Arbeitnehmer Code zu lassen , während Sie die Zeit , um Arbeit aus einer Lösung nehmen, ist es eine gute Idee , eine möglichst einfach zu halten, no-op service-worker.js
handlich , wie die Folgendes:
self.addEventListener('install', () => {
self.skipWaiting();
});
Das sollte alles sein, was Ihr No-Op service-worker.js
enthalten muss. Da kein fetch
Handler registriert ist, werden alle Navigations- und Ressourcenanforderungen von kontrollierten Seiten direkt an das Netzwerk weitergeleitet, sodass Sie das gleiche Verhalten erhalten, ohne das Sie ohne einen Servicemitarbeiter auskommen würden.
Zusätzliche Schritte
Es ist möglich, weiter zu gehen und alles, was mit der Cache-Speicher-API gespeichert wurde, zwangsweise zu löschen oder die Registrierung des Service-Workers explizit vollständig aufzuheben. In den meisten Fällen ist dies wahrscheinlich ein Overkill. Die Befolgung der oben genannten Empfehlungen sollte ausreichen, um Sie in einen Zustand zu versetzen, in dem Ihre aktuellen Benutzer das erwartete Verhalten erhalten, und Sie können Updates erneut bereitstellen, sobald Sie Ihre Fehler behoben haben . Das Starten eines No-Op-Service-Workers ist mit einem gewissen Aufwand verbunden. Sie können also die Registrierung des Service-Workers aufheben, wenn Sie nicht vorhaben, einen aussagekräftigen Service-Worker-Code erneut bereitzustellen.
Wenn Sie sich bereits in einer Situation befinden, in der Sie service-worker.js
mit HTTP-Caching-Direktiven arbeiten, die eine Lebensdauer haben, die länger ist, als Ihre Benutzer warten können, denken Sie daran, dass Shift + Reload in Desktop-Browsern das Neuladen der Seite außerhalb von erzwingt Kontrolle der Servicemitarbeiter. Nicht jeder Benutzer weiß, wie das geht, und auf Mobilgeräten ist dies jedoch nicht möglich. Verlassen Sie sich also nicht auf Shift + Reload als praktikablen Rollback-Plan.
Was ist, wenn Sie die URL des Servicemitarbeiters nicht kennen?
Bei den obigen Informationen wird davon ausgegangen service-worker.js
, dass Sie die URL des Servicemitarbeiters kennen sw.js
- oder etwas anderes, das effektiv konstant ist. Aber was ist, wenn Sie eine Art Versions- oder Hash-Information in Ihr Service Worker-Skript aufgenommen haben, wie z service-worker.abcd1234.js
.
Versuchen Sie zunächst, dies in Zukunft zu vermeiden - dies verstößt gegen Best Practices . Wenn Sie jedoch bereits eine Reihe versionierter Service-Worker-URLs bereitgestellt haben und die Dinge für alle Benutzer deaktivieren müssen , unabhängig davon, welche URL sie möglicherweise registriert haben, gibt es einen Ausweg.
Jedes Mal, wenn ein Browser eine Anforderung für ein Service Worker-Skript stellt, unabhängig davon, ob es sich um eine Erstregistrierung oder eine Aktualisierungsprüfung handelt, wird ein HTTP-Anforderungsheader namens aufgerufen Service-Worker:
.
Angenommen, Sie haben die volle Kontrolle über Ihren Back-End-HTTP-Server, können Sie eingehende Anforderungen auf das Vorhandensein dieses Service-Worker:
Headers überprüfen und unabhängig von der Anforderungs-URL immer mit der Skriptantwort Ihres No-Op-Service-Workers antworten.
Die Besonderheiten der Konfiguration Ihres Webservers variieren von Server zu Server.
Der Clear-Site-Data: Antwortheader
Ein letzter Hinweis: Einige Browser löschen automatisch bestimmte Daten und heben möglicherweise die Registrierung von Servicemitarbeitern auf, wenn ein spezieller HTTP-Antwortheader als Teil einer Antwort zurückgegeben wird : Clear-Site-Data:
.
Das Festlegen dieses Headers kann hilfreich sein, wenn Sie versuchen, eine fehlerhafte Service Worker-Bereitstellung wiederherzustellen. Kill-Switch-Szenarien sind in der Spezifikation der Funktion als Beispiel für einen Anwendungsfall enthalten.
Es ist wichtig , die zu überprüfen Browser - Unterstützung Geschichte für , Clear-Site-Data:
bevor Sie verlassen sich ausschließlich auf sie als Kill-Switch. Ab Juli 2019 wird es nicht in 100% der Browser unterstützt, die Servicemitarbeiter unterstützen. Daher ist es derzeit am sichersten, es Clear-Site-Data:
zusammen mit den oben genannten Techniken zu verwenden, wenn Sie Bedenken haben, sich in allen Browsern von einem fehlerhaften Servicemitarbeiter zu erholen.