存储配额:用 navigator.storage.estimate() 预判浏览器什么时候会删你的数据

你一定知道浏览器是个"无情的房东"。当磁盘空间不足时,浏览器会自动启动 驱逐机制(Eviction) ,而你的 IndexedDB 数据往往是第一批被清理的对象,且清理前没有任何弹窗提示

为了不让用户的 AI Prompt 模板一夜之间消失,我们需要利用 navigator.storage API 进行"生存预判"。


1. 核心数据:Quota vs. Usage

通过 navigator.storage.estimate(),我们可以获取到当前域名的存储状态:

  • usage: 你已经占用了多少字节(Byte)。
  • quota : 浏览器分配给你的最高额度。通常是磁盘剩余空间的 80% ,但这只是"软上限"。

实战代码封装

JavaScript

javascript 复制代码
async function checkStorageHealth() {
  if (!navigator.storage || !navigator.storage.estimate) {
    return { status: 'unsupported' };
  }

  const { usage, quota } = await navigator.storage.estimate();
  
  // 转换为更直观的 GB/MB
  const usageMB = (usage / (1024 * 1024)).toFixed(2);
  const quotaMB = (quota / (1024 * 1024)).toFixed(2);
  const percentUsed = ((usage / quota) * 100).toFixed(2);

  return {
    usageMB: `${usageMB}MB`,
    quotaMB: `${quotaMB}MB`,
    percentUsed: `${percentUsed}%`,
    isRisk: percentUsed > 80 // 占用超过 80% 即为高风险
  };
}

// 在 AI Prompt Manager 初始化时调用
checkStorageHealth().then(console.table);

2. 存储策略:最佳努力 (Best-effort) vs. 持久化 (Persistent)

默认情况下,所有的 Web 存储都是 "最佳努力(Best-effort)" 。这意味着当用户电脑没空间时,浏览器会根据 LRU(最近最少使用)原则删掉你的数据库。

作为资深开发,你应该在用户存储了重要数据后,申请 "持久化存储权限"

JavaScript

csharp 复制代码
async function requestPersistence() {
  if (navigator.storage && navigator.storage.persist) {
    // 检查是否已经持久化
    const isPersisted = await navigator.storage.persisted();
    if (isPersisted) return true;

    // 申请持久化
    const granted = await navigator.storage.persist();
    return granted; // 返回 true 表示浏览器承诺:除非用户手动清理,否则绝不删除
  }
  return false;
}

注意: 浏览器(尤其是 Chrome)会自动根据网站的"活跃度"决定是否授予持久化权限。如果你的应用被用户频繁访问,获批概率极大。


3. 浏览器如何决定删谁?(驱逐逻辑)

不同的房东有不同的驱逐规矩:

浏览器 存储上限 (Quota) 驱逐触发条件
Chrome / Edge 共享磁盘剩余空间的 80% 全局磁盘空间不足 10% 或 2GB 时
Firefox 磁盘剩余空间的 80% 超过总额度的 10% 时开始 LRU 清理
Safari 严格限制(通常 1GB 或更少) 7 天不使用即可能被清理(移动端更严)

4. "预判避坑"指南

  1. 静默失败的处理 :不要等到 set() 报错 QuotaExceededError 才行动。在那之前,通过 estimate() 监控,当 percentUsed > 70% 时,在 UI 上给用户一个"清理旧数据"的黄色警告。

  2. 垃圾回收的滞后 :当你删除了 100MB 的 IndexedDB 数据后,usage 不会立刻减少。浏览器需要时间进行内部清理(Compaction),所以不要在 delete 之后立刻测 estimate

  3. 计算并不精准estimate() 返回的是字节数,但 IndexedDB 存储时会有额外的索引开销和数据库元数据。实际占用通常比数据本身大 10% 到 20%

  4. 金融数据备份建议 :既然涉及到金融级别的安全性,永远不要把浏览器存储作为唯一的真理来源。

    • 低频:将重要 Prompt 同步到后端云端。
    • 高频 :提供本地导出 .json 的功能作为手动备份。

相关推荐
mayaairi21 小时前
JS循环语句深度解析:嵌套for、while与do...while
开发语言·前端·javascript
To_OC21 小时前
啃完流式输出:从一个卡顿的 LLM 接口开始,我搞懂了数据流到底怎么 “流”
前端·javascript·llm
阳光是sunny21 小时前
LangGraph实战教程:defer延迟节点——让收尾工作自动排到最后
前端·人工智能·后端
kyriewen1 天前
我用了三周Claude Code Skills——总结出5条铁律,第3条最反直觉
前端·ai编程·claude
阳光是sunny1 天前
LangGraph实战教程:控制流详解
前端·人工智能·后端
格尔曼Noah1 天前
Safari浏览器中如何只允许指定网站下载
前端·safari
用户059540174461 天前
用了3年Redis,才发现我一直没搞懂缓存一致性测试
前端·css
swipe1 天前
07|(前端转后全栈)为什么后端也要缓存?从前端缓存思维理解 Redis
前端·后端·全栈
IT小盘1 天前
05-企业项目统一接入多个大模型-适配器模式实战
前端·人工智能·适配器模式
swipe1 天前
06|(前端转后全栈)登录后端到底在做什么?JWT、Spring Security 和权限链路
前端·后端·全栈