Blog Performance

Service Worker und Offline-Caching für SEO: PWA-Performance für bessere Rankings

Progressive Web Apps mit Service Workern laden Inhalte aus dem Cache statt vom Server — das verbessert LCP, TTFB und Core Web Vitals direkt und damit auch das Google-Ranking.

17. Mai 2026 · 12 min Lesezeit · Laurenz Thümmler, Shift07
Service Worker und Offline-Caching für SEO: PWA-Performance und Rankings verbessern

Service Worker sind eine der leistungsstärksten Technologien, die ein Frontend-Entwickler heute einsetzen kann — und gleichzeitig eine der am meisten unterschätzten SEO-Maßnahmen. Sie sitzen als programmierbarer Proxy zwischen Browser und Netzwerk, fangen Anfragen ab und entscheiden, ob sie die Antwort aus dem Cache liefern oder frisch vom Server holen. Das Ergebnis: Ladezeiten, die sich wie Magie anfühlen — weil gecachte Assets in unter 10 ms bereit stehen.

Für SEO ist das relevant, weil Google seit dem Page Experience Update Ladegeschwindigkeit und Core Web Vitals direkt als Ranking-Faktoren gewichtet. Ein Service Worker, der Assets aus dem Cache serviert, verbessert LCP, TTFB und INP messbar — ohne eine einzige Zeile im Backend zu ändern.

Was du in diesem Artikel lernst

  • Wie Service Worker funktionieren und warum sie SEO-relevant sind
  • Welche Cache-Strategie für welchen Content-Typ passt
  • Wie du mit Workbox einen Service Worker in 15 Minuten aufsetzt
  • Welche SEO-Fallstricke du vermeiden musst (veraltete Cache-Inhalte!)
  • Wie Google Service Worker beim Crawling behandelt

Was ist ein Service Worker?

Ein Service Worker ist ein JavaScript-Skript, das im Hintergrund des Browsers läuft — getrennt vom eigentlichen Seitenkontext, ohne DOM-Zugriff. Es registriert sich für eine Domain oder einen Pfad und kann dann Netzwerkanfragen abfangen, modifizieren oder aus seinem eigenen Cache beantworten.

Technisch handelt es sich um einen Web Worker mit Netzwerk-Proxy-Fähigkeiten. Der Browser installiert ihn beim ersten Besuch und aktiviert ihn bei allen folgenden Aufrufen derselben Domain. Service Worker laufen über HTTPS (außer auf localhost) und sind auf dieselbe Origin beschränkt.

// service-worker.js — minimales Beispiel
const CACHE_NAME = 'shift07-v1';
const PRECACHE_URLS = [
  '/',
  '/styles/main.css',
  '/scripts/app.js',
  '/offline.html'
];

// Installation: Assets vorab cachen
self.addEventListener('install', event => {
  event.waitUntil(
    caches.open(CACHE_NAME)
      .then(cache => cache.addAll(PRECACHE_URLS))
  );
});

// Fetch: Cache-First für statische Assets
self.addEventListener('fetch', event => {
  event.respondWith(
    caches.match(event.request)
      .then(cached => cached || fetch(event.request))
  );
});

Die Registrierung im Haupt-JS-Bundle ist minimal:

// Registrierung im Haupt-JavaScript
if ('serviceWorker' in navigator) {
  navigator.serviceWorker.register('/service-worker.js')
    .then(reg => console.log('SW registriert:', reg.scope));
}

Die fünf Cache-Strategien und wann du welche einsetzt

Nicht jeder Content-Typ profitiert von derselben Cache-Strategie. Die falsche Wahl führt entweder zu veralteten Inhalten oder zu keiner Performance-Verbesserung. Hier sind die fünf etablierten Strategien:

1. Cache First (Cache-zuerst)

Wie es funktioniert: Der Service Worker prüft zuerst den Cache. Nur wenn kein Eintrag vorhanden ist, geht er ins Netzwerk und speichert die Antwort.

Geeignet für: Statische Assets, die sich selten ändern — CSS-Dateien, JavaScript-Bundles, Webfonts, Logos, Bilder. Diese sind meist versioniert (main.abc123.js) und ändern sich nie nach dem Build.

SEO-Impact: Direkt. Statische Assets aus dem Cache bedeuten, dass Browser-LCP-Kandidaten (Hero-Bilder, Fonts) sofort verfügbar sind. Der TTFB für diese Ressourcen fällt auf nahezu null.

2. Network First (Netzwerk-zuerst)

