Signatur
Beschreibung
WorkerNavigator ist das Gegenstück zu window.navigator für Web Worker, Shared Worker und Service Worker. Eine Instanz erzeugt man nicht selbst: Sie steht im Worker-Kontext über self.navigator (bzw. einfach navigator) bereit, also als Eigenschaft von WorkerGlobalScope.
Weil Worker weder auf das DOM noch auf fensterbezogene Funktionen zugreifen können, enthält das Interface nur die Teile, die ohne Fenster sinnvoll sind. Dazu gehören unter anderem:
hardwareConcurrency: Anzahl der logischen CPU-Kerne, nützlich für die Größe von Worker-Poolslanguageundlanguages: bevorzugte Sprachen des NutzersonLine: aktueller Netzwerkstatus als BooleanuserAgent,platform,appName,appVersion,product: veraltete Kennungen des BrowsersuserAgentData: User-Agent Client Hints (nur Chromium)storage(StorageManager),locks(LockManager),permissions,connection,gpu,mediaCapabilities,serial,usb,hid, je nach Browser und sicherem Kontext
Praktisch nutzt man WorkerNavigator vor allem, um Rechenarbeit passend zur Hardware zu verteilen, um im Service Worker nach der Sprache oder dem Online-Status zu entscheiden und um Speicher und Sperren über navigator.storage bzw. navigator.locks direkt im Worker zu verwalten.
Eigenschaften, die nur im Fenster sinnvoll sind, gibt es hier nicht, zum Beispiel clipboard, geolocation, mediaDevices, serviceWorker (in Service Workern), share() oder vibrate(). Deshalb sollte man jede Funktion vor der Nutzung mit einer Feature-Erkennung prüfen.
Rückgabewert
self.navigator im Worker-Kontext bereitgestellt. Das Objekt ist schreibgeschützt und kann nicht mit new erzeugt werden.Beispiele
Zugriff auf navigator im Dedicated Worker
// main.js
const worker = new Worker('info-worker.js');
worker.onmessage = ({ data }) => console.log('Worker-Infos:', data);
// info-worker.js
const info = {
isWorkerNavigator: self.navigator instanceof WorkerNavigator,
language: navigator.language,
languages: navigator.languages,
onLine: navigator.onLine,
cores: navigator.hardwareConcurrency
};
postMessage(info);
Worker-Pool passend zur CPU-Kernzahl (verschachtelte Worker)
// pool-worker.js – verteilt Arbeit auf Unter-Worker
const poolSize = Math.max(1, (navigator.hardwareConcurrency ?? 4) - 1);
const chunks = Array.from({ length: poolSize }, (_, i) => i);
const results = await Promise.all(
chunks.map((chunk) => new Promise((resolve) => {
const sub = new Worker('compute.js');
sub.onmessage = (e) => { resolve(e.data); sub.terminate(); };
sub.postMessage({ chunk, total: poolSize });
}))
);
postMessage({ poolSize, results });
Service Worker: Offline-Fallback und Sprache berücksichtigen
// sw.js
self.addEventListener('fetch', (event) => {
if (event.request.mode !== 'navigate') return;
event.respondWith((async () => {
if (!navigator.onLine) {
const lang = navigator.language.startsWith('de') ? 'de' : 'en';
const cached = await caches.match(`/offline-${lang}.html`);
if (cached) return cached;
}
return fetch(event.request);
})());
});
Speicherkontingent und Web Locks im Worker nutzen
// storage-worker.js
const report = async () => {
if ('storage' in navigator) {
const { usage, quota } = await navigator.storage.estimate();
console.log(`Belegt: ${(usage / 1e6).toFixed(1)} MB von ${(quota / 1e6).toFixed(0)} MB`);
}
if ('locks' in navigator) {
await navigator.locks.request('db-sync', async () => {
console.log('Exklusive Sperre erhalten – Synchronisierung läuft');
});
}
};
report();
// Wichtig · Fallstricke
- Kein Konstruktor:
new WorkerNavigator()wirft einenTypeError. Man nutzt immerself.navigator. - Nur im Worker verfügbar: Im Hauptthread ist
WorkerNavigatornicht definiert. Dort gibt esNavigator. Code, der in beiden Umgebungen läuft, solltetypeof WorkerNavigator !== 'undefined'prüfen. - Feature-Erkennung: Welche Eigenschaften es gibt, unterscheidet sich stark zwischen den Browsern. Zum Beispiel gibt es
connectionunduserAgentDatanur in Chromium,gpunicht überall. Viele Funktionen wiestorage,locksundgpusetzen außerdem einen sicheren Kontext (HTTPS) voraus. Deshalb vorher mit'x' in navigatorprüfen. onLineist unzuverlässig:truebedeutet nur, dass eine Netzwerkverbindung besteht, nicht dass das Internet erreichbar ist. Zuverlässiger ist es,fetch-Fehler auszuwerten. Die Eventsonlineundofflinewerden im Worker aufselfausgelöst, in manchen Browsern aber nicht zuverlässig.hardwareConcurrency: Browser können den Wert zum Schutz vor Fingerprinting begrenzen oder verfälschen (etwa Safari, oder Firefox mitresistFingerprinting). Deshalb immer einen Ersatzwert vorsehen.- Veraltete Eigenschaften:
appName,appVersion,platformundproductsind nur aus Kompatibilitätsgründen vorhanden.userAgent-Sniffing sollte man vermeiden.