2017-12-13 7 views
2

ich Angular 5.1 mit dem internen Service-Worker Das ist meine ngsw-config.json Datei:Angular Service-Arbeiter zu spät beginnen

{ 
    "appData": "Angular 5.1", 
    "index": "/index.html", 
    "assetGroups": [ 
    { 
     "name": "app", 
     "installMode": "prefetch", 
     "resources": { 
     "files": ["/favicon.ico", "/index.html"], 
     "versionedFiles": ["/*.bundle.css", "/*.bundle.js", "/*.chunk.js"] 
     } 
    }, 
    { 
     "name": "assets", 
     "installMode": "prefetch", 
     "updateMode": "prefetch", 
     "resources": { 
     "files": ["/assets/**"] 
     } 
    } 
    ], 
    "dataGroups": [ 
    { 
     "name": "tasks-users-api", 
     "urls": ["/api"], 
     "cacheConfig": { 
     "strategy": "freshness", 
     "maxSize": 20, 
     "maxAge": "1h", 
     "timeout": "5s" 
     } 
    } 
    ] 
} 

In ngOnInit Funktion meiner Homepage, ich nenne den/api url aufgelistet in Datengruppen. Wenn ich meine Konsole öffne, kann ich sehen, dass diese URL ein Anruf ist (unten rot umrandet) vor dem Start des Service-Arbeiters (ich denke, der Start des Service-Arbeiters stimmt mit dem blau umrandeten Element überein).

dev console screen

Also, wenn ich meine Internet-Verbindung ausschalten, die/api Anruf wird durch die Servicemitarbeiter nicht umgehen. Wenn ich auf einer anderen Seite navigiere und zur Startseite zurückkehre, bevor ich meine Verbindung abstelle, wird der/api-Aufruf von Service Worker bearbeitet.

Ist das ein Problem? Wie gehe ich mit dem Fall um?

Antwort

1

Dies ist wahr, das ist mehr eine Funktion als ein Fehler. Eines der Ziele des Service Worker Designs ist es, extrem flexibel zu sein und Sie haben somit die Freiheit zu entscheiden, wann Sie Ihre SW installieren und was es zur Installation braucht.

Theoretisch kann die Installation als eine der ersten Aufgaben des Skripts aufgerufen werden und blockiert möglicherweise bis zum Abschluss der Installation. Aber da die Installationsphase beliebig lang sein kann (wir könnten versuchen, dort die Hälfte des Internets vorzucachen), wird es höchst unpraktisch.

Ich kenne die Besonderheiten der Angular-Implementierung nicht, aber eine allgemeine Praxis besteht darin, SW-Registrierung erst aufzurufen, nachdem die Seite vollständig geladen wurde. Es wird also erwartet, dass die erste Last (oder zumindest die Phase bis SW installiert und aktiviert) nicht von SW bedient wird.

Wie wird mit diesem Fall umgegangen? Es gibt wirklich nichts zu handhaben. Wenn Sie Ihre Verbindung beim ersten Laden verlieren, ist sie verloren, unabhängig davon, wer verantwortlich war. Entweder konnte Ihr Benutzer die Daten nicht direkt laden oder Ihre SW konnte die Daten nicht zwischenspeichern - in beiden Fällen haben Sie grundsätzlich nichts zu liefern.