跳转到内容

Storage Buckets API:命名存储分区

发布于 更新于

一句话: navigator.storageBuckets 可以让页面打开多个具有独立驱逐策略的 命名存储桶。该提案包含每个存储桶独立的 IndexedDB 和 CacheStorage,而 Chrome 文档记录的当前实现仅支持 IndexedDB。

根据 Chrome 的文档,navigator.storageBuckets.open(name, options) 会按名称 创建或打开一个存储桶,并返回一个 StorageBucket:

function openIndexedDB(idbFactory, name, version) {
return new Promise((resolve, reject) => {
const request = idbFactory.open(name, version);
request.onsuccess = () => resolve(request.result);
request.onerror = () => reject(request.error);
});
}
async function openTasksBucket() {
const bucket = await navigator.storageBuckets.open('tasks', {
persisted: true,
});
const db = await openIndexedDB(bucket.indexedDB, 'tasks-db', 1);
return db;
}

根据 Chrome 的文档,open() 接受一个布尔值 persisted 选项。WICG explainer 指出,用户代理可以拒绝 persisted: true 请求;持久存储桶不会在没有通知用户 的情况下因存储压力而被驱逐。

Chrome 的文档(最后更新于 2022-11-04)记录了 open() 接受一个 durability 选项——'strict' 或 'relaxed'——作为在写入性能与断电后数据丢失风险之间 取舍的提示。已归档的提案将 strict 下的写入描述为在持久化到存储介质后完成, 将 relaxed 下的写入描述为在刷新到操作系统缓冲区后完成。 该 API 当前的 WICG explainer 指出,这一策略“已从该 API 首个提议版本中被 谨慎移除,尽管未来版本中可能会重新加入”,理由是缺乏足够有说服力的使用场景, 并且相同的持久性行为可以直接通过 IndexedDB 自身的事务选项获得。在依赖 durability 选项之前,请对照这两份文档以及你目标浏览器当前的实际行为进行 核实——单独任何一份文档都不足以证明当前正式发布的实现是否接受该选项。

根据 MDN 的 browser-compat-data,StorageBucketManager(navigator.storageBuckets 背后的接口)从 Chrome 122 开始提供。Firefox 与 Safari 均未实现该接口;请将 存储桶视为对源默认存储的一种渐进增强,而非必需依赖。

查看该特性的完整逐浏览器支持表。

async function openBucket(name) {
if (!('storageBuckets' in navigator)) {
// 不支持:回退到源的默认 IndexedDB/Cache 存储。
return null;
}
return navigator.storageBuckets.open(name);
}
  • 在调用 open() 之前,先用 'storageBuckets' in navigator 进行特性 检测——Firefox 与 Safari 均未实现该 API。
  • 不要假设 open() 一定接受 durability 选项,除非你已核实目标浏览器 当前、带日期的文档——WICG explainer 将其描述为已从提议 API 中移除, 而非已发布的保证。
  • 为不同的应用数据使用独立的存储桶,以获得各自的驱逐策略,而不是对 所有数据都请求 persisted: true。