浏览器本地存储方案:IndexedDB
在 Web 开发中,当我们需要存储比 localStorage 更大、更复杂的数据时,IndexedDB 是最佳选择。它本质上是一个运行在浏览器中的大容量本地数据库,支持异步操作、索引查询以及二进制文件存储。
核心对比与场景
| 特性 | localStorage | IndexedDB |
|---|---|---|
| 容量 | 约 5MB | 至少 250MB,甚至 GB 级 |
| 数据类型 | 仅字符串 | JS 对象、文件、二进制等 |
| 查询方式 | 简单键值对 | 支持索引、范围查询 |
| 执行模式 | 同步(阻塞) | 异步(不阻塞页面) |
什么时候用?
- 选 localStorage:存储 token、用户偏好设置等小数据,结构简单且量小于 5MB。
- 选 IndexedDB:离线应用的全部数据、用户生成的内容(如图片笔记)、大量 API 缓存或编辑器草稿自动保存。
注意:不要用它存密码等敏感信息(不安全),也不要替代服务器端实时同步数据(建议用 WebSocket)。
基础使用与封装
虽然原生 API 功能强大但较为繁琐,生产环境通常配合 idb 这样的轻量级库使用,它能提供 Promise 风格的接口。
1. 安装与初始化
IndexedDB 本身无需安装,这里指的是引入辅助库:
yarn add idb
2. 核心操作示例
打开数据库时会自动创建,若版本号变更则触发升级逻辑。以下是增删改查的完整流程:
import { openDB } from 'idb';
// 1. 打开/创建数据库
const db = await openDB('MyAppDB', 1, {
upgrade(db) {
// 仅在版本更新或初次创建时执行
// 创建对象仓库(相当于表),指定主键为 id 字段
db.createObjectStore('tasks', { : });
}
});
db.(, {
: ,
: ,
:
});
allTasks = db.();
task = db.(, );
db.(, );

