Dexie.js 是 IndexedDB 的轻量封装库,核心优势是 Promise 化 API、简洁的查询语法、完善的类型支持 和 事务管理。以下按「功能模块」详细列举其常用方法,包含语法、用途和示例,覆盖开发高频场景:
一、数据库初始化与配置
核心用于创建数据库实例、定义表结构、版本控制。

示例:初始化数据库
// 1. 创建数据库实例
const db = new Dexie('MyDatabase', { autoOpen: true });
// 2. 定义版本 1 的表结构
db.version(1).stores({
users: '++id, email, name, age, [name+age]', // 表名:users
// 主键:++id(自增主键);普通索引:email、name、age;复合索引:[name+age]
books: 'isbn, title, author, tags[]', // 多值索引:tags[](数组类型字段)
});
// 3. 首次创建时插入默认数据
db.on('populate', async () => {
await db.users.bulkAdd([
{ name: '张三', email: 'zhangsan@xxx.com', age: 25 },
{ name: '李四', email: 'lisi@xxx.com', age: 30 },
]);
});
二、表操作(获取 / 删除表)

三、CRUD 核心操作
所有操作均返回 Promise,支持 async/await,核心区分「单条操作」和「批量操作」。
(红色文字是对‘所有操作均返回 Promise,支持 async/await’的解释:Dexie 的所有数据库操作(增删改查、事务等)都不会 “立刻返回结果”,而是返回一个「Promise 对象」;同时支持用 async/await 语法简化这个异步操作的写法,让代码更易读)
1. 新增数据(Add/Put)

示例:新增数据
// 单条新增(自增主键)
const userId = await db.users.add({ name: '王五', email: 'wangwu@xxx.com', age: 28 });
// 单条更新(主键存在则覆盖)
await db.users.put({ id: userId, name: '王五', email: 'newwangwu@xxx.com', age: 29 });
// 批量新增
const userIds = await db.users.bulkAdd([
{ name: '赵六', email: 'zhaoliu@xxx.com', age: 32 },
{ name: '孙七', email: 'sunqi@xxx.com', age: 27 },
]);
2. 删除数据(Delete)

3. 更新数据(Update)

4. 查询数据(Read)
(1)按主键查询

(2)条件查询(where() 链式语法)
where() 是 Dexie 核心查询方法,支持索引过滤、排序、分页,返回「查询集合」(可链式调用)。

(3)查询结果处理(链式收尾)
条件查询后,需调用以下方法获取结果:

示例:条件查询
// 1. 查询 age ≥ 25 且 < 30 的用户,按 name 升序,取前 10 条
const users = await db.users
.where('age')
.between(25, 30, true, false) // 包含 25,不包含 30
.orderBy('name')
.limit(10)
.getAll();
// 2. 查询 email 以 @xxx.com 结尾的用户,统计条数
const count = await db.users
.where('email')
.endsWith('@xxx.com')
.count();
// 3. 查询 tags 包含「前端」的书籍(多值索引 tags[])
const frontendBooks = await db.books
.where('tags')
.includes('前端')
.getAll();
// 4. 分页查询:第 2 页(每页 10 条),按 id 降序
const page2Users = await db.users
.orderBy('id')
.reverse()
.offset(10) // 跳过前 10 条(第 1 页)
.limit(10)
.getAll();
四、事务处理
Dexie 事务支持「原子性」(要么全成功,要么全回滚),核心方法 transaction()。

事务模式(mode)
'readonly':只读事务(默认,仅查询,性能更高)'readwrite':读写事务(需新增 / 修改 / 删除数据时使用)
示例:事务操作
// 转账场景:A 扣钱,B 加钱(原子操作)
async function transfer(fromUserId, toUserId, amount) {
return db.transaction('readwrite', db.users, async () => {
// 1. 查询两个用户(事务内查询,避免脏读)
const fromUser = await db.users.get(fromUserId);
const toUser = await db.users.get(toUserId);
if (!fromUser || !toUser || fromUser.balance < amount) {
throw new Error('转账失败'); // 抛错则事务回滚
}
// 2. 更新余额
await db.users.update(fromUserId, { balance: fromUser.balance - amount });
await db.users.update(toUserId, { balance: toUser.balance + amount });
return '转账成功';
});
}
// 调用事务
try {
const result = await transfer(1, 2, 100);
console.log(result);
} catch (err) {
console.error(err.message);
}
五、索引操作
索引是 IndexedDB 高效查询的核心,Dexie 支持多种索引类型,定义在表结构中,查询时通过 where() 使用。
索引类型(表结构定义)

示例:使用复合索引查询
// 表结构:users: '++id, [name+age]'(复合索引 name+age)
const users = await db.users
.where('[name+age]') // 指定复合索引
.between(['张三', 25], ['张三', 30]) // 按 name=张三、age 25-30 查询
.getAll();
六、数据库维护

示例:删除数据库
// 删除名为 MyDatabase 的数据库
await Dexie.deleteDatabase('MyDatabase');
七、事件监听
Dexie 支持数据库和表级别的事件,用于监听数据变化。

示例:监听用户表变化
// 监听 users 表新增数据
db.users.on('add', (user, userId) => {
console.log('新增用户:', user, '用户ID:', userId);
});
// 监听 users 表更新
db.users.on('update', (mods, userId) => {
console.log('用户', userId, '更新内容:', mods); // mods: { age: 26 }
});
核心总结
- 初始化:
Dexie构造函数 +version().stores()定义表结构; - CRUD:
add/put/delete/update(单条)、bulkXXX(批量); - 查询:
where()条件链 +orderBy/limit/offset排序分页; - 事务:
transaction()保证原子性操作; - 索引:主键 / 普通 / 复合 / 多值索引,提升查询效率;
- 事件:监听数据变化和数据库状态。
所有方法均返回 Promise,需配合 async/await 或 .then() 处理异步结果,避免回调地狱。
1646

被折叠的 条评论
为什么被折叠?



