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

Storage Standard definisce un'API per l'archiviazione permanente e le stime di quote e l'architettura di archiviazione della piattaforma. Stiamo lanciando un'API per rendere più prevedibile l'eliminazione dello spazio di archiviazione permanente in caso di forte pressione della memoria. È disponibile a partire da Chromium 122.

Quale problema risolve lo standard di archiviazione?

Tradizionalmente, quando l'utente esaurisce lo spazio di archiviazione sul dispositivo, i dati archiviati con API come IndexedDB o localStorage vengono persi senza che l'utente possa intervenire. Un modo per rendere permanente l'archiviazione è richiamando il metodo persist() dell'interfaccia StorageManager. Richiede contemporaneamente l'autorizzazione all'utente finale e modifica lo spazio di archiviazione in modo che sia permanente una volta concessa l'autorizzazione:

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

Questo metodo per richiedere la persistenza dello spazio di archiviazione è tutto o niente. Non c'è modo di esprimere esigenze di persistenza più granulari. È tutto un bucket Storage.

L'API Storage Buckets

L'idea alla base dell'API Storage Bucket è concedere ai siti la possibilità di creare più bucket di archiviazione, in cui il browser può scegliere di eliminare ogni bucket indipendentemente dagli altri bucket. In questo modo gli sviluppatori possono specificare la priorità di rimozione per assicurarsi che non vengano eliminati i dati più importanti.

Esempio di caso d'uso

Per capire dove potrebbero tornare utili i bucket di archiviazione, immagina un'applicazione email. Non sarebbe stato possibile se l'app perdesse le bozze non inviate dell'utente che esistono solo nel client. Al contrario, se vengono archiviati su un server, l'utente probabilmente non vuole che alcune delle sue email di posta in arrivo meno recenti vengano rimosse dal client se il suo browser viene sottoposto a una notevole pressione di archiviazione.

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

Utilizzo dell'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 persistente

Per assicurarti che il bucket di archiviazione sia permanente, puoi passare gli argomenti delle opzioni durability e persisted al metodo open():

  • persisted determina se il bucket di archiviazione deve essere mantenuto o meno. I valori consentiti sono false (predefinito) o true.
  • durability fornisce un suggerimento al browser che lo aiuta a scendere a compromessi in termini di prestazioni di scrittura rispetto a un rischio ridotto di perdita di dati in caso di interruzioni dell'alimentazione. I valori consentiti sono 'relaxed' (valore predefinito) o 'strict':

    • 'strict' bucket tentano di ridurre al minimo il rischio di perdita di dati in caso di interruzione dell'alimentazione. Ciò può comportare 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 perdita di alimentazione. In cambio, la scrittura di dati in questi bucket potrebbe avere caratteristiche prestazionali migliori e consentire alla ricarica della batteria di durare più a lungo e, quindi, a prolungare la durata del dispositivo di archiviazione. Inoltre, l'interruzione dell'alimentazione non causerà il danneggiamento dei dati a una frequenza 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 Storage da un bucket Storage

Ogni bucket di archiviazione è associato alle API di archiviazione, ad esempio IndexedDB, l'interfaccia Cache o l'interfaccia File. Queste API di archiviazione funzionano come di consueto, ma si tratta di un punto di ingresso 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);
});

Risorse utili