Nie wszystkie miejsca na dane są sobie równe: wprowadzenie zasobników pamięci masowej

Storage Standard definiuje interfejs API do szacowania limitów i trwałego miejsca na dane oraz architekturę miejsca na dane na platformie. Wprowadzamy interfejs API, który pozwoli Ci lepiej przewidywać usuwanie trwałego miejsca na dane w przypadku dużego obciążenia pamięci. Jest ona dostępna od wersji Chromium 122.

Jaki problem rozwiązuje standard pamięci masowej?

Tradycyjnie, gdy użytkownikowi kończy się miejsce na urządzeniu, dane przechowywane za pomocą interfejsów API, takich jak IndexedDB czy localStorage, są tracone bez możliwości interwencji użytkownika. Aby zapewnić trwałość pamięci, należy wywołać metodę persist() w interfejsie StorageManager. Jednocześnie prosi użytkownika o pozwolenie i po jego udzieleniu zmienia miejsce przechowywania na stałe:

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

Ta metoda żądania trwałego przechowywania danych to wszystko albo nic. Nie ma możliwości określenia bardziej szczegółowych potrzeb dotyczących trwałości. Jest to jeden zasobnik pamięci.

Interfejs Storage Buckets API

Głównym założeniem interfejsu Storage Buckets API jest umożliwienie witrynom tworzenia wielu zasobników danych, z których każdy może być usuwany przez przeglądarkę niezależnie od innych. Umożliwia to deweloperom określenie priorytetów usuwania, aby mieć pewność, że nie zostaną usunięte najcenniejsze dane.

Przykład zastosowania

Aby zilustrować, kiedy przydadzą się zasobniki danych, wyobraź sobie aplikację poczty e-mail. Niedopuszczalne byłoby, gdyby aplikacja utraciła niewysłane wersje robocze użytkownika, które istnieją tylko na kliencie. Jeśli natomiast są one przechowywane na serwerze, użytkownik prawdopodobnie nie będzie miał nic przeciwko usunięciu z klienta niektórych najstarszych e-maili, jeśli jego przeglądarka będzie miała problemy z miejscem na dane.

Interfejs aplikacji do poczty e-mail
Aplikacja poczty e-mail z oddzielnymi zasobami pamięci dla skrzynki odbiorczej i wersji roboczych. (Tylko do celów poglądowych. Niekoniecznie odzwierciedla to działanie Gmaila).

Korzystanie z interfejsu Storage Buckets API

Tworzenie nowego zasobnika na dane

Nowy zasobnik można utworzyć za pomocą metody open() w interfejsie StorageBucketManager.

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

Tworzenie nowego trwałego zasobnika na dane

Aby mieć pewność, że zasobnik na dane będzie utrwalony, możesz przekazać argumenty opcji durability i persisted do metody open():

  • persisted określa, czy zasobnik pamięci ma być trwały. Dozwolone wartości to false (domyślnie) lub true.
  • durability udostępnia wskazówkę dla przeglądarki, która pomaga obniżyć wydajność zapisu i zmniejszyć ryzyko utraty danych w przypadku awarii zasilania. Dozwolone wartości to 'relaxed' (domyślnie) lub 'strict':

    • Zasobniki ('strict') próbują zminimalizować ryzyko utraty danych w przypadku awarii zasilania. Może to pociągać za sobą zmniejszenie wydajności, co oznacza, że odczyt może trwać dłużej, może wpływać na ogólną wydajność systemu, zużywać więcej energii baterii oraz szybciej wyczerpywać pamięć masową.
    • Zasobniki ('relaxed') mogą „zapomnieć” zapisy, które zostały ukończone w ciągu ostatnich kilku sekund, gdy wystąpi utrata mocy. W efekcie zapisywanie danych do tych zasobników może przynieść lepsze wyniki, wydłużyć czas pracy na baterii i wydłużyć żywotność urządzenia. Ponadto awaria zasilania nie spowoduje uszkodzenia danych w większym stopniu niż w przypadku zasobników 'strict'.
// 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`.
});

Dostęp do interfejsów API pamięci masowej z zasobnika na dane

Każdy zasobnik na dane jest powiązany z interfejsami API pamięci masowej, na przykład IndexedDB, Cache lub File. Te interfejsy API do przechowywania danych działają tak jak zwykle, ale punktem wejścia jest na przykład interfejs StorageBucket.

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);
});

Debugowanie zasobników pamięci masowej w Narzędziach deweloperskich

Sprawdzaj zasobniki danych w specjalnym drzewku w sekcji Aplikacja > Miejsce na dane.

Drzewo zasobników na dane przed włączeniem i po jego włączeniu w sekcji Miejsce na dane.

Przydatne materiały