Worker-Typen im Browser
Browser bieten drei verschiedene Worker-Typen für Hintergrundverarbeitung:
- Web Worker – Dedizierter Worker für einen Tab
- Service Worker – Netzwerk-Proxy zwischen App und Server
- Shared Worker – Geteilter Worker für mehrere Tabs
Vergleichsübersicht
| Kriterium | Web Worker | Service Worker | Shared Worker |
|---|---|---|---|
| Zuordnung | 1 Tab | Alle Tabs im Scope | Mehrere Tabs |
| Lebensdauer | Solange Tab offen | Unabhängig von Tabs | Solange mind. 1 Tab verbunden |
| Netzwerkzugriff | Ja (fetch) | Ja + Interception | Ja (fetch) |
| Cache API | Ja | Ja | Ja |
| Push-Nachrichten | Nein | Ja | Nein |
| Background Sync | Nein | Ja | Nein |
| DOM-Zugriff | Nein | Nein | Nein |
| HTTPS erforderlich | Nein | Ja | Nein |
Web Worker
Definition
Dedizierter Worker für rechenintensive Aufgaben, der im Hintergrund-Thread läuft und den Haupt-Thread nicht blockiert.
Anwendungsfälle
- Komplexe Berechnungen
- Datenverarbeitung und Transformation
- Bild- und Videobearbeitung
- Kryptographische Operationen
- Parsing großer Datensätze
Implementierung
// main.js
const worker = new Worker('worker.js');
worker.postMessage({ data: largeDataSet });
worker.onmessage = (event) => {
console.log('Ergebnis:', event.data);
};
// worker.js
self.onmessage = (event) => {
const result = processData(event.data);
self.postMessage(result);
};
Vorteile
- Einfache Implementierung
- Volle Kontrolle über Lebenszyklus
- Keine HTTPS-Anforderung
Nachteile
- Nur für einen Tab
- Keine Netzwerk-Interception
- Keine Push-Benachrichtigungen
Service Worker
Definition
Programmierbarer Netzwerk-Proxy, der zwischen Webanwendung und Netzwerk sitzt. Ermöglicht Offline-Funktionalität, Caching und Push-Benachrichtigungen.
Anwendungsfälle
- Progressive Web Apps (PWA)
- Offline-First-Anwendungen
- Asset-Caching
- API-Response-Caching
- Push-Benachrichtigungen
- Background Sync
Implementierung
// Registration
navigator.serviceWorker.register('/sw.js');
// sw.js
self.addEventListener('fetch', (event) => {
event.respondWith(
caches.match(event.request)
.then(response => response || fetch(event.request))
);
});
Vorteile
- Netzwerk-Interception
- Persistentes Caching
- Push-Benachrichtigungen
- Background Sync
- Kontrolliert alle Tabs im Scope
Nachteile
- HTTPS erforderlich
- Komplexer Lifecycle
- Keine persistenten Verbindungen (WebSocket)
- Kann vom Browser beendet werden
Shared Worker
Definition
Worker, der von mehreren Tabs, Fenstern oder Frames derselben Origin geteilt wird. Ermöglicht Kommunikation und State-Sharing zwischen Tabs.
Anwendungsfälle
- Multi-Tab State-Synchronisation
- Geteilte WebSocket-Verbindung
- Tab-übergreifendes Caching
- Zentrale Datenhaltung
- Ressourcen-Sharing
Implementierung
// main.js (in jedem Tab)
const worker = new SharedWorker('shared-worker.js');
worker.port.start();
worker.port.postMessage({ type: 'subscribe' });
worker.port.onmessage = (event) => {
console.log('Nachricht:', event.data);
};
// shared-worker.js
const connections = [];
self.onconnect = (event) => {
const port = event.ports[0];
connections.push(port);
port.onmessage = (event) => {
// Broadcast an alle verbundenen Tabs
connections.forEach(conn => {
conn.postMessage(event.data);
});
};
port.start();
};
Vorteile
- Tab-übergreifende Kommunikation
- Ressourcen-Sharing
- Eine WebSocket-Verbindung für alle Tabs
- Zentraler State
Nachteile
- Eingeschränkte Browser-Unterstützung (~47% global)
- Nicht auf Chrome Android, Safari iOS
- Keine Netzwerk-Interception
- Keine Push-Benachrichtigungen
Browser-Unterstützung Vergleich
| Worker-Typ | Chrome | Firefox | Safari | Edge | iOS Safari | Chrome Android |
|---|---|---|---|---|---|---|
| Web Worker | 4+ | 3.5+ | 4+ | 12+ | 5+ | 18+ |
| Service Worker | 40+ | 44+ | 11.1+ | 17+ | 11.3+ | 40+ |
| Shared Worker | 5+ | 29+ | 16+ | 79+ | 16+ | Nein |
Wann welchen Worker wählen?
Web Worker wählen wenn:
- Rechenintensive Operationen im Hintergrund
- Einfache Architektur bevorzugt
- Nur ein Tab betroffen
- Keine HTTPS-Umgebung
Service Worker wählen wenn:
- Offline-Funktionalität erforderlich
- Asset- und API-Caching
- Push-Benachrichtigungen
- PWA-Anforderungen
- Netzwerk-Optimierung
Shared Worker wählen wenn:
- Multi-Tab-Synchronisation
- Geteilte WebSocket-Verbindung
- Desktop-fokussierte Anwendung
- Mobile Unterstützung nicht kritisch
Kombinierte Architektur
Für maximale Performance können alle drei Worker-Typen kombiniert werden:
| Aufgabe | Worker-Typ |
|---|---|
| Asset-Caching | Service Worker |
| API-Caching | Service Worker |
| WebSocket-Sharing | Shared Worker |
| Tab-Synchronisation | Shared Worker |
| Datenverarbeitung | Web Worker |
| Push-Nachrichten | Service Worker |
Kommunikation zwischen Workern
// Service Worker -> Clients (alle Tabs)
self.clients.matchAll().then(clients => {
clients.forEach(client => {
client.postMessage({ type: 'update' });
});
});
// Tab -> Service Worker
navigator.serviceWorker.controller.postMessage({ type: 'sync' });
// Shared Worker <-> Tab
sharedWorker.port.postMessage({ type: 'subscribe' });
sharedWorker.port.onmessage = (event) => { /* ... */ };
Verwandte Themen
- Progressive Web Apps (PWA)
- Cache API
- IndexedDB
- BroadcastChannel API
- MessageChannel
- postMessage API
CFTools Software implementiert Worker-basierte Architekturen für performante Web-Anwendungen.