Start · Sprachen · JavaScript · Referenz · WorkerNavigator

WorkerNavigator

Schnittstelle

Stellt innerhalb eines Workers über <code>self.navigator</code> eine eingeschränkte Teilmenge des <code>Navigator</code>-Interfaces bereit, etwa Sprache, Online-Status und Hardware-Infos.

seit JavaScript Baseline: alle modernen Browser (Web Worker) Kategorie: webapi

Signatur

interface WorkerNavigator

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-Pools
  • language und languages: bevorzugte Sprachen des Nutzers
  • onLine: aktueller Netzwerkstatus als Boolean
  • userAgent, platform, appName, appVersion, product: veraltete Kennungen des Browsers
  • userAgentData: 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

Typ
WorkerNavigator
Beschreibung
Wird über 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-Infos: { isWorkerNavigator: true, language: 'de-DE', languages: ['de-DE', 'de', 'en'], onLine: true, cores: 8 }

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 });
{ poolSize: 7, 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();
Belegt: 2.3 MB von 1200 MB Exklusive Sperre erhalten – Synchronisierung läuft

// Wichtig · Fallstricke

  • Kein Konstruktor: new WorkerNavigator() wirft einen TypeError. Man nutzt immer self.navigator.
  • Nur im Worker verfügbar: Im Hauptthread ist WorkerNavigator nicht definiert. Dort gibt es Navigator. Code, der in beiden Umgebungen läuft, sollte typeof WorkerNavigator !== 'undefined' prüfen.
  • Feature-Erkennung: Welche Eigenschaften es gibt, unterscheidet sich stark zwischen den Browsern. Zum Beispiel gibt es connection und userAgentData nur in Chromium, gpu nicht überall. Viele Funktionen wie storage, locks und gpu setzen außerdem einen sicheren Kontext (HTTPS) voraus. Deshalb vorher mit 'x' in navigator prüfen.
  • onLine ist unzuverlässig: true bedeutet nur, dass eine Netzwerkverbindung besteht, nicht dass das Internet erreichbar ist. Zuverlässiger ist es, fetch-Fehler auszuwerten. Die Events online und offline werden im Worker auf self ausgelö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 mit resistFingerprinting). Deshalb immer einen Ersatzwert vorsehen.
  • Veraltete Eigenschaften: appName, appVersion, platform und product sind nur aus Kompatibilitätsgründen vorhanden. userAgent-Sniffing sollte man vermeiden.