Wie es funktioniert: Zuerst wird das Netzwerk versucht. Wenn die Anfrage scheitert (offline, Server nicht erreichbar), liefert der Cache die gespeicherte Version.

Geeignet für: HTML-Seiten, API-Antworten, News-Feeds — Inhalte, die aktuell sein müssen, aber im Offline-Fall besser veraltet als gar nicht gezeigt werden.

SEO-Fallstrick: Network First mit Timeout

Network First kann TTFB erhöhen, wenn der Server langsam antwortet — der Browser wartet auf die Netzwerkantwort bevor er den Cache prüft. Verwende einen Timeout (z.B. 3 s), nach dem automatisch auf den Cache zurückgegriffen wird.

3. Stale While Revalidate (Veraltetes liefern, im Hintergrund aktualisieren)

Wie es funktioniert: Der Cache wird sofort geliefert (schnell!), während im Hintergrund gleichzeitig eine Netzwerkanfrage läuft, die den Cache für den nächsten Besuch aktualisiert.

Geeignet für: Blog-Artikel, Produktseiten, statisch generierte HTML-Seiten — Inhalte, die sich gelegentlich ändern aber nicht sekundenaktuell sein müssen.

SEO-Impact: Sehr gut. Der Browser erhält die gecachte Antwort sofort, was LCP und TTFB drastisch verbessert. Beim nächsten Aufruf ist der Cache bereits aktualisiert.

4. Cache Only

Ausschließlich aus dem Cache, kein Netzwerkzugriff. Sinnvoll für Assets, die beim Install-Event vorab gecacht wurden und sich nicht ändern (z.B. App-Shell). Im SEO-Kontext selten direkt relevant.

5. Network Only

Immer frisch vom Netzwerk, kein Caching. Für Echtzeit-Daten wie Börsenkurse, Live-Scores oder personalisierte API-Endpunkte. Kein direkter SEO-Vorteil.

Strategie Geschwindigkeit Aktualität Geeignet für
Cache First⚡⚡⚡ Sehr schnell❌ Veraltet möglichVersionierte Assets (CSS, JS)
Network First⚡ Langsamer✅ Immer aktuellAPI-Antworten, News
Stale While Revalidate⚡⚡⚡ Sehr schnell✅ Nächster BesuchBlog-Artikel, HTML-Seiten
Cache Only⚡⚡⚡ Maximal❌ Nie aktualisiertApp-Shell, Offline-Fallback
Network Only⚡ Normal✅ Immer aktuellEchtzeit-Daten

Workbox: Service Worker in der Praxis

Manuell einen Service Worker zu schreiben, der alle Edge Cases korrekt behandelt (Cache-Invalidierung, Race Conditions, Update-Lifecycle), ist fehleranfällig. Workbox ist die offizielle Google-Bibliothek, die diese Komplexität abstrahiert.

// service-worker.js mit Workbox
import { registerRoute } from 'workbox-routing';
import { CacheFirst, StaleWhileRevalidate, NetworkFirst } from 'workbox-strategies';
import { precacheAndRoute } from 'workbox-precaching';
import { ExpirationPlugin } from 'workbox-expiration';

// Vorab-Caching des Build-Outputs (Vite/Webpack inject __WB_MANIFEST)
precacheAndRoute(self.__WB_MANIFEST);

// Strategie 1: Cache First für Bilder (max 30 Tage, max 60 Einträge)
registerRoute(
  ({ request }) => request.destination === 'image',
  new CacheFirst({
    cacheName: 'images-cache',
    plugins: [
      new ExpirationPlugin({ maxEntries: 60, maxAgeSeconds: 30 * 24 * 60 * 60 })
    ]
  })
);

// Strategie 2: Stale While Revalidate für Blog-HTML
registerRoute(
  ({ request }) => request.destination === 'document',
  new StaleWhileRevalidate({ cacheName: 'html-cache' })
);

// Strategie 3: Network First für API-Anfragen
registerRoute(
  ({ url }) => url.pathname.startsWith('/api/'),
  new NetworkFirst({ cacheName: 'api-cache', networkTimeoutSeconds: 3 })
);

Mit Vite verwendest du das Plugin vite-plugin-pwa, das Workbox automatisch konfiguriert und den Service Worker in deinen Build-Prozess integriert:

// vite.config.js
import { VitePWA } from 'vite-plugin-pwa';

export default {
  plugins: [
    VitePWA({
      registerType: 'autoUpdate',
      workbox: {
        globPatterns: ['**/*.{js,css,html,ico,png,svg,woff2}'],
        runtimeCaching: [{
          urlPattern: /^https:\/\/shift07\.ai\/blog\//,
          handler: 'StaleWhileRevalidate',
          options: { cacheName: 'blog-cache' }
        }]
      }
    })
  ]
};

