O Storage Standard define uma API para armazenamento persistente e estimativas de cota, além da 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. Ele 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 persistente é invocar o método
persist()
da
interface StorageManager
. Ele solicita a permissão do usuário final e muda o
armazenamento para ser persistente após a concessão:
const persisted = await navigator.storage.persist();
if (persisted) {
/* Storage will not be cleared except by explicit user action. */
}
Esse método de solicitação de persistência de armazenamento é tudo ou nada. Não há como expressar necessidades de persistência mais detalhadas. Tudo é um bucket de armazenamento.
API Storage Buckets
A ideia principal da API Storage Buckets é permitir que os sites criem vários buckets de armazenamento, em que o navegador pode excluir cada bucket independentemente dos outros. Isso permite que os desenvolvedores especifiquem a priorização de despejo para garantir que os dados mais valiosos não sejam excluídos.
Exemplo de caso de uso
Para ilustrar onde os buckets de armazenamento são ú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, o usuário provavelmente não se importará se alguns dos e-mails mais antigos da caixa de entrada forem removidos do cliente se o armazenamento do navegador estiver sob pressão.
Usar a API Storage Buckets
Criar um bucket de armazenamento
É possível criar um novo bucket de armazenamento 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, é possível transmitir argumentos de opção 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
.O
durability
fornece uma dica ao navegador que ajuda a trocar o desempenho de gravação por um risco reduzido de perda de dados 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 em caso de falha de energia. Isso pode acontecer à custa de uma redução no desempenho, o que significa que as gravações podem levar mais tempo para serem concluídas, afetar o desempenho geral do sistema, consumir mais energia da bateria e desgastar o dispositivo de armazenamento mais rapidamente. - Os buckets
'relaxed'
podem "esquecer" gravações que foram concluídas nos últimos segundos, quando ocorre uma perda de energia. Em troca, a gravação de dados nesses buckets pode ter melhores características de desempenho, permitir que a bateria dure mais e resultar em uma vida útil maior do dispositivo de armazenamento. Além disso, a falha de energia não leva à corrupção de dados em uma taxa mais alta do que para os 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`.
});
Acessar as APIs de armazenamento de um bucket
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 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.