Storage Buckets API 目前未被任何主流浏览器实现,仍处于 WICG 提案草案阶段;前端调用会报错,MDN 与 CanIUse 均标记“无支持”;配额隔离需依赖子域拆分或服务端策略。

Storage Buckets API 目前**尚未在任何主流浏览器中实现**,也未进入 Web 标准的稳定阶段(截至 2024 年中,仍处于 WICG 提案草案期,Chrome 仅在极早期实验性 flag 中短暂出现过,现已移除)。直接通过 HTML 或前端 JavaScript 调用 storage.buckets.open() 等接口——会报 TypeError: storage.buckets is undefined 或类似错误。
别费时间查兼容性表了:它现在不存在于生产环境。
为什么你搜到的代码跑不起来?
常见现象:Uncaught TypeError: Cannot read properties of undefined (reading 'buckets');或调用 navigator.storage.estimate() 后发现 buckets 字段根本不在返回对象里。
原因很直接:该 API 依赖底层存储引擎重构(如 Chrome 的 QuotaManagerV2),目前所有浏览器都默认禁用,且没有启用开关。MDN 和 CanIUse 上均标记为 “No support”。
所谓“模块配额隔离”,现阶段无法靠标准 Web API 实现——不是写法问题,是能力缺失。
替代方案:用 IndexedDB + 命名空间模拟桶隔离
虽然不能硬隔离配额,但可通过约定和封装控制模块数据边界:
立即学习“前端免费学习笔记(深入)”;
使用 PptxGenJS 和 Python 解析,将结构化的 HTML/CSS 幻灯片内容转换为原生、可编辑的 PowerPoint(.pptx)演示文稿。
-
indexedDB.open("module-a-db", 1)和indexedDB.open("module-b-db", 1)创建独立数据库,各占不同 quota slot(实际仍共享总 quota,但便于统计与清理) - 每个数据库内只建一个
objectStore,名如"cache",键前缀强制加模块标识:key = "moduleA:avatar:123" - 封装读写函数,自动注入/剥离前缀,避免跨模块误读:
get(moduleId, key)→ 内部拼成`${moduleId}:${key}`
真正影响配额的实际因素有哪些?
浏览器对单源(origin)的存储配额分配,取决于:
- 当前 origin 下所有
localStorage、sessionStorage、IndexedDB、Cache API、File System Access API的总用量 - 用户是否触发过“持久化请求”:
navigator.storage.persist()可延缓被自动清除,但**不提升硬配额上限** - Chrome 对活跃站点(有 recent user interaction)动态放宽 quota(最高可达硬盘剩余空间的 60%),但无 per-module 控制能力
也就是说:你没法让“登录模块”最多用 5MB、“图片预览模块”最多用 50MB——浏览器不提供这个切片粒度。
如果真要强隔离,只能后退一步
可行但代价明确的路径只有两个:
- 将模块拆成子域(如
auth.example.com、media.example.com),利用 origin 隔离天然获得独立 quota —— 但需 DNS、HTTPS、CORS 全链路配合,前端路由变复杂 - 服务端托管状态,前端只存 token 或临时句柄,由后端按模块做存储配额策略(如 Redis 中为 module-a 设置 maxmemory 10mb)—— 这才是生产中真正可控的“配额隔离”
别在前端死磕“桶”了。当前浏览器里,Storage Buckets API 是个名字很好听的幻影。


















