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

Standard pamięci masowej definiuje interfejs API do szacowania trwałej pamięci masowej i limitu oraz architekturę pamięci masowej platformy. Wprowadzamy interfejs API, który sprawi, że trwałe usuwanie miejsca na dane w przypadku dużego obciążenia pamięci będzie bardziej przewidywalne. Jest ona dostępna w wersji Chromium 122.

Jaki problem rozwiązuje standard pamięci masowej?

Zazwyczaj, gdy użytkownikowi na urządzeniu brakuje miejsca na dane, dane przechowywane za pomocą interfejsów API takich jak IndexedDB czy localStorage zostają utracone bez ingerencji użytkownika. Aby zapewnić trwałą pamięć masową, musisz wywołać metodę persist() interfejsu StorageManager. Jednocześnie prosi użytkownika o przyznanie uprawnień, a po jego przyznaniu pamięć masowa zmienia się na trwałą:

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

Ta metoda wysyłania prośby o zachowanie miejsca na dane to cała metoda lub nic. Nie da się w dokładniejszy sposób określić potrzeby w zakresie trwałości. Wszystko to zajmuje 1 zasobnik na dane.

Interfejs Storage Buckets API

Podstawowym celem interfejsu Storage Buckets API jest umożliwienie witrynom tworzenia wielu zasobników na dane, z których przeglądarka może usuwać każdy zasobnik niezależnie od innych. Dzięki temu deweloperzy mogą określić priorytety usuwania, aby mieć pewność, że najbardziej wartościowe dane nie zostaną usunięte.

Przykład zastosowania

Aby pokazać, gdzie mogą przydać się zasobniki na dane, wyobraź sobie aplikację e-mailową. Nie byłoby to możliwe, gdyby aplikacja utraciła niewysłane przez użytkownika niewysłane wersje robocze, które istnieją tylko w kliencie. Jeśli natomiast wiadomości są przechowywane na serwerze, użytkownik może chcieć, aby niektóre z najstarszych e-maili ze skrzynki odbiorczej zostały usunięte z klienta, gdy jego przeglądarka mocno korzysta z miejsca na dane.

Interfejs aplikacji do poczty e-mail
Aplikacja do poczty e-mail z osobnymi zasobnikami na skrzynkę odbiorczą i wersje robocze. (wyłącznie w celach ilustracyjnych nie zawsze odzwierciedla to sposób działania Gmaila).

Użyj interfejsu Storage Buckets API

Tworzenie nowego zasobnika na dane

Nowy zasobnik na dane 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 trwałego nowego 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 na dane powinien zostać utrwalony. Dozwolone wartości to false (domyślna) 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ą obniżenie 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. Z kolei zapisywanie danych w tych zasobnikach może mieć lepsze cechy wydajności, wydłużyć czas ładowania baterii i wydłużyć czas pracy urządzenia pamięci masowej. Poza tym awaria zasilania nie prowadzi do uszkodzenia danych szybciej 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 pamięci masowej działają jak zwykle, tylko punkt wejścia pochodzi z interfejsu StorageBucket, na przykład 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);
});

Debugowanie zasobników na dane w Narzędziach deweloperskich

Sprawdź zasobniki na dane w specjalnym drzewie w sekcji Aplikacja > Pamięć.

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

Przydatne materiały