Start · Sprachen · JavaScript · Referenz · StorageManager.persisted()

StorageManager.persisted()

Methode

Gibt ein <code>Promise&lt;boolean&gt;</code> zurück, das sich zu <code>true</code> auflöst, wenn der Speicher des aktuellen Ursprungs als persistent markiert ist.

seit JavaScript Baseline 2023: Chrome 55+, Edge 79+, Firefox 57+, Kategorie: webapi

Signatur

StorageManager.prototype.persisted()

Beschreibung

Mit navigator.storage.persisted() fragen Sie ab, ob der Speicher des aktuellen Ursprungs (IndexedDB, Cache API, OPFS, Service-Worker-Registrierungen usw.) im Modus persistent läuft. Ist das der Fall, löscht der Browser diese Daten bei Speicherknappheit nicht automatisch. Nur der Nutzer kann sie dann entfernen, zum Beispiel über die Browsereinstellungen.

Standardmäßig ist Speicher im Modus best-effort: Wird der Platz knapp, darf der Browser die Daten ohne Rückfrage verwerfen, meist nach dem LRU-Prinzip (die am längsten nicht genutzten zuerst). Für Offline-Apps, lokale Entwürfe oder heruntergeladene Medien ist das riskant. Mit persisted() prüfen Sie den aktuellen Zustand, bevor Sie gegebenenfalls über persist() den persistenten Modus anfordern.

Die Methode verändert nichts und zeigt dem Nutzer keinen Dialog. Sie eignet sich deshalb gut für Statusanzeigen, für die Diagnose oder als Vorabprüfung, damit Sie persist() nicht unnötig aufrufen.

Rückgabewert

Typ
Promise<boolean>
Beschreibung
Ein Promise, das sich zu true auflöst, wenn der Speicher persistent ist, sonst zu false (Modus best-effort). Wird mit TypeError abgelehnt, wenn der Ursprung keinen Zugriff auf Speicher hat, etwa bei einem opaken Ursprung.

Beispiele

Persistenz-Status abfragen

const checkPersistence = async () => {
  if (!navigator.storage?.persisted) {
    console.log('StorageManager API nicht verfügbar');
    return;
  }
  const isPersisted = await navigator.storage.persisted();
  console.log(`Speicher persistent: ${isPersisted}`);
};

checkPersistence();
Speicher persistent: false

Nur bei Bedarf Persistenz anfordern

const ensurePersistentStorage = async () => {
  // Erst prüfen, dann gezielt anfordern
  if (await navigator.storage.persisted()) {
    return true;
  }
  const granted = await navigator.storage.persist();
  console.log(granted
    ? 'Persistenter Speicher wurde gewährt.'
    : 'Speicher bleibt im Modus best-effort.');
  return granted;
};

// Zum Beispiel nach dem ersten Speichern eines Offline-Dokuments
document.querySelector('#save-offline')
  ?.addEventListener('click', ensurePersistentStorage);
Persistenter Speicher wurde gewährt.

Status zusammen mit der Speichernutzung anzeigen

const showStorageInfo = async () => {
  const [persisted, { usage, quota }] = await Promise.all([
    navigator.storage.persisted(),
    navigator.storage.estimate()
  ]);
  const mb = (bytes) => (bytes / 1024 / 1024).toFixed(1);
  console.log(`Modus: ${persisted ? 'persistent' : 'best-effort'}`);
  console.log(`Belegt: ${mb(usage)} MB von ${mb(quota)} MB`);
};

showStorageInfo();
Modus: best-effort Belegt: 12.4 MB von 2048.0 MB

// Wichtig · Fallstricke

  • Nur in sicheren Kontexten: navigator.storage gibt es nur unter HTTPS oder localhost. Prüfen Sie vor dem Aufruf, ob die API vorhanden ist.
  • Auch in Workern verfügbar: über self.navigator.storage.persisted(), zum Beispiel im Service Worker.
  • Persistent heißt nicht unlöschbar: Der Nutzer kann die Daten weiterhin manuell löschen. Im privaten Modus werden sie beim Schließen trotzdem verworfen.
  • Unterschiede zwischen Browsern: Chrome entscheidet über persist() anhand von Heuristiken wie Lesezeichen, Installation als PWA oder Nutzungsintensität, ohne Dialog. Firefox fragt den Nutzer. Safari wendet zusätzlich eigene Löschregeln an (ITP, 7-Tage-Grenze für Skript-Speicher bei nicht installierten Web-Apps). Verlassen Sie sich deshalb nie allein auf true.
  • Der Status kann sich zwischen zwei Sitzungen ändern, etwa wenn der Nutzer die Berechtigung zurückzieht. Fragen Sie ihn daher nach Bedarf erneut ab, statt ihn dauerhaft zwischenzuspeichern.
  • localStorage und sessionStorage gehören ebenfalls zum Speicherbereich des Ursprungs. Für größere Datenmengen empfiehlt sich trotzdem IndexedDB.