O Storage Standard define uma API para armazenamento permanente, estimativas de cota e a arquitetura de armazenamento da plataforma. Estamos lançando uma API para tornar a remoção persistente de armazenamento sob pressão de memória pesada mais previsível. Ela está disponível a partir do Chromium 122.
Qual problema o padrão de armazenamento resolve?
Tradicionalmente, quando o usuário fica sem espaço de armazenamento no dispositivo, os dados armazenados com APIs como
IndexedDB ou localStorage
são perdidos sem que o usuário possa intervir. Uma maneira de tornar o armazenamento permanente é invocar o método persist()
da interface StorageManager
. Ela solicita a permissão do usuário final ao mesmo tempo e altera o
armazenamento para ser permanente depois de concedido:
const persisted = await navigator.storage.persist();
if (persisted) {
/* Storage will not be cleared except by explicit user action. */
}
Esse método de solicitar a persistência do armazenamento é tudo ou nada. Não há como expressar necessidades de persistência mais refinadas. Tudo é um bucket de armazenamento.
A API Storage Buckets
A ideia central da API Storage Buckets é conceder aos sites a capacidade de criar vários buckets de armazenamento, em que o navegador pode optar por excluir cada bucket independentemente dos outros. Isso permite que os desenvolvedores especifiquem a prioridade de remoção para garantir que os dados mais valiosos não sejam excluídos.
Exemplo de caso de uso
Para ilustrar onde os buckets de armazenamento seriam úteis, imagine um aplicativo de e-mail. Seria imperdoável se o app perdesse os rascunhos não enviados do usuário que só existem no cliente. Por outro lado, se eles estiverem armazenados em um servidor, é provável que alguns dos e-mails mais antigos da caixa de entrada sejam removidos do cliente se o navegador estiver sob grande pressão de armazenamento.
Usar a API Storage Buckets
Crie um novo bucket de armazenamento
Um novo bucket de armazenamento pode ser criado com o método open()
na interface StorageBucketManager
.
// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');
criar um novo bucket de armazenamento mantido
Para garantir que o bucket de armazenamento seja mantido, transmita as opções durability
e persisted
para o método open()
:
persisted
determina se o bucket de armazenamento precisa ser mantido ou não. Os valores permitidos sãofalse
(padrão) outrue
.durability
fornece uma dica ao navegador que o ajuda a reduzir o desempenho de gravação em caso de falhas de energia. Os valores permitidos são'relaxed'
(padrão) ou'strict'
:- Os buckets
'strict'
tentam minimizar o risco de perda de dados na falta de energia. Isso pode reduzir o desempenho, o que significa que as gravações podem levar mais tempo para serem concluídas, podem afetar o desempenho geral do sistema, podem consumir mais energia da bateria e descarregar o dispositivo de armazenamento mais rapidamente. - Os buckets
'relaxed'
podem "esquecer" gravações concluídas nos últimos segundos, quando ocorre uma perda de energia. Por outro lado, a gravação de dados nesses buckets pode ter características de melhor desempenho e permitir que a carga da bateria dure mais tempo, resultando em uma vida útil maior do dispositivo de armazenamento. Além disso, uma falha de energia não causa corrupção de dados a uma taxa mais alta do que em buckets'strict'
.
- Os buckets
// 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`.
});
Acesse as APIs de armazenamento em um bucket de armazenamento
Cada bucket de armazenamento está associado a APIs de armazenamento, por exemplo, IndexedDB, a interface Cache ou a interface File. Essas APIs de armazenamento funcionam normalmente, apenas que o ponto de entrada é da interface StorageBucket
, por exemplo, 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);
});
Depurar buckets de armazenamento no DevTools
Inspecione os buckets de armazenamento em uma árvore dedicada na seção Aplicativo > Armazenamento.