# Storage Buckets API：命名存储分区

> navigator.storageBuckets 如何创建多个独立命名的存储分区、Chrome 实现如何提供 IndexedDB，以及 durability 选项的真实历史。

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

## 打开一个存储桶

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

```js
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` 请求；持久存储桶不会在没有通知用户
的情况下因存储压力而被驱逐。

## durability 选项的历史

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 均未实现该接口；请将
存储桶视为对源默认存储的一种渐进增强，而非必需依赖。

查看该特性的[完整逐浏览器支持表](/zh/compatibility/storage-buckets/)。

## 特性检测与回退

```js
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`。

## 下一步

- [manifest: storage-buckets 浏览器支持](/zh/compatibility/storage-buckets/)
- [存储与离线](/zh/reference/service-worker/caching-strategies/) —— 相关的
  存储能力指南。