Start · Sprachen · JavaScript · Referenz · WorkerGlobalScope.navigator

WorkerGlobalScope.navigator

Eigenschaft

Die schreibgeschützte Eigenschaft <code>navigator</code> liefert innerhalb eines Workers das zugehörige <code>WorkerNavigator</code>-Objekt.

seit JavaScript Baseline: alle modernen Browser Kategorie: webapi

Signatur

WorkerGlobalScope.navigator

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.languages und navigator.userAgent auslesen, etwa für die Formatierung mit Intl.
  • Weitere Worker-taugliche APIs wie navigator.storage (StorageManager), navigator.locks (Web Locks), navigator.permissions, navigator.gpu (WebGPU) oder navigator.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

Typ
WorkerNavigator
Beschreibung
Das 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);
{ onLine: true, language: 'de-DE', cores: 8, isWorkerNavigator: true }

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) });
};
{ poolSize: 7, total: 500500 }

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());
});
Sync-Status: 200

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));
2.4 MB von 10240 MB belegt

// Wichtig · Fallstricke

  • Kein vollständiger Navigator: WorkerNavigator hat weniger Mitglieder. Fensterbezogene APIs wie navigator.clipboard, navigator.geolocation, navigator.mediaDevices, navigator.share() oder navigator.vibrate() fehlen im Worker. Vor der Nutzung optionaler APIs immer per Feature-Detection prüfen ('locks' in navigator).
  • onLine ist nur ein Hinweis: true bedeutet lediglich, dass eine Netzwerkverbindung besteht, nicht aber, dass der Server erreichbar ist. Netzwerkfehler bei fetch() trotzdem abfangen. Die Ereignisse online/offline werden in Workern je nach Browser unterschiedlich zuverlässig ausgelöst.
  • hardwareConcurrency kann aus Datenschutzgründen (Schutz vor Fingerprinting) gerundet oder begrenzt sein, besonders in Safari und Firefox mit aktivem Fingerprint-Schutz.
  • userAgent wird durch User-Agent-Reduktion zunehmend vereinfacht; für die Erkennung ist navigator.userAgentData (nur Chromium, auch in Workern) oder besser Feature-Detection vorzuziehen.
  • Die Eigenschaft ist schreibgeschützt; eine Zuweisung an self.navigator wird im nicht-strikten Modus stillschweigend ignoriert.
  • Kompatibilität: WorkerGlobalScope.navigator wird von allen modernen Browsern in dedizierten Workern, Shared Workern und Service Workern unterstützt; die Verfügbarkeit einzelner Unter-APIs ist unterschiedlich.