IndexedDB 是浏览器内置的事务型 NoSQL 数据库 API,可在客户端持久存储大量结构化数据(含文件与二进制对象),支持索引查询与事务,容量远超 localStorage,是离线应用与 PWA 的核心存储方案。

| 类型 | 浏览器存储 API |
| 数据模型 | 事务型键值对象存储 |
| 标准组织 | W3C |
| 容量 | 受配额管理,可达数百 MB 以上 |
| 常用封装库 | idb、Dexie.js、localForage |
IndexedDB 是浏览器提供的底层客户端数据库 API,属于 W3C 标准,用于在用户设备上持久化存储大量结构化数据。它是一个事务型的键值对象存储(NoSQL)数据库:数据以 JavaScript 对象形式存入对象仓库(object store),可建立索引加速查询,所有读写都在事务中进行。与仅能存储少量字符串的 localStorage 不同,IndexedDB 支持二进制大对象(Blob、File、ArrayBuffer),容量通常可达数百 MB 甚至更多(受浏览器配额管理约束)。
IndexedDB 的前身之争颇具历史意义:早期 W3C 曾推动基于 SQL 的 Web SQL Database,但因其规范实质绑定 SQLite 单一实现而被废弃,Mozilla 等转而支持面向对象的 IndexedDB,后者最终成为标准并获得所有主流浏览器支持。其数据模型按「源(origin)→ 数据库 → 对象仓库 → 记录」组织,遵循同源策略,不同网站无法互读数据。数据库带有版本号,结构变更(建仓库、建索引)只能在版本升级事件中完成。API 完全异步,基于请求与事件回调设计,写法较为繁琐,因此实践中常用 idb(将其包装为 Promise 风格)、Dexie.js、localForage 等封装库。IndexedDB 可在 Web Worker 与 Service Worker 中使用,这使它成为离线场景的关键设施。
典型用途包括:PWA 与离线应用缓存业务数据(配合 Service Worker 缓存静态资源,形成完整离线方案);邮件、笔记、文档类网页应用的本地草稿与离线队列;地图与游戏缓存大块资源;前端数据库如 RxDB、PouchDB 以它为存储引擎实现与服务端同步;SQLite 的 Wasm 版本也用它做持久化后端。
问:IndexedDB 和 localStorage 怎么选?答:几 KB 的简单配置用 localStorage 即可;数据量大、需要查询、二进制存储或在 Worker 中访问时必须用 IndexedDB,且后者异步不阻塞主线程。
问:IndexedDB 的数据会永久保留吗?答:不保证。浏览器在磁盘紧张时可能按最近最少使用原则清理站点数据;可调用 StorageManager 的 persist 方法申请持久化存储以降低被清理的概率。
问:为什么很多人不直接用原生 API?答:原生接口基于事件回调、样板代码多,用 idb、Dexie.js 等封装库能以 Promise 和更简洁的查询语法完成同样工作。

| 类型 | 浏览器存储 API |
| 数据模型 | 事务型键值对象存储 |
| 标准组织 | W3C |
| 容量 | 受配额管理,可达数百 MB 以上 |
| 常用封装库 | idb、Dexie.js、localForage |
登录 后参与讨论
暂无讨论,来发表第一条评论吧