Presentazione dei bucket di archiviazione: non tutto lo spazio di archiviazione è uguale

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. Si tratta di un unico bucket di archiviazione.

L'API Storage Buckets

L'idea di base dell'API Storage Buckets è dare ai siti la possibilità di creare più bucket di archiviazione, in cui 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.

Interfaccia dell'app email
App email con bucket di archiviazione separati per Posta in arrivo e Bozze. (solo a scopo illustrativo, non riflette necessariamente il funzionamento di Gmail).

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 sono false (predefinito) o true.
  • durability fornisce un suggerimento al browser che lo aiuta a bilanciare le prestazioni di scrittura con un risparmio di energia e un rischio ridotto di perdita di dati in caso di interruzioni di corrente. I valori consentiti sono 'relaxed' (predefinito) o 'strict':

    • I bucket 'strict' tentano di ridurre al minimo il rischio di perdita di dati in caso di interruzione dell'alimentazione. Ciò può comportare una riduzione delle prestazioni, il che significa che le scritture potrebbero richiedere più tempo per essere completate, potrebbero influire sulle prestazioni complessive del sistema, potrebbero consumare più energia della batteria e potrebbero usurare 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 dei dati in questi bucket potrebbe avere caratteristiche di prestazioni migliori, consentire una ricarica della batteria più lunga e prolungare la 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`.
});

Accedere alle API di archiviazione da un bucket di archiviazione

Ogni bucket di archiviazione è associato ad API di archiviazione, ad esempio IndexedDB, l'interfaccia Cache o l'interfaccia File. Queste API di archiviazione funzionano come al solito, solo che il punto di contatto proviene dall'interfaccia 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

Controlla i bucket di archiviazione in una struttura ad albero dedicata nella sezione Applicazione > Archiviazione.

L'immagine prima e dopo l'attivazione dell'albero dei bucket di archiviazione nella sezione Spazio di archiviazione.

Risorse utili