Signatur
Beschreibung
In Web Workern, Shared Workern und Service Workern gibt es kein window und damit auch kein window.navigator. Dafür stellt der globale Worker-Kontext (WorkerGlobalScope) über self.navigator bzw. einfach navigator ein WorkerNavigator-Objekt bereit. Das ist eine abgespeckte Version von Navigator und enthält nur Informationen und APIs, die ohne DOM sinnvoll sind.
Typische Einsatzzwecke sind:
- Online-Status prüfen mit
navigator.onLine, z. B. bevor ein Worker Daten synchronisiert. - Parallelität festlegen mit
navigator.hardwareConcurrency, um die Zahl weiterer Sub-Worker oder Arbeitspakete anzupassen. - Sprache und Umgebung über
navigator.language,navigator.languagesundnavigator.userAgentauslesen, etwa für die Formatierung mitIntl. - Weitere Worker-taugliche APIs wie
navigator.storage(StorageManager),navigator.locks(Web Locks),navigator.permissions,navigator.gpu(WebGPU) odernavigator.connection, soweit der Browser sie unterstützt.
Die Eigenschaft selbst ist schreibgeschützt und hat keine Parameter. Das zurückgegebene Objekt bleibt während der Lebensdauer des Workers dasselbe.
Rückgabewert
WorkerNavigator-Objekt des aktuellen Workers mit Eigenschaften wie onLine, language, languages, userAgent, hardwareConcurrency sowie optionalen APIs wie storage, locks und permissions.Beispiele
Umgebungsinformationen im Worker auslesen
// worker.js
const info = {
onLine: navigator.onLine,
language: navigator.language,
cores: navigator.hardwareConcurrency,
isWorkerNavigator: self.navigator instanceof WorkerNavigator
};
postMessage(info);
// main.js
const worker = new Worker('worker.js');
worker.onmessage = (event) => console.log(event.data);
Arbeit nach Anzahl der CPU-Kerne aufteilen
// worker.js – verteilt eine große Berechnung auf Sub-Worker
self.onmessage = async ({ data: numbers }) => {
const poolSize = Math.max(1, (navigator.hardwareConcurrency ?? 2) - 1);
const chunkSize = Math.ceil(numbers.length / poolSize);
const chunks = Array.from({ length: poolSize }, (_, i) =>
numbers.slice(i * chunkSize, (i + 1) * chunkSize)
);
// Hier nur synchron summiert, um das Prinzip zu zeigen
const sums = chunks.map((chunk) => chunk.reduce((a, b) => a + b, 0));
postMessage({ poolSize, total: sums.reduce((a, b) => a + b, 0) });
};
Offline-Sync im Service Worker mit Web Locks
// sw.js
const syncQueue = async () => {
if (!navigator.onLine) {
console.log('Offline – Synchronisation verschoben');
return;
}
// Sicherstellen, dass nur ein Kontext gleichzeitig synchronisiert
await navigator.locks.request('sync-queue', async () => {
const response = await fetch('/api/sync', { method: 'POST' });
console.log('Sync-Status:', response.status);
});
};
self.addEventListener('message', (event) => {
if (event.data === 'sync') event.waitUntil(syncQueue());
});
Speicherkontingent im Worker prüfen
// worker.js
const checkQuota = async () => {
if (!('storage' in navigator)) return 'StorageManager nicht verfügbar';
const { usage, quota } = await navigator.storage.estimate();
return `${(usage / 1024 / 1024).toFixed(1)} MB von ${(quota / 1024 / 1024).toFixed(0)} MB belegt`;
};
checkQuota().then((msg) => postMessage(msg));
// Wichtig · Fallstricke
- Kein vollständiger
Navigator:WorkerNavigatorhat weniger Mitglieder. Fensterbezogene APIs wienavigator.clipboard,navigator.geolocation,navigator.mediaDevices,navigator.share()odernavigator.vibrate()fehlen im Worker. Vor der Nutzung optionaler APIs immer per Feature-Detection prüfen ('locks' in navigator). onLineist nur ein Hinweis:truebedeutet lediglich, dass eine Netzwerkverbindung besteht, nicht aber, dass der Server erreichbar ist. Netzwerkfehler beifetch()trotzdem abfangen. Die Ereignisseonline/offlinewerden in Workern je nach Browser unterschiedlich zuverlässig ausgelöst.hardwareConcurrencykann aus Datenschutzgründen (Schutz vor Fingerprinting) gerundet oder begrenzt sein, besonders in Safari und Firefox mit aktivem Fingerprint-Schutz.userAgentwird durch User-Agent-Reduktion zunehmend vereinfacht; für die Erkennung istnavigator.userAgentData(nur Chromium, auch in Workern) oder besser Feature-Detection vorzuziehen.- Die Eigenschaft ist schreibgeschützt; eine Zuweisung an
self.navigatorwird im nicht-strikten Modus stillschweigend ignoriert. - Kompatibilität:
WorkerGlobalScope.navigatorwird von allen modernen Browsern in dedizierten Workern, Shared Workern und Service Workern unterstützt; die Verfügbarkeit einzelner Unter-APIs ist unterschiedlich.