indexeddb 是离线优先架构的本地主数据库,所有读写操作默认本地执行,网络仅用于后台同步;每个实体对应独立 object store,建索引支持高效查询;同步基于 synced 字段状态驱动,失败可降级至 localstorage 或内存。

IndexedDB 是离线优先架构中真正的本地数据中枢,不是临时缓存,而是应用的“主数据库”。它让前端能完全脱离网络运行:所有读写操作默认走本地,网络只承担后台同步职责,从而实现秒开、断网可用、数据不丢。
作为唯一可信数据源,所有业务逻辑绕不开它
在离线优先设计里,UI 层和业务逻辑层不直接调用 fetch 或 API,而是统一对接 IndexedDB 封装层。比如用户新建一条笔记、编辑一个部门、发送一条消息——这些动作全部先写入 IndexedDB,并标记 synced: false;页面渲染也完全从本地读取。网络连接只是“可选通道”,不是运行前提。
- 每个核心实体(如 notes、departments、messages)对应一个 object store,主键建议用 UUID 或 autoIncrement,避免依赖服务端 ID
- 所有写操作必须包裹在 readwrite 事务中,监听 onerror 实现失败捕获与降级(如 fallback 到内存暂存)
- 读操作一律用 readonly 事务,get() 查单条、getAll() 批量拉取、游标遍历或索引查询(如 byParent、byStatus)按需选用
靠索引和扁平结构支撑高效离线查询
离线场景下不能靠后端聚合或 JOIN,所有查询能力必须由 IndexedDB 本地提供。这就要求建模时放弃嵌套,转向可索引的扁平结构。
- 树形组织架构:每个节点存 id、name、parentId、type,为 parentId 字段建索引,查子节点只需 store.index('byParent').getAll(parentId)
- 文章缓存:在 articles store 中为 pubTime、category、isFavorite 分别建索引,支持按时间线、分类页、收藏夹快速筛选
- 聊天记录:messages store 除主键外,至少建三个索引——byConversation(会话维度)、byTime(分页/滚动加载)、bySender(消息筛选)
与网络状态协同,自动完成同步闭环
IndexedDB 本身不联网,但它是同步策略的“事实基础”。网络恢复时,不是盲目重发,而是基于数据状态精准驱动。
- 监听 navigator.onLine 或使用更可靠的 fetch 探活,触发批量同步任务
- 用索引快速找出所有 synced: false 的记录,按业务优先级分批上传(例如草稿优先于日志)
- 每条记录单独重试,带指数退避;成功后用 put() 更新其 synced 字段为 true;失败则保持原状,等待下次尝试
- 同步完成后,可按策略清理过期数据(如 30 天前的临时草稿),释放空间
应对边缘环境,做可用性兜底
不是所有浏览器或模式都无条件支持 IndexedDB(如 Safari 私密模式会拒绝打开)。离线优先必须包含降级路径。
- 初始化时先检测可用性:indexedDB.open() 失败则 fallback 到 localStorage(仅限简单 JSON)或纯内存存储
- 对 Blob 类型文件(图片、语音、视频),直接存原生 Blob,不用转 base64——节省内存、避免编码开销,播放时用 URL.createObjectURL() 生成临时地址
- 版本升级必须平滑:onupgradeneeded 中只增不删字段,旧数据仍可读;新增索引或 store 不影响已有数据读写
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











