存储配额:用 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 的功能作为手动备份。

相关推荐
itmigrate2 小时前
前端项目里,Object.is 并不是 === 的平替
前端
小大宇3 小时前
Vue知识点6-computed计算属性
前端·javascript·vue.js
程序员海军4 小时前
尤雨溪 : Vue 4 已经在规划中了!
前端·javascript·vue.js
2601_949970694 小时前
HumanizeDuration 跨端三方库仓颉适配全流程
前端·javascript·flutter
风骏时光牛马6 小时前
后端服务接口开发与性能优化
前端
kyriewen6 小时前
我让 4 个 AI 互相 review 代码,最温柔的那个下手最狠
前端·程序员·ai编程
计算机魔术师6 小时前
493家公司白砸AI钱?Apollo这组数据戳破了幻觉
前端
IT_陈寒6 小时前
Java静态变量初始化坑得我头皮发麻
前端·人工智能·后端
柳杉7 小时前
用 Codex 完成智慧高速 3D 可视化大屏,从 18 张行业设计稿到可交互的运行监测中心
前端·ai编程·数据可视化
review445437 小时前
拿到 codex 第一步
前端·agent·vibecoding