Mittels Service Workers kann man inzwischen auch Offline eine Webseite zum Laufen bringen. Dies ist auch nicht neu, jedoch wird dieser Gedanke mit den PWAs sehr gefördert.
Nachdem man ein Serviceworker Script registriert hat startet der „Circle of Life“

window.navigator.serviceWorker.register('/path/to/serviceworker.js');


Parsed

Die Serviceworkerdatei ist fehlerfrei geparst worden.

Installing

Der Serviceworker wird installiert.

Error

Dieser Zustand tritt ein, wenn der Serviceworker nicht installiert werden konnte, oder während der Installation ein Fehler aufgetreten ist.

Activated

Der Serviceworker wurde erfolgreich installiert.

Idle

Kein registrierter Event wird aufgerufen und der Serviceworker wartet auf ein neues Ereignis.

Fetch

Der Serviceworker agiert als Proxy zwischen Applikation und Netzwerk. Er überwacht die Anfragen an das Netzwerk.

Terminated

Der Serviceworker wird nicht mehr benötigt und wurde deshalb beendet.

Caching und Fetching

Um Requests zu behandeln gibt es zwei APIs. Die Caching API cacht Requests und deren Responses und die Fetch API wird auslöst, wenn ein Request ausgeführt werden soll.
Cachen kann man dabei mit verschiedenen Stragtegien.

Cache Only

Alles wird aus dem Cache beantwortet. Ist ein Request nicht im Cache, wird dieser nicht beantwortet.

Network Only

Hier überwacht der Serviceworker lediglich die Requests. Die Requests werden jedoch nicht im Cache hinzugefügt. Alles läuft über das Netzwerk.

Cache falling back to Network

Die am meisten verwendete Strategie. Wenn im Cache keine Antwort vorhanden ist, wird diese über das Netzwerk geholt und anschliessend gegached. Der Code dazu könnte so aussehen:

self.addEventListener('install', (event) => {
  event.waitUntil(
    // open a new cache
    self.caches.open('myCache')
      .then((cache) => {
        // add file logo.png to cache
        cache.add('logo.png')
          .then(() => {
            // finish the installation
            self.skipWaiting();
          });
      })
  );
});

self.addEventListener('fetch', (event) => {
  event.respondWith(
    // check if request matches with any request in the cache
    self.caches.match(event.request)
      .then((cacheEntry) => {
        // respond with cache entry or fetch from network
        return cacheEntry || self.fetch(event.request);
      })
  );
});
Cache and Network Race

Hier wird der Request von der Komponente, welche schneller antwortet, ausgeliefert.

Network falling back to Cache

Wenn eine Anfrage an das Netzwerk fehlschlägt wird der Request aus dem Cache geladen.

Cache, then Network

Diese Strategie eignet sich besonders für schnell aktualisierende Inhalte. Hierbei wird ein Request direkt an den Cache (ohne Umweg über den Serviceworker) geleitet. Parallel dazu wird ein Request ins Netzwerk gesendet. Die Antwort des Netzwerkrequests wird dann in den Cache geschrieben. Nachdem die Antwort in den Cache geschrieben wurde, wird diese an die Applikation weiter gegeben.

WorkboxJS

Wer seinen Serviceworker oder dessen Implementierung nicht selbst möchte machen, kann dies mit Hilfe von WorkboxJS.org machen.

Fazit

Serviceworkers sind eine gute Sache, um die Ladezeit einer Webseite enorm zu verbessern. Auch eine gewisse Offlinefunktionalität ist gut. Jedoch sind Serviceworker noch nicht in allen Browsern unterstützt.
Ich freue mich darauf, wenn eine 100%ige Unterstützung vorhanden ist.