Caching-Strategien Übersicht
Service Worker bieten fünf grundlegende Caching-Strategien für unterschiedliche Anwendungsfälle:
| Strategie | Priorität | Beschreibung |
|---|
| Cache First | Cache > Network | Schnellste Antwort, Cache als Primärquelle |
| Network First | Network > Cache | Aktuelle Daten, Cache als Fallback |
| Stale-While-Revalidate | Cache + Background Network | Sofortige Antwort, Hintergrund-Update |
| Cache Only | Nur Cache | Ausschließlich gecachte Ressourcen |
| Network Only | Nur Network | Kein Caching |
Cache First (Cache Falling Back to Network)
Funktionsweise
- Cache prüfen
- Bei Cache-Hit: Gecachte Response zurückgeben
- Bei Cache-Miss: Netzwerk-Request, Response cachen
Implementierung
// Vanilla JavaScript
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then(cachedResponse => {
if (cachedResponse) {
return cachedResponse;
}
return fetch(event.request)
.then(response => {
const clone = response.clone();
caches.open('static-cache')
.then(cache => cache.put(event.request, clone));
return response;
});
})
);
});
// Mit Workbox
import { CacheFirst } from 'workbox-strategies';
import { registerRoute } from 'workbox-routing';
registerRoute(
({ request }) => request.destination === 'image',
new CacheFirst({ cacheName: 'images' })
);
Anwendungsfälle
- Statische Assets (JS, CSS)
- Fonts
- Bilder und Icons
- Versionierte Ressourcen (bundle.a1b2c3.js)
Vorteile
- Schnellste Ladezeit
- Offline-fähig nach erstem Laden
- Minimale Netzwerknutzung
Nachteile
- Veraltete Inhalte möglich
- Updates erfordern Cache-Invalidierung
Network First (Network Falling Back to Cache)
Funktionsweise
- Netzwerk-Request versuchen
- Bei Erfolg: Response cachen und zurückgeben
- Bei Fehler: Gecachte Response als Fallback
Implementierung
// Vanilla JavaScript
self.addEventListener('fetch', (event) => {
event.respondWith(
fetch(event.request)
.then(response => {
const clone = response.clone();
caches.open('api-cache')
.then(cache => cache.put(event.request, clone));
return response;
})
.catch(() => caches.match(event.request))
);
});
// Mit Workbox
import { NetworkFirst } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/'),
new NetworkFirst({
cacheName: 'api-cache',
networkTimeoutSeconds: 3,
})
);
Anwendungsfälle
- API-Endpoints mit aktuellen Daten
- Bestandsinformationen
- Preisdaten
- Nutzerspezifische Inhalte
Vorteile
- Immer aktuelle Daten (wenn online)
- Offline-Fallback verfügbar
- Gute Balance zwischen Aktualität und Verfügbarkeit
Nachteile
- Langsamere Initialantwort
- Netzwerk-Abhängigkeit
Stale-While-Revalidate
Funktionsweise
- Sofort gecachte Response zurückgeben (falls vorhanden)
- Parallel: Netzwerk-Request im Hintergrund
- Cache mit neuer Response aktualisieren
Implementierung
// Vanilla JavaScript
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.open('swr-cache').then(cache => {
return cache.match(event.request).then(cachedResponse => {
const fetchPromise = fetch(event.request).then(networkResponse => {
cache.put(event.request, networkResponse.clone());
return networkResponse;
});
return cachedResponse || fetchPromise;
});
})
);
});
// Mit Workbox
import { StaleWhileRevalidate } from 'workbox-strategies';
registerRoute(
({ url }) => url.pathname.startsWith('/api/config'),
new StaleWhileRevalidate({
cacheName: 'config-cache',
})
);
Anwendungsfälle
- Konfigurationsdaten
- Feature-Flags
- Benutzerprofile
- Inhalte mit moderater Aktualitätsanforderung
Vorteile
- Sofortige Antwort
- Hintergrund-Aktualisierung
- Gute User Experience
Nachteile
- Erste Antwort möglicherweise veraltet
- Ständige Netzwerk-Requests
Best Practices
1. Cache-Versionierung
const CACHE_VERSION = 'v2';
const CACHE_NAMES = {
static: `static-${CACHE_VERSION}`,
api: `api-${CACHE_VERSION}`,
images: `images-${CACHE_VERSION}`,
};
// Alte Caches beim Aktivieren löschen
self.addEventListener('activate', (event) => {
event.waitUntil(
caches.keys().then(keys => {
return Promise.all(
keys
.filter(key => !Object.values(CACHE_NAMES).includes(key))
.map(key => caches.delete(key))
);
})
);
});
2. Cache-Größe begrenzen
// Mit Workbox ExpirationPlugin
import { ExpirationPlugin } from 'workbox-expiration';
new CacheFirst({
cacheName: 'images',
plugins: [
new ExpirationPlugin({
maxEntries: 50,
maxAgeSeconds: 30 * 24 * 60 * 60, // 30 Tage
}),
],
});
3. Nur erfolgreiche Responses cachen
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
new NetworkFirst({
cacheName: 'api',
plugins: [
new CacheableResponsePlugin({
statuses: [0, 200],
}),
],
});
4. Cache-Key-Normalisierung
// Query-Parameter ignorieren
registerRoute(
({ url }) => url.pathname.startsWith('/api/public'),
new CacheFirst({
cacheName: 'public-api',
plugins: [{
cacheKeyWillBeUsed: async ({ request }) => {
const url = new URL(request.url);
url.search = ''; // Query-Parameter entfernen
return url.href;
},
}],
})
);
Häufige Fehler vermeiden
| Fehler | Lösung |
|---|
| Authentifizierte Daten ohne User-Context cachen | Cache-Key um User-ID erweitern |
| Keine Cache-Invalidierung | Cache-Versionierung implementieren |
| Unbegrenzte Cache-Größe | ExpirationPlugin verwenden |
| POST-Requests cachen | Nur GET-Requests cachen |
| Sensitive Daten cachen | Kein Caching für /auth, /login |
| Fehlende Offline-Fallback-Seite | Offline-Page precachen |
Strategie-Auswahl-Matrix
| Resource-Typ | Empfohlene Strategie | Cache-TTL |
|---|
| JavaScript/CSS (versioniert) | Cache First | 1 Jahr |
| Fonts | Cache First | 1 Jahr |
| Statische Bilder | Cache First | 30 Tage |
| User-Avatar | Stale-While-Revalidate | 7 Tage |
| API: Konfiguration | Stale-While-Revalidate | 1 Stunde |
| API: User-Daten | Network First | 5 Minuten |
| API: Echtzeit-Daten | Network Only | – |
| Analytics | Network Only | – |
Workbox Strategien
| Workbox-Klasse | Entsprechende Strategie |
|---|
| CacheFirst | Cache First |
| NetworkFirst | Network First |
| StaleWhileRevalidate | Stale-While-Revalidate |
| CacheOnly | Cache Only |
| NetworkOnly | Network Only |
Verwandte Themen
- Cache API
- Workbox
- HTTP-Caching (Cache-Control)
- CDN-Caching
- IndexedDB
CFTools Software implementiert optimale Caching-Strategien für maximale Web-Performance.