高效导出IndexedDB全量备份需结构化遍历各object store、分块读取防卡顿、封装含元信息与校验字段的格式化JSON文件,并支持兼容性迁移。

高效导出 IndexedDB 全量备份文件,核心在于“结构化遍历 + 分块导出 + 完整元信息封装”,不是简单 dump 所有数据,而是生成一个可验证、可恢复、带上下文的 JSON 备份包。
明确导出范围与结构设计
全量导出不是把整个数据库二进制拷出来,而是按对象仓库(object store)逐个提取,并保留 schema 语义:
- 每个对象仓库单独导出为一个数组,包含全部记录(不省略 deleted 或无效字段)
- 为每条记录保留原始 key(主键值),避免依赖 autoIncrement 重排
- 备份文件顶层含元信息:数据库名、版本号、导出时间、各 objectStore 的名称、条数、keyPath、是否 autoIncrement
- 可选加入校验字段,如 checksum(对所有 record 数据做 SHA-256)或 schemaHash(对索引定义序列化后哈希),用于迁移前比对兼容性
分块读取,避免主线程卡死
全量数据可能达数万条,一次性游标遍历会阻塞 UI。应采用“游标分页 + requestIdleCallback”策略:
- 用
IDBObjectStore.openCursor()启动遍历,每次只读取 200–500 条(根据记录大小动态调整) - 每批读完后调用
requestIdleCallback暂停,让出主线程给渲染或用户操作 - 使用递归或 Promise 链衔接批次,确保顺序不乱;失败时记录已导出 offset,支持断点续导
- 对大字段(如 Blob、base64 图片)可选择跳过或转为占位符(如
{"type": "blob", "size": 124892}),降低导出体积
封装为标准 JSON 文件并提供下载
导出完成后,将结构化数据组装为合法 JSON 字符串,再触发浏览器下载:
- 用
JSON.stringify(backupData, null, 2)格式化,便于人工检查和 diff - 生成 Blob:
new Blob([jsonString], {type: 'application/json'}) - 创建临时 a 标签,设置
href为URL.createObjectURL(blob),download属性为myapp-backup-20261008.json - 点击触发下载;完成后调用
URL.revokeObjectURL()释放内存
兼容迁移场景的关键细节
该备份文件要能被新版本数据库正确导入,需提前对齐以下点:
- 导出时记录每个 objectStore 的索引列表(name、keyPath、unique),导入端据此判断是否需重建索引
- 若目标库 version 更高,
onupgradeneeded中必须先建好对应 store 和索引,再执行导入,否则 put 会失败 - 备份中不包含事务日志或内部指针,因此导入时无需“回放”,只需批量
put()即可(注意用put而非add,避免主键冲突中断) - 建议在备份文件中增加
"compatibleWithMinVersion": 2字段,导入端可据此做版本校验并提示用户升级客户端
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!











