Nicht jeder Speicher ist gleich: Jetzt neu: Storage-Buckets

Der Storage Standard definiert eine API für nichtflüchtigen Speicher und Kontingentschätzungen sowie die Speicherarchitektur der Plattform. Wir führen eine API ein, mit der die dauerhafte Bereinigung von Speicher unter hoher Speicherauslastung vorhersehbarer wird. Sie ist ab Chromium 122 verfügbar.

Welches Problem löst der Speicherstandard?

Wenn dem Nutzer normalerweise der Speicherplatz auf seinem Gerät ausgeht, gehen die mit APIs wie IndexedDB oder localStorage gespeicherten Daten verloren, ohne dass der Nutzer eingreifen kann. Eine Möglichkeit, Speicher dauerhaft zu machen, besteht darin, die Methode persist() der StorageManager-Schnittstelle aufzurufen. Gleichzeitig wird der Endnutzer um die Berechtigung gebeten und der Speicher wird nach der Erteilung in nichtflüchtigen Speicher geändert:

const persisted = await navigator.storage.persist();
if (persisted) {
  /* Storage will not be cleared except by explicit user action. */
}

Bei dieser Methode wird der Speicher beibehalten – ganz oder gar nicht. Es gibt keine Möglichkeit, genauere Persistenzanforderungen auszudrücken. Das ist alles ein Storage-Bucket.

Storage Buckets API

Das Kernkonzept der Storage Buckets API besteht darin, Websites die Möglichkeit zu geben, mehrere Storage-Buckets zu erstellen, wobei der Browser jeden Bucket unabhängig von anderen Buckets löschen kann. Auf diese Weise können Entwickler die Bereinigung priorisieren, um sicherzustellen, dass die wertvollsten Daten nicht gelöscht werden.

Anwendungsfallbeispiel

Um zu veranschaulichen, wo sich Storage-Buckets als nützlich erweisen würden, stellen Sie sich eine E-Mail-Anwendung vor. Es wäre unmöglich, wenn die Anwendung nicht gesendete Entwürfe des Nutzers verloren hätte, die nur auf dem Client vorhanden sind. Sind sie hingegen auf einem Server gespeichert, wäre es wahrscheinlich recht, wenn einige der ältesten E-Mails im Posteingang aus dem Client entfernt werden, wenn ihr Browser unter hoher Speicherauslastung steht.

Benutzeroberfläche der E-Mail-App
E-Mail-App mit separaten Storage-Buckets für Posteingang und Entwürfe. (Nur zur Veranschaulichung: Dies entspricht nicht unbedingt der Funktionsweise von Gmail.)

Storage Buckets API verwenden

Neuen Storage-Bucket erstellen

Mit der Methode open() auf der StorageBucketManager-Oberfläche kann ein neuer Storage-Bucket erstellt werden.

// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');

Persistenten neuen Storage-Bucket erstellen

Damit der Storage-Bucket beibehalten wird, können Sie die Optionsargumente durability und persisted an die Methode open() übergeben:

  • persisted bestimmt, ob der Storage-Bucket beibehalten werden soll. Die zulässigen Werte sind false (Standardeinstellung) oder true.
  • durability gibt dem Browser einen Hinweis, damit er die Schreibleistung bei einem Stromausfall gegen ein geringeres Risiko von Datenverlusten abwägen kann. Die zulässigen Werte sind 'relaxed' (Standardeinstellung) oder 'strict':

    • 'strict' Buckets versuchen, das Risiko eines Datenverlusts bei einem Stromausfall zu minimieren. Dies kann zu Leistungseinbußen führen. Das bedeutet, dass Schreibvorgänge länger dauern, die gesamte Systemleistung beeinträchtigen, mehr Akkuleistung verbrauchen und das Speichergerät schneller verschleißen.
    • 'relaxed'-Buckets können Schreibvorgänge, die in den letzten Sekunden abgeschlossen wurden, bei einem Stromausfall „vergessen“. Im Gegenzug kann das Schreiben von Daten in diese Buckets bessere Leistungsmerkmale haben, die Akkulaufzeit verlängern und die Lebensdauer des Speichergeräts verlängern. Außerdem führt der Stromausfall nicht mit einer höheren Rate zu Datenbeschädigungen als bei 'strict'-Buckets.
// Create a storage bucket for email drafts that only exist on the client.
const draftsBucket = await navigator.storageBuckets.open('drafts', {
  durability: 'strict', // Or `'relaxed'`.
  persisted: true, // Or `false`.
});

Storage-APIs über einen Storage-Bucket aufrufen

Jeder Storage-Bucket ist Speicher-APIs wie IndexedDB, der Cache-Schnittstelle oder der Datei-Schnittstelle zugeordnet. Diese Storage APIs funktionieren wie gewohnt, nur dass der Einstiegspunkt von der StorageBucket-Schnittstelle aus ist, z. B. StorageBucket.indexedDB.

const inboxDb = await new Promise(resolve => {
  const request = inboxBucket.indexedDB.open('messages');
  request.onupgradeneeded = () => { /* migration code */ };
  request.onsuccess = () => resolve(request.result);
  request.onerror = () => reject(request.error);
});

Nützliches Infomaterial