Wie aktualisiert man den Service-Arbeiter-Cache in PWA?

8

Ich benutze den Service-Mitarbeiter mit der Bibliothek sw-toolbox . Mein PWA speichert alles außer API-Abfragen (Bilder, CSS, JS, HTML). Aber was, wenn einige Dateien eines Tages geändert werden. Oder was, wenn service-worker.js geändert wird. Wie sollte die Anwendung über Änderungen in Dateien Bescheid wissen?

Mein service-worker.js:

%Vor%

Ich weiß nicht, wie es üblich ist, den Cache in PWA zu aktualisieren. Vielleicht sollte PWA eine AJAX-Anfrage im Hintergrund senden und die UI-Version überprüfen?

    
Ildar 19.06.2017, 10:18
quelle

4 Antworten

4

AFAIK die sw_toolbox hat keine Strategie für Cache mit Netzwerkupdate. Das ist wirklich was du willst, denke ich. Sie möchten die Cache-Netzwerk-Rennstrategie ändern - & gt; Ссылка Anstatt den Verlierer einfach wegzulassen, sobald das Netzwerk reagiert, möchten Sie den Client aktualisieren. Dies ist ein wenig fortgeschrittener, dass ich Zeit oder Zeit habe, hier zu erklären. Ich würde eine Nachricht an den Client senden, um zu wissen, dass es ein Update gibt. Möglicherweise möchten Sie den Benutzer auf das Update aufmerksam machen oder das Update erzwingen. Ich halte dies nicht für einen Randfall, sondern für ein sehr häufiges, aber fortgeschrittenes Szenario. Ich hoffe, bald eine detailliertere Lösung zu veröffentlichen.

    
Chris Love 19.06.2017 20:28
quelle
4

Es gibt eine schöne Lösung hier wo er sagt (kurz gesagt), um entweder die Cache-First-Strategie nicht zu verwenden oder ein UX-Muster zu aktualisieren, das ein "Neu laden für die neuesten Updates" anzeigt.

    
oninross 21.06.2017 00:49
quelle
1

Ich habe mich mit Service-Mitarbeitern beschäftigt, ohne eine Bibliothek zu verwenden, und die Lösung, die ich mir letztendlich ausgedacht habe, beinhaltete ein bisschen serverseitigen Code und einige Client-Seiten. Die Strategie in Kürze

Zuerst die Variablen, die Sie benötigen und wo:

  1. Auf der Server-Seite gibt es eine "service worker version" -Variable (Setzen Sie diese in eine Datenbank oder Konfigurationsdatei, wenn Sie etwas wie PHP verwenden, das sofort auf der Server-Seite aktualisiert wird, ohne dass eine erneute Implementierung erforderlich ist. Lassen Sie es uns nennen serverSWVersion
  2. Auf einer der Javascript-Dateien, die Sie zwischenspeichern (ich habe eine Javascript-Datei dafür), haben Sie eine globale Variable, die auch die "Service-Arbeiter-Version" sein wird. Nennen wir es clientSWVersion

Nun, wie Sie die beiden verwenden:

  1. Wenn eine Person auf der Seite landet, führen Sie einen Ajax-Aufruf an Ihren Server aus, um den Wert serverSWVersion abzurufen. Vergleichen Sie dies mit dem Wert clientSWVersion .

  2. Wenn die Werte unterschiedlich sind, bedeutet dies, dass Ihre Web-App-Version nicht funktioniert das Neueste.

  3. Wenn dies der Fall ist, heben Sie die Registrierung des Service-Arbeiters auf und aktualisieren Sie die Seite, damit der Service-Mitarbeiter erneut registriert wird und die neuen Dateien zwischengespeichert werden.

Was tun, wenn eine neue Datei verfügbar ist

  1. Aktualisieren Sie die Variablen serviceSWVersion und clientSWVersion , und laden Sie sie gegebenenfalls auf den Server hoch.

  2. Wenn eine Person erneut besucht, sollte der Service-Mitarbeiter erneut registriert werden und alle zwischengespeicherten Dateien werden abgerufen.

Ich habe einen php-serverseitigen Code zur Verfügung gestellt, den ich bei der Implementierung dieser Strategie verwendet habe. Es sollte dir die Prinzipien zeigen. Legen Sie einfach den Ordner "Exercise" in einem htdocs eines PHP-Servers ab und es sollte funktionieren, ohne dass Sie etwas anderes tun müssen. Ich hoffe, Sie finden es nützlich ... Und denken Sie daran, Sie könnten einfach eine Datenbank anstelle einer Konfigurationsdatei verwenden, um die serverseitige Service-Worker-Variable zu speichern, wenn Sie einen anderen Server anstelle von PHP verwenden:

Zip-Datei mit Code: ServiceWorkerExercise.zip

    
Zuks 05.07.2017 06:02
quelle
0

ändern Sie self.toolbox.router.any ('/ ', self.toolbox.cacheFirst); zu self.toolbox.router.any ('/ ', self.toolbox.fastest);

    
user2243952 05.01.2018 01:54
quelle