Lo standard di archiviazione definisce un'API per lo spazio di archiviazione permanente e le stime della quota, nonché l'architettura di archiviazione della piattaforma. Stiamo lanciando un'API per rendere più prevedibile l'espulsione dello spazio di archiviazione permanente in caso di forte pressione sulla memoria. È disponibile a partire da Chromium 122.
Quale problema risolve lo standard di archiviazione?
Tradizionalmente, quando lo spazio di archiviazione del dispositivo dell'utente finisce, i dati archiviati con API come IndexedDB o localStorage
vengono persi senza che l'utente possa intervenire. Un modo per rendere permanente lo spazio di archiviazione è chiamare il metodo persist()
dell'interfaccia StorageManager
. Richiede contemporaneamente all'utente finale l'autorizzazione e modifica lo spazio di archiviazione in modo che sia permanente una volta concessa:
const persisted = await navigator.storage.persist();
if (persisted) {
/* Storage will not be cleared except by explicit user action. */
}
Questo metodo di richiesta di archiviazione permanente è tutto o niente. Non è possibile esprimere esigenze di persistenza più granulari. È tutto un unico bucket di archiviazione.
L'API Storage Buckets
L'idea alla base dell'API Storage Buckets è consentire ai siti di creare più bucket di archiviazione, dove il browser può scegliere di eliminare ogni bucket indipendentemente dagli altri. In questo modo, gli sviluppatori possono specificare la priorità di espulsione per assicurarsi che i dati più importanti non vengano eliminati.
Esempio di caso d'uso
Per illustrare dove sono utili i bucket di archiviazione, immagina un'applicazione email. Sarebbe imperdonabile se l'app perdesse le bozze non inviate dell'utente che esistono solo sul client. Al contrario, se sono archiviate su un server, l'utente probabilmente non avrà problemi se alcune delle email più vecchie della Posta in arrivo vengono rimosse dal client se il browser è sotto forte pressione di archiviazione.
Utilizzare l'API Storage Buckets
Crea un nuovo bucket di archiviazione
È possibile creare un nuovo bucket di archiviazione con il metodo open()
nell'interfaccia StorageBucketManager
.
// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');
Crea un nuovo bucket di archiviazione permanente
Per assicurarti che il bucket di archiviazione sia persistente, puoi passare gli argomenti opzionali durability
e persisted
al metodo open()
:
persisted
determina se il bucket di archiviazione deve essere persistente o meno. I valori consentiti sonofalse
(predefinito) otrue
.durability
fornisce al browser un suggerimento che lo aiuta a confrontare le prestazioni di scrittura con un rischio ridotto di perdita di dati in caso di interruzioni dell'alimentazione. I valori consentiti sono'relaxed'
(predefinito) o'strict'
:'strict'
bucket tentano di ridurre al minimo il rischio di perdita di dati in caso di interruzione dell'alimentazione. Ciò può peggiorare le prestazioni ridotte, il che significa che il completamento delle scritture potrebbe richiedere più tempo, potrebbe influire sulle prestazioni complessive del sistema, consumare più batteria e consumare più rapidamente il dispositivo di archiviazione.- I bucket
'relaxed'
potrebbero "dimenticare" le scritture completate negli ultimi secondi, quando si verifica una interruzione dell'alimentazione. In cambio, la scrittura di dati in questi bucket può avere caratteristiche prestazionali migliori e può consentire una ricarica più lunga della batteria, con conseguente maggiore durata del dispositivo di archiviazione. Inoltre, le interruzioni di corrente non causeranno la corruzione dei dati a un tasso superiore rispetto ai bucket'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`.
});
Accedi alle API di archiviazione da un bucket di archiviazione
Ogni bucket di archiviazione è associato alle API di archiviazione, ad esempio IndexedDB, l'interfaccia Cache o File. Queste API di archiviazione funzionano come di consueto, solo che il punto di ingresso proviene dall'interfaccia di StorageBucket
, ad esempio
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);
});
Eseguire il debug dei bucket di archiviazione in DevTools
Esamina i bucket di archiviazione in una struttura ad albero dedicata nella sezione Applicazione > Archiviazione.