El estándar de almacenamiento define una API para el almacenamiento persistente y las estimaciones de cuota, además de la arquitectura de almacenamiento de la plataforma. Lanzaremos una API para que la expulsión de almacenamiento persistente bajo una alta presión de la memoria sea más predecible. Está disponible a partir de Chromium 122.
¿Qué problema resuelve el almacenamiento estándar?
Tradicionalmente, cuando el usuario se queda sin espacio de almacenamiento en su dispositivo, los datos almacenados con APIs como IndexedDB o localStorage
se pierden sin que el usuario pueda intervenir. Una forma de hacer que el almacenamiento sea persistente es invocar el método persist()
de la interfaz StorageManager
. De manera simultánea, solicita el permiso al usuario final y cambia el almacenamiento para que sea persistente una vez otorgado:
const persisted = await navigator.storage.persist();
if (persisted) {
/* Storage will not be cleared except by explicit user action. */
}
Este método para solicitar la persistencia del almacenamiento es "todo o nada". No hay forma de expresar necesidades de persistencia más detalladas. Es un solo bucket de almacenamiento.
La API de Storage Buckets
La idea central de la API de Storage Buckets es otorgar a los sitios la capacidad de crear varios buckets de almacenamiento, en los que el navegador puede elegir borrar cada uno de forma independiente de los demás. Esto permite a los desarrolladores especificar la priorización de la expulsión para asegurarse de que no se borren los datos más valiosos.
Ejemplo de caso de uso
Para ilustrar dónde serían útiles los buckets de almacenamiento, imagina una aplicación de correo electrónico. No se podría perdonar si la app perdiera los borradores no enviados del usuario que solo existen en el cliente. Por el contrario, si se almacenan en un servidor, es probable que al usuario le resulte adecuado quitar del cliente algunos de sus correos electrónicos más antiguos de la bandeja de entrada si su navegador está utilizando mucha carga de almacenamiento.
Usa la API de Storage Buckets
Crea un bucket de almacenamiento nuevo
Se puede crear un bucket de almacenamiento nuevo con el método open()
en la interfaz StorageBucketManager
.
// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');
Crear un nuevo bucket de almacenamiento persistente
Para asegurarte de que el bucket de almacenamiento se conserve, puedes pasar los argumentos de opción durability
y persisted
al método open()
:
persisted
determina si el bucket de almacenamiento debe conservarse o no. Los valores permitidos sonfalse
(predeterminado) otrue
.durability
proporciona una sugerencia al navegador que le permite compensar el rendimiento de escritura con un riesgo reducido de pérdida de datos en caso de cortes de energía. Los valores permitidos son'relaxed'
(predeterminado) o'strict'
:- Los buckets de
'strict'
intentan minimizar el riesgo de pérdida de datos ante fallas de energía. Esto puede generar un menor rendimiento, lo que significa que las operaciones de escritura pueden tardar más en completarse, afectar el rendimiento general del sistema, consumir más batería y agotar el dispositivo de almacenamiento más rápido. - Los buckets
'relaxed'
pueden “olvidar” las escrituras que se completaron en los últimos segundos, cuando se produce una pérdida de energía. A cambio, la escritura de datos en estos buckets puede tener mejores características de rendimiento, permitir que la carga de la batería dure más tiempo y generar una mayor vida útil del dispositivo de almacenamiento. Además, las fallas de energía no causarán daños en los datos a una tasa más alta que en los buckets de'strict'
.
- Los buckets de
// 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`.
});
Accede a las APIs de Storage desde un bucket de almacenamiento
Cada bucket de almacenamiento se asocia con las APIs de almacenamiento, por ejemplo, IndexedDB, la interfaz Cache o la interfaz File. Estas APIs de almacenamiento funcionan como de costumbre, solo que el punto de entrada es de la interfaz StorageBucket
, por ejemplo, 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);
});