Precaching mit Workbox

Precaching ist eine der häufigsten Aufgaben in einem Service Worker. Workbox bietet viel Flexibilität darin, diese wichtige Aufgabe zu erledigen, unabhängig davon, für welches der Build-Tools von Workbox Sie sich entscheiden. In diesem Leitfaden erfahren Sie, wie Sie Assets mithilfe von generateSW und injectManifest vorab im Cache speichern und welche dieser Methoden sich am besten für Ihr Projekt eignen.

Precaching mit generateSW

generateSW ist die einfachste Möglichkeit, Assets in Workbox vorab im Cache zu speichern. Der wichtige Punkt bei generateSW ist, dass Sie nicht Ihren eigenen Service Worker schreiben, sondern ihn von Workbox für Sie erstellen lassen. Sie können ihr Verhalten jedoch durch eine Vielzahl von Konfigurationsoptionen beeinflussen.

generateSW führt standardmäßig verschiedene Aktionen aus, je nachdem, welches Build-Tool Sie verwenden. Wenn Sie workbox-webpack-plugin verwenden, müssen Sie keine Konfigurationsoptionen angeben. Standardmäßig speichert das Plug-in alles im Cache des Webpacks im Abhängigkeitsdiagramm und schreibt einen Service Worker mit dem Namen service-worker.js in das von output.path angegebene Verzeichnis

Wenn Sie jedoch workbox-build oder workbox-cli verwenden, werden standardmäßig nur die aus dem lokalen Dateisystem gelesenen HTML-, CSS- und JavaScript-Assets vorab im Cache gespeichert. In Bezug auf die Konfiguration müssen Sie swDest und die Option globDirectory in der generateSW-Konfiguration angeben, damit das Precaching funktioniert. Wahrscheinlich möchten Sie auch zusätzliche Optionen konfigurieren, die sich auf das Verhalten Ihres Service Workers auswirken. Lesen Sie dazu die Dokumentation.

Precaching mit injectManifest

Die Verwendung von injectManifest ist nicht so einfach wie die Verwendung von generateSW, aber bei der Nutzerfreundlichkeit geht die Flexibilität verloren. Während generateSW die gesamte Service Worker-Generation für Sie verarbeitet, verwendet injectManifest einen von Ihnen geschriebenen Service Worker als Quelle und fügt eine Liste von URLs für die Pre-Cache-Speicherung ein. Der Rest des Service Workers bleibt unverändert.

Wenn Sie injectManifest verwenden, sind Sie für die Verkabelung der Precach-Logik verantwortlich. Wenn injectManifest Ihren Eingabe-Service-Worker untersucht, sucht er nach einer speziellen self.__WB_MANIFEST-Variable und ersetzt sie durch das Precache-Manifest. Wenn diese Variable nicht vorhanden ist, gibt injectManifest einen Fehler aus.

Die Liste der Einträge im Precache-Manifest kann mit zusätzlichen Konfigurationsoptionen optimiert werden.

Vergleich

Klicken Sie auf die folgenden Tabs, um die Nutzung der Methoden generateSW und injectManifest zu vergleichen:

Da generateSW einen Service Worker generiert, müssen Sie nur eine Konfiguration angeben. Hier ein Beispiel mit workbox-build:

// build-sw.js
import {generateSW} from 'workbox-build';

generateSW({
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

Der Service Worker kann dann in der Befehlszeile mit Node erstellt werden:

node build-sw.js

Da für injectManifest ein Quell-Service-Worker erforderlich ist, ist für ein minimal brauchbares Beispiel eine Quell-Service-Worker-Datei erforderlich. Wenn nur Precaching erforderlich ist, könnte der Eingabe-Service-Worker etwa so aussehen:

import {precacheAndRoute} from 'workbox-precaching';

precacheAndRoute(self.__WB_MANIFEST);

Notieren Sie sich den String self.__WB_MANIFEST. Dies ist ein Platzhalter, den Workbox durch das Precache-Manifest ersetzt. Im Folgenden finden Sie eine gültige Konfiguration für diesen Anwendungsfall:

// build-sw.js
import {injectManifest} from 'workbox-build';

injectManifest({
  swSrc: './src/sw.js',
  swDest: './dist/sw.js',
  globDirectory: './dist',
  globPatterns: [
    '**/*.js',
    '**/*.css',
    '**/*.svg'
  ]
});

injectManifest ist zu bevorzugen, wenn Sie komplexe Anforderungen haben, z. B. erweitertes Routing, benutzerdefinierte Caching-Strategien oder andere Aspekte, die von den Optionen von generateSW nicht abgedeckt werden.

Fazit

Das Precaching in Workbox ist wesentlich einfacher, als wenn Sie es selbst verwalten müssten, insbesondere wenn es sich um versionierte Assets, die von Bundlern kompiliert wurden, handelt. Precaching ist jedoch nicht die einzige Aufgabe, die Sie in einem Service Worker tun werden. Im weiteren Verlauf lernen Sie andere Techniken kennen, z. B. das Laufzeit-Caching.