Start · Sprachen · JavaScript · Referenz · ServiceWorker.scriptURL

ServiceWorker.scriptURL

Eigenschaft

Liefert die absolute, serialisierte URL des Skripts, mit dem der <code>ServiceWorker</code> über <code>navigator.serviceWorker.register()</code> registriert wurde.

seit JavaScript Baseline: alle modernen Browser (seit 2018) Kategorie: webapi

Signatur

ServiceWorker.scriptURL

Beschreibung

Die schreibgeschützte Eigenschaft scriptURL eines ServiceWorker-Objekts gibt die URL des Worker-Skripts als String zurück. Die URL ist immer absolut und serialisiert, auch wenn bei register() ein relativer Pfad wie './sw.js' angegeben wurde. Die Auflösung erfolgt relativ zur Basis-URL des registrierenden Dokuments.

Nützlich ist die Eigenschaft vor allem zum Debuggen und Überwachen: Man kann damit feststellen, welches Skript gerade aktiv ist, wartet oder installiert wird, zum Beispiel wenn während einer Migration mehrere Skriptnamen (sw-v1.js, sw-v2.js) im Umlauf sind oder eine Versionsnummer als Query-Parameter angehängt wird.

Erreichbar ist ein ServiceWorker-Objekt über registration.installing, registration.waiting, registration.active oder navigator.serviceWorker.controller. Innerhalb des Workers selbst gibt es self.serviceWorker.scriptURL (neuere Browser) bzw. alternativ self.location.href.

Rückgabewert

Typ
string
Beschreibung
Die absolute URL des Service-Worker-Skripts, inklusive Query-String (z. B. https://example.com/sw.js?v=3).

Beispiele

Skript-URL nach der Registrierung ausgeben

const registerWorker = async () => {
  if (!('serviceWorker' in navigator)) return;
  const reg = await navigator.serviceWorker.register('./sw.js');
  // Der Worker kann sich in unterschiedlichen Zuständen befinden
  const worker = reg.installing ?? reg.waiting ?? reg.active;
  console.log('Skript:', worker.scriptURL);
};

registerWorker();
Skript: https://example.com/sw.js

Prüfen, welche Version die Seite gerade steuert

const EXPECTED = new URL('/sw.js?v=3', location.origin).href;

const controller = navigator.serviceWorker.controller;
if (!controller) {
  console.log('Seite wird (noch) von keinem Service Worker gesteuert.');
} else if (controller.scriptURL !== EXPECTED) {
  console.warn('Veralteter Worker aktiv:', controller.scriptURL);
} else {
  console.log('Aktuelle Version aktiv.');
}
Veralteter Worker aktiv: https://example.com/sw.js?v=2

Alle Registrierungen mit ihren Skripten auflisten

const listWorkers = async () => {
  const regs = await navigator.serviceWorker.getRegistrations();
  for (const reg of regs) {
    const { installing, waiting, active } = reg;
    console.table({
      scope: reg.scope,
      installing: installing?.scriptURL ?? '-',
      waiting: waiting?.scriptURL ?? '-',
      active: active?.scriptURL ?? '-'
    });
  }
};

listWorkers();

Neuen Worker beim Update erkennen

navigator.serviceWorker.ready.then((reg) => {
  reg.addEventListener('updatefound', () => {
    const next = reg.installing;
    console.log('Neuer Worker wird installiert:', next.scriptURL);
    next.addEventListener('statechange', () => {
      console.log(next.scriptURL, '→', next.state);
    });
  });
});
Neuer Worker wird installiert: https://example.com/sw.js https://example.com/sw.js → installed

// Wichtig · Fallstricke

  • Immer absolut: Ein Vergleich mit dem relativen Pfad aus register('./sw.js') schlägt fehl. Vergleichswerte erst mit new URL(pfad, location.href).href normalisieren.
  • Nur lesbar: Eine Zuweisung hat keine Wirkung (im Strict Mode gibt es einen TypeError). Wer das Skript wechseln will, muss register() erneut mit der neuen URL aufrufen.
  • Nicht mit scope verwechseln: Der Geltungsbereich steht in ServiceWorkerRegistration.scope, nicht in scriptURL.
  • navigator.serviceWorker.controller ist beim ersten Laden und bei einem harten Neuladen (Umschalt+F5) null, also vor dem Zugriff auf scriptURL prüfen.
  • Service Worker gibt es nur in sicheren Kontexten (HTTPS oder localhost). Im privaten Modus von Firefox fehlt die API. Die Eigenschaft selbst wird von allen modernen Browsern unterstützt.