Service Worker und SEO: Was Googlebot sieht

Eine häufige Frage: Crawlt Googlebot Service Worker? Die Antwort ist differenziert. Googlebot führt JavaScript aus — er ist ein vollständiger Chromium-basierter Renderer. Das bedeutet:

Kritisch: Verberge keine Inhalte hinter Service Workern

Wenn dein Service Worker Inhalte ausliefert, die nicht über das Netzwerk erreichbar sind (nur im Cache), wird Googlebot diese nicht crawlen können. Stelle sicher, dass jede URL auch ohne Service Worker eine valide HTTP-Antwort zurückgibt.

Navigation Preload: TTFB auch beim ersten Crawl verbessern

Normalerweise muss der Browser warten bis der Service Worker gestartet ist, bevor er die Navigation-Anfrage abfangen kann — das kostet 50–200 ms. Navigation Preload löst dieses Problem: Der Browser startet die Netzwerkanfrage parallel zum Service Worker Start.

// Navigation Preload aktivieren
self.addEventListener('activate', event => {
  event.waitUntil(self.registration.navigationPreload.enable());
});

self.addEventListener('fetch', event => {
  if (event.request.mode === 'navigate') {
    event.respondWith(async function() {
      // Nutze die preloaded Antwort wenn verfügbar
      const preloadResponse = await event.preloadResponse;
      if (preloadResponse) return preloadResponse;

      // Fallback: Cache oder Netzwerk
      const cached = await caches.match(event.request);
      return cached || fetch(event.request);
    }());
  }
});

Das verkürzt den TTFB für wiederkehrende Besucher und liefert gleichzeitig der gecachten Version für sofortiges Rendering. Für den Googlebot, der immer ein "erster Besuch" ist, bedeutet es: die Netzwerkanfrage wird nicht durch den SW-Start verzögert.

Offline-Fallback: UX und Crawlability

Ein guter Service Worker zeigt bei fehlender Verbindung eine sinnvolle Offline-Seite statt des Browser-Fehlerbildschirms. Das verbessert die User Experience, hat aber keinen direkten SEO-Vorteil — Googlebot crawlt im Netzwerk, nicht offline.

// Offline-Fallback
self.addEventListener('fetch', event => {
  if (event.request.mode === 'navigate') {
    event.respondWith(
      fetch(event.request).catch(() =>
        caches.match('/offline.html')
      )
    );
  }
});

Die offline.html sollte eine hilfreiche Seite mit deinen wichtigsten gecachten Inhalten sein — zum Beispiel Links zu bereits besuchten Artikeln aus dem Cache.

Cache-Invalidierung: Der wichtigste SEO-Fallstrick

Der häufigste Fehler mit Service Workern: veraltete Inhalte werden zu lange ausgeliefert. Wenn du einen Artikel aktualisierst, aber der Service Worker noch die alte Version ausliefert, können wiederkehrende Nutzer veraltete Inhalte sehen — und wenn Google keinen direkten Cache-Hit hat, bekommt er die korrekte Version. Kein direkter SEO-Schaden, aber schlechte UX.

Die richtige Lösung: Versionierung im Cache-Namen kombiniert mit automatischem Update.

// Cache-Versionierung: Bei Änderung CACHE_VERSION erhöhen
const CACHE_VERSION = 'v3';
const CACHE_NAME = `shift07-${CACHE_VERSION}`;

// Beim Activate: Alte Caches löschen
self.addEventListener('activate', event => {
  event.waitUntil(
    caches.keys().then(keys =>
      Promise.all(
        keys
          .filter(key => key.startsWith('shift07-') && key !== CACHE_NAME)
          .map(key => caches.delete(key))
      )
    )
  );
});

Mit Workbox und registerType: 'autoUpdate' übernimmt Workbox das automatisch: Wenn eine neue Service-Worker-Version erkannt wird, wird sie im Hintergrund installiert und beim nächsten Tab-Wechsel aktiviert.

Messbare SEO-Effekte von Service Workern

Was kannst du realistisch erwarten? Die Zahlen variieren je nach Ausgangssituation, aber hier sind typische Verbesserungen:

Google bewertet CrUX-Daten (Chrome User Experience Report), die reale Nutzerdaten widerspiegeln. Service Worker verbessern diese Feldmessdaten direkt, weil wiederkehrende Nutzer (der Großteil des Traffics) von gecachten Assets profitieren. Das schlägt sich in den CrUX-Daten nieder, die Google für das Ranking nutzt. Prüfe deine aktuellen Werte mit dem Core Web Vitals Checker.

