dexie.js是indexeddb的轻量级封装库,通过链式查询、批量操作、自动事务管理、promise异常处理和声明式版本升级,大幅简化原生api的冗长与复杂性。

IndexedDB 本身功能强大,但原生 API 冗长、回调嵌套深、事务管理繁琐。Dexie.js 不是替代 IndexedDB,而是把它“变好用”——用更少代码完成同样甚至更多操作,同时保持底层能力不打折扣。
用链式查询代替游标遍历
原生 IndexedDB 查某字段范围数据,得手动打开对象存储、创建游标、逐条匹配、收集结果;Dexie 一行搞定:
-
查 age 在 20–30 的用户:
db.users.where('age').between(20, 30).toArray() -
按 name 模糊搜索(含索引加速):
db.users.where('name').startsWith('张').toArray() -
多条件组合(如已激活且最近登录):
db.users.where({active: true}).and(u => u.lastLogin > Date.now() - 86400000).toArray()
批量操作无需手动循环
原生 IndexedDB 没有内置批量写入,得自己封装循环 + 事务;Dexie 提供原生支持,自动合并为单事务,性能高且原子性有保障:
-
一次插入多条:
db.users.bulkAdd([{name:'李四'}, {name:'王五'}]) -
按条件批量更新:
db.users.where('status').equals('pending').modify({status: 'processed'}) -
按范围或条件批量删除:
db.tasks.where('userId').equals(123).delete()
事务自动管理,不用手写 begin/commit/abort
Dexie 所有写操作默认在事务中执行,读操作也自动加入合适事务。你只需关注业务逻辑,异常时自动回滚:
-
跨表操作天然事务保护:
await db.transaction('rw', db.users, db.logs, async () => { await db.users.add(user); await db.logs.add({action: 'user_created'}); }); -
单个方法调用即隐式事务:
await db.users.put({...})或await db.users.delete(id)都自带事务边界 - 错误统一抛出 Promise reject,不用监听 onerror/onabort 事件
版本升级自动兼容旧数据
IndexedDB 升级表结构必须显式处理迁移逻辑,稍错就卡死;Dexie 把版本变更声明化,只写新增字段或新表,旧数据自动保留:
- v1 表结构:
users: '++id, name' - v2 升级只需加字段:
db.version(2).stores({users: '++id, name, email, createdAt'}) - 旧记录读取时
email和createdAt为undefined,不影响运行
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











