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.
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 tofalse
(domyślna) lubtrue
.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'
.
- Zasobniki (
// 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ęć.