Service Worker und JavaScript-Performance kombinieren

Service Worker sind besonders effektiv in Kombination mit anderen Performance-Maßnahmen. Die wichtigste Synergie: Code Splitting und Service Worker.

Wenn dein Build-Tool (Vite, Webpack) das JavaScript in kleine Chunks aufteilt, können diese Chunks einzeln gecacht werden. Wenn sich nur eine Komponente ändert, müssen Nutzer nur diesen einen Chunk neu laden — alle anderen bleiben im Cache. Das maximiert die Cache-Effizienz.

// Vite: Code Splitting + Workbox Precaching
// vite.config.js
export default {
  build: {
    rollupOptions: {
      output: {
        manualChunks: {
          vendor: ['react', 'react-dom'],  // Selten geändert → lang gecacht
          ui: ['@radix-ui/react-dialog'],   // Mittel geändert
          // App-Code → kurz gecacht, häufig aktualisiert
        }
      }
    }
  }
};

Ergänze das mit defer und async für nicht-kritisches JavaScript, damit der First Contentful Paint nicht durch Script-Parsing blockiert wird, während der Service Worker die Assets aus dem Cache lädt.

Browser-Caching vs. Service Worker Caching: Was ist der Unterschied?

Diese Frage wird oft gestellt. Der Browser-Cache wird vom HTTP-Server via Cache-Control-Header gesteuert — du kannst festlegen, wie lange Ressourcen gecacht werden, aber du hast keine Kontrolle über das Cache-Verhalten bei Netzwerkproblemen oder kannst keine programmatische Logik einsetzen.

Der Service Worker Cache ist vollständig programmatisch steuerbar:

Für maximale Performance kombinierst du beide: HTTP Cache-Control für statische Assets (lange TTL, da versioniert) + Service Worker für dynamische Caching-Logik und Offline-Fallbacks.

Checkliste: Service Worker für SEO richtig einsetzen

  • ✅ HTTPS aktiviert (Service Worker Pflichtvoraussetzung)
  • ✅ Workbox statt manuellem Service Worker verwenden
  • ✅ Statische Assets (CSS, JS, Bilder) mit Cache First cachen
  • ✅ HTML-Seiten mit Stale While Revalidate cachen
  • ✅ Navigation Preload aktivieren (reduziert SW-Startup-Latenz)
  • ✅ Cache-Versionierung bei jedem Deploy aktualisieren
  • ✅ Offline-Fallback-Seite implementieren
  • ✅ Alle Seiten sind auch ohne SW via HTTP erreichbar (für Googlebot)
  • ✅ ExpirationPlugin für Runtime-Caches konfigurieren (max Größe + Alter)
  • ✅ Code Splitting für maximale Cache-Effizienz kombinieren
  • ✅ Performance nach Implementierung mit CrUX-Daten messen

Fazit: Service Worker sind unterschätztes SEO-Werkzeug

Service Worker werden oft als "PWA-Feature" betrachtet — als wären sie nur für App-ähnliche Erlebnisse relevant. Das ist ein Missverständnis. Für jede Website, die wiederkehrende Besucher hat, verbessern Service Worker mit der richtigen Cache-Strategie die Core Web Vitals direkt und damit die Google-Rankings.

Der Aufwand für eine grundlegende Implementierung mit Workbox ist gering — besonders wenn du bereits Vite oder Webpack verwendest. Die vite-plugin-pwa erledigt den Großteil der Konfiguration automatisch. Was bleibt, ist die Strategie-Entscheidung pro Content-Typ: statische Assets Cache First, HTML Stale While Revalidate, APIs Network First.

Achte dabei auf den wichtigsten Fallstrick: Cache-Invalidierung. Lass Workbox die Cache-Versionierung übernehmen und stelle sicher, dass alle URLs auch ohne Service Worker gültige HTTP-Antworten zurückgeben. Dann profitierst du von der Performance, ohne SEO-Risiken einzugehen.

Prüfe deine aktuelle Performance-Situation mit dem Core Web Vitals Checker und kombiniere Service Worker mit entfernten Render-Blocking-Ressourcen für maximalen Effekt auf deine Rankings.

Wie schnell ist deine Website wirklich?

Prüfe Core Web Vitals, LCP und INP — kostenlos und ohne Anmeldung.

Core Web Vitals jetzt prüfen

Verwandte Artikel