Häufigkeit der JavaScript-Aktualisierung durch Servicemitarbeiter (alle 24 Stunden?)

69

Gemäß diesem Dokument auf MDN :

Danach wird es etwa alle 24 Stunden heruntergeladen. Es wird möglicherweise häufiger heruntergeladen, muss jedoch alle 24 Stunden heruntergeladen werden, um zu verhindern, dass fehlerhafte Skripte zu lange nerven.

Gilt das auch für Firefox und Chrome? ODER erfolgt die Aktualisierung auf Service Worker-Javascript nur, wenn der Benutzer zur Site navigiert?

Shailesh Mishra
quelle

Antworten:

171

Hinweis: Ab Firefox 57 und Chrome 68 sowie den Versionen von Safari und Edge, die Service Worker unterstützen, wurde das Standardverhalten geändert, um die aktualisierte Service Worker-Spezifikation zu berücksichtigen . In diesen Browsern werden HTTP-Cache-Anweisungen standardmäßig ignoriert, wenn das Service Worker-Skript auf Aktualisierungen überprüft wird. Die folgende Beschreibung gilt weiterhin für frühere Versionen von Chrome und Firefox.

Jedes Mal, wenn Sie zu einer neuen Seite navigieren, die in den Bereich eines Servicemitarbeiters fällt, stellt Chrome eine Standard-HTTP-Anforderung für die JavaScript-Ressource, die an den navigator.serviceWorker.register()Aufruf übergeben wurde. Nehmen wir an, es heißt service-worker.js. Diese Anfrage wird nur in Verbindung mit einer Navigation gestellt oder wenn ein Servicemitarbeiter beispielsweise über ein pushEreignis geweckt wird . Es gibt keinen Hintergrundprozess, bei dem jedes Service Worker-Skript alle 24 Stunden neu abgerufen wird, oder etwas, das so automatisiert ist.

Diese HTTP-Anforderung entspricht mit einer Ausnahme (die im nächsten Absatz behandelt wird) den Standard- HTTP-Cache-Anweisungen . Wenn Ihr Server beispielsweise geeignete HTTP-Antwortheader festgelegt hat, die angeben, dass die zwischengespeicherte Antwort 1 Stunde lang verwendet werden soll, wird die Anforderung des Browsers innerhalb der nächsten Stunde service-worker.jsvom Cache des Browsers erfüllt. Beachten Sie, dass es sich nicht um die Cache-Speicher-API handelt , die in dieser Situation nicht relevant ist, sondern um das Standard-HTTP-Caching des Browsers .

Die einzige Ausnahme zu den Standardregeln für das HTTP-Caching, und hier kommt die 24-Stunden-Sache ins Spiel, ist, dass Browser immer zum Netzwerk gehen, wenn das Alter des service-worker.jsEintrags im HTTP-Cache mehr als 24 Stunden beträgt. Funktionell gibt es also keinen Unterschied bei der Verwendung max-agevon 1 Tag, 1 Woche oder 1 Jahr - sie werden alle so behandelt, als wäre max-agees 1 Tag.

Browser-Anbieter möchten sicherstellen, dass Entwickler nicht versehentlich einen "defekten" oder fehlerhaften Buggy auf den Markt bringen service-worker.js, der innerhalb eines max-ageJahres gewartet wird, sodass die Benutzer über einen längeren Zeitraum hinweg möglicherweise ein dauerhaftes, defektes Web-Erlebnis haben. (Sie können sich nicht darauf verlassen, dass Ihre Benutzer wissen, dass sie ihre Site-Daten löschen oder die Site neu laden müssen.)

Einige Entwickler bevorzugen es, ihre service-worker.jsAntworten explizit mit Antwortheadern zu versehen, wodurch das gesamte HTTP-Caching deaktiviert wird. Dies bedeutet, dass service-worker.jsfür jede Navigation eine Netzwerkanforderung gestellt wird. Ein anderer Ansatz könnte darin bestehen, einen sehr, sehr kurzen zu verwendenmax-age Zeit - etwa eine Minute - zu verwenden, um ein gewisses Maß an Drosselung bereitzustellen, falls ein einzelner Benutzer eine sehr große Anzahl schneller Navigationen durchführt. Wenn Sie Anfragen wirklich minimieren möchten und sicher sind, dass Sie Ihre nicht service-worker.jsbald aktualisieren werden , können Sie eine max-age24-Stunden- Frist festlegen. Ich würde jedoch empfehlen, bei der Off-Chance, die Sie unerwartet für eine erneute Bereitstellung benötigen, eine kürzere Option zu wählen.

Jeff Posnick
quelle
2
danke Jeff für die nette Erklärung. klärte alle Fragen.
Shailesh Mishra
1
Was passiert, wenn ein Service-Worker-Anruf beim Abrufen abgefangen und zwischengespeichert wird? Läuft das auch nach einem Tag ab?
Pankaj
3
Der fetchEreignishandler eines Service Workers wird nicht ausgelöst, wenn die Seite ein Service Worker-Skript zur Registrierung anfordert.
Jeff Posnick
5
> Sie werden alle so behandelt, als ob das Höchstalter 1 Tag wäre. Besiegt dies nicht so ziemlich den Zweck der Servicemitarbeiter? Wenn meine App 24 Stunden lang nicht mit dem Internet verbunden ist, funktioniert sie nicht mehr und ich kann nichts dagegen tun. Alles nur, um Benutzern zu ersparen, dass sie wissen müssen, wie sie ihren Cache leeren, oder um Entwicklern das Hinzufügen eines Cache-Buster zu ihren URLs zu ersparen. Vermisse ich etwas
Simon
8
"Wenn meine App 24 Stunden lang nicht mit dem Internet verbunden ist, funktioniert sie nicht mehr" ist nicht korrekt. Ihre zuvor zwischengespeicherten Inhalte und zuvor zwischengespeicherten Service Worker-JS-Dateien werden weiterhin verwendet, wenn Sie offline sind. Dieser Beitrag enthält Details dazu, wann Sie online sind und wie oft Updates dann überprüft werden.
Jeff Posnick