Storage Standard では、永続ストレージと割り当ての見積もりのための API、プラットフォーム ストレージ アーキテクチャが定義されています。大量のメモリ負荷時の永続ストレージ エビクションを予測しやすくするための API をリリースします。Chromium 122 以降でご利用いただけます。
このストレージ標準によってどのような問題が解決されますか。
従来、ユーザーがデバイスの保存容量を使い切ると、IndexedDB や localStorage
などの API で保存されたデータはユーザーの介入なしに失われます。ストレージを永続化するには、StorageManager
インターフェースの persist()
メソッドを呼び出します。同時にエンドユーザーに権限をリクエストし、権限が付与されたらストレージを永続的に変更します。
const persisted = await navigator.storage.persist();
if (persisted) {
/* Storage will not be cleared except by explicit user action. */
}
ストレージの永続化をリクエストするこの方法は、すべて選択するか、まったく選択しないかのどちらかです。永続性の要件を細かく表現することはできません。すべて 1 つの Storage バケットです
Storage Buckets API
Storage Buckets API の根本的な考え方は、複数のストレージ バケットを作成する機能をサイトに付与することです。この場合、ブラウザは各バケットを他のバケットとは無関係に削除できます。これにより、最も重要なデータが削除されないように、エビクションの優先順位を指定できます。
ユースケースの例
ストレージ バケットが役立つ場面を説明するために、メール アプリケーションを考えてみましょう。クライアントにのみ存在するユーザーの未送信の下書きがアプリから失われた場合、これは許容できません。逆に、ファイルがサーバーに保存されている場合、ブラウザのストレージ負荷が高い場合は、最も古い受信トレイのメールの一部をクライアントから削除しても問題ないでしょう。
Storage Buckets API を使用する
新しい Storage バケットを作成する
新しいストレージ バケットは、StorageBucketManager
インターフェースの open()
メソッドを使用して作成できます。
// Create a storage bucket for emails that are synchronized with the
// server.
const inboxBucket = await navigator.storageBuckets.open('inbox');
永続的な新しいストレージ バケットを作成する
ストレージ バケットが確実に永続化されるように、durability
オプション引数と persisted
オプション引数を open()
メソッドに渡します。
persisted
は、ストレージ バケットを永続化するかどうかを決定します。指定できる値はfalse
(デフォルト)またはtrue
です。durability
は、書き込みパフォーマンスと、停電時におけるデータ損失リスクの軽減とのトレードオフのヒントをブラウザに提供します。指定できる値は'relaxed'
(デフォルト)または'strict'
です。'strict'
バケットは、停電時のデータ損失リスクを最小限に抑えることを目的としています。これにより、パフォーマンスが低下する可能性があります。つまり、書き込みの完了に時間がかかったり、システム全体のパフォーマンスに影響を与えたり、バッテリー消費量が増えたり、ストレージ デバイスの消耗が速くなったりする可能性があります。- 停電が発生した場合、
'relaxed'
バケットは直近の数秒間に完了した書き込みを「削除」することがあります。その見返りとして、これらのバケットにデータを書き込むと、パフォーマンス特性が向上し、バッテリーの充電が長くなり、ストレージ デバイスの寿命が長くなる可能性があります。また、停電が発生しても、'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`.
});
Storage バケットからストレージ API にアクセスする
各ストレージ バケットは、ストレージ API(IndexedDB、キャッシュ インターフェース、File インターフェースなど)に関連付けられます。これらのストレージ API は通常どおりに動作しますが、エントリ ポイントが StorageBucket
インターフェース(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);
});