Ich habe einen ServiceWorker auf meiner Seite registriert und möchte einige Daten an ihn weitergeben, damit er in einer IndexedDB gespeichert und später für Netzwerkanforderungen verwendet werden kann (es ist ein Zugriffstoken).
Ist es richtig, nur Netzwerkanforderungen zu verwenden und sie mit Fetch auf der SW-Seite abzufangen, oder gibt es etwas Clevereres?
Hinweis für zukünftige Leser, die sich ähnliche Dinge fragen:
Festlegen von Eigenschaften für das SW-Registrierungsobjekt, z. Setzen Sie self.registration.foo auf eine Funktion innerhalb des Service Worker und führen Sie folgende Schritte auf der Seite aus:
%Vor%Ergebnisse in 'TypeError: reg.foo ist keine Funktion'. Ich nehme an, dass dies etwas mit dem Lebenszyklus eines ServiceWorker zu tun hat, was bedeutet, dass Sie ihn nicht modifizieren können und erwarten, dass diese Modifikation in Zukunft zugänglich sein wird. Daher muss jede Schnittstelle mit einem SW wahrscheinlich postMessage-Stil sein der beste Weg zu gehen ...?
Es stellt sich also heraus, dass Sie eine Methode innerhalb einer SW nicht aus Ihrer App heraus aufrufen können (aufgrund von Lebenszyklusproblemen), also müssen Sie eine postMessage API verwenden, um serialisierte JSON-Nachrichten zu übergeben (also keine Rückrufe usw.) .
Sie können eine Nachricht mit folgendem App-Code an die Controlling-SW senden:
%Vor%Kombiniert mit dem folgenden im SW-Code:
%Vor%Was in meiner SW-Konsole folgendes ergibt:
%Vor%Indem ich eine Nachricht (JS-Objekt) übergebe, die die Funktion und die Argumente angibt, die ich aufrufen möchte, kann mein Ereignis-Listener sie empfangen und die richtige Funktion in der SW aufrufen. Um ein Ergebnis an den App-Code zurückzugeben, müssen Sie auch einen Port eines MessageChannels an die SW weitergeben und dann über postMessage antworten, beispielsweise in der App, die Sie erstellen und über einen MessageChannel mit den Daten senden:
%Vor%und dann können Sie darüber in Ihrem Service Worker innerhalb des Message-Handlers antworten:
%Vor%Um Daten an Ihren Service-Mitarbeiter zu übermitteln, ist das oben Erwähnte ein guter Weg. Aber falls jemand es immer noch schwer hat, das zu implementieren, gibt es einen anderen Hack dafür,
1 - hängen Sie Ihre Daten an, um Parameter zu erhalten, während Sie Service-Arbeiter laden (zB aus sw.js
- & gt; sw.js?a=x&b=y&c=z
)
2- Jetzt im Service-Arbeiter, holen Sie diese Daten mit self.self.location.search
.
Beachten Sie, dass dies nur dann von Vorteil ist, wenn sich die übergebenen Daten für einen bestimmten Client nicht häufig ändern. Andernfalls wird die Lade-URL des Service-Mitarbeiters für diesen bestimmten Client und jedes Mal, wenn der Client neu geladen wird, geändert oder erneute Besuche, neuer Service-Mitarbeiter wird installiert.
Tags und Links service-worker