In früheren Versionen der Implementierung von Angular service worker war eine der Konfigurationsoptionen "routing"
. Dies ist in dieser nbeantworteten SO frage zu sehen, auf die in dieser Angular CLI issue verwiesen wurde, und die beste verbleibende Dokumentation scheint die zu sein Blogeintrag von Stephen Fluin (im Angular Team), sowie das I/O-Gespräch von Alex Rickabaugh (von Google) .
Mit Angular 5 wurde das ServiceWorkerModule
gut ausgearbeitet, und der größte Teil der Konfiguration kann jetzt mit dem ngsw-config.json
Datei. Es wird jedoch nicht mehr erwähnt, wie die Umleitung für Routen an einer beliebigen Stelle im angle.io guide oder in der documentation gehandhabt wird. Daher habe ich folgendes Problem: Wenn ich meine App besucht habe und offline gehe, kann ich auch dann auf die App zugreifen, wenn ich sie direkt besuche: https://jackkoppa.github.io/cityaq-sw-issue . Beim Laden leitet die App jedoch auf die Route search
um, und die meisten Benutzer würden versuchen, von einer URL wie https://jackkoppa.github.io/cityaq-sw-issue/search) zu laden ? cities = Shanghai (Der Einfachheit halber spreche ich hier nur von Chrome Desktop & Mobile vorerst und wenn möglich in Inkognito).
Wenn Sie versuchen, diese URL offline aufzurufen, wird sofort ein 504 - Gateway Timeout angezeigt. Dies geschieht, weil der Service-Worker nur den Index zwischengespeichert hat und nicht weiß, dass andere Routen zum Index umgeleitet werden sollten, damit er geladen werden kann. Ich bin zuversichtlich, dass frühere Iterationen der Angular= Service Worker-Implementierung dieses Szenario hätten bewältigen können, indem für bestimmte Routen Weiterleitungen zum Index eingerichtet wurden. Ist da? eine Möglichkeit, diese Umleitung in der aktuellen zu behandeln, Angular 5+ ngsw-config.json
oder im generierten ngsw.json
Datei? Ansonsten, wie soll eine Problemumgehung in einer separaten Service Worker JS-Datei behandelt werden?
TL; DR: Ich habe mindestens zwei Probleme identifiziert, die in meinem Fall einen Bruch verursachen. Sie können dieses Erstellungsskript jetzt verwenden, um mein Update zu testen, und sehen, dass die App offline funktioniert hier . Weitere Test- und Pull-Anfragen sind erforderlich.
Obwohl ich keine dokumentierte Antwort finden konnte, konnte ich bisher Folgendes feststellen, indem ich in der Datei ngsw-worker.js
Schrittweise vorging und den Commit-Verlauf @angular/service-worker
Las.
Der neue ServiceWorkerModule
Ansatz für "Routing" besteht darin, eine "Navigations" -Anforderung (dh eine Nicht-Index-Route für dieselbe Domain) anzunehmen und die handleFetch
-Methode erneut auszuführen, aber jetzt darauf hinzuweisen auf die Anfrage index.html
( source ). Dies sollte funktionieren, da ein SPA in der Lage sein sollte, zur URL umzuleiten, sobald es seine zwischengespeicherten Dateien für den Index abgerufen hat.
Die Probleme, die dazu führen, dass meine Website im Offlinemodus ausfällt, müssen also nicht direkt mit dem Routing zusammenhängen, und ich habe bisher 2 gefunden. Das Korrigieren dieser Probleme mit einer Problemumgehung hat es mir ermöglicht, meine App größtenteils wie erwartet zum Laufen zu bringen. Mit den Repro-Schritten in der ursprünglichen Frage funktioniert jetzt cityaq , während ich die ursprüngliche, fehlgeschlagene Site unter cityaq-sw-issue reproduziert habe.
Die Probleme:
Gehostete Versionen einer Angular= App, bei der das --base-href
- Flag in der CLI gesetzt ist, listen absolute URLs für ihre Service-Worker-Ressourcen auf. Beim Vergleich von Anforderungen mit diesen Ressourcen wird ngsw-worker.js
Erwartet relative URLs
Von den 3 verfügbaren "Zuständen", in denen sich der ngsw-worker.js
Befinden kann, scheint nach meiner Erfahrung EXISTING_CLIENTS_ONLY
Falsch gesetzt zu sein.
ngsw-worker.js
Nicht mehr, zwischengespeicherte Ressourcen ( Quelle ) abzurufen, und dies in meinen Tests unter scheinbar "richtigen" Umständen wechselt die App auch dann noch in diesen Status, wenn lediglich eine Internetverbindung getrennt wirdWährend ich einen PR für Ausgabe Nr. 1 zusammenstelle und auf Hilfe beim Verständnis von Ausgabe Nr. 2 warte, verwende ich ein Umgehungserstellungsskript, um ngsw-worker.js
Zu ändern, nachdem es generiert wurde. Warnung: Es ist hässlich und ändert definitiv das beabsichtigte "sichere" Verhalten der Einstellung EXISTING_CLIENTS_ONLY
. Für meine App ist jedoch eine korrekte Offline-Leistung sowohl bei lokaler Ausführung (http-server
) Als auch bei der Bereitstellung auf einer Live-URL (in meinem Fall GitHub-Seiten) möglich.
So verwenden Sie die Problemumgehung: (Angular 5, getestet mit Angular 5.2.1)
npm install replace-in-file --save-dev
build/fix-sw.js
package.json
:"scripts": {
...
"sw-build": "ng build --prod && node build/fix-sw",
"sw-build-live": ng build --prod --base-href https://your-url.com/ && node build/fix-sw"
...
}
npm run sw-build cd dist http-server -p 8080
npm run sw-build-live