对于idb-js的升级,我这次选择了去繁为简,在1.0的基础上删除了多个API,只保留并优化了最基本的增删查改,减少理解成本,我希望使用者一看就会。并且提供创建事务的API,让用户使用更加灵活,既可以使用idb-js中的api又可以去使用原生indexdb的api。
为什么我们要使用indexdb
随着PWA的不断推进,以及前端需求的越来越复杂,indexdb成为了越来越多公司的前端本地存储方案。为什么是indexdb,而不是localstorage。
-
indexdb支持事务,操作步骤中一步失败,整个事务取消,不存在只改写一部分数据的情况。
-
indexdb的存储量大,一般不少于250M。
-
indexDB是异步的,操作不会锁死浏览器。
关于idb-js
那 idb-js 又是什么呢?使用过 indexdb 的同学都知道,indexdb 如果不封装的话写起来非常的繁琐,而且目前相应的文档又不多。idb-js 就是对 indexdb 的简单封装,暴露了一些常用的增删查改操作。下面我们简单的来看看:
这里我们创建一个叫student的学生数据库,一张grade的成绩表,开始创建数据库,拿到IDB后就可以开始操作了
import Idb from 'idb-js' // 引入Idb
Idb({
dbName: "student",
version: 1,
tables: [
{
tableName: "grade",
option: { keyPath: "id" },
},
],
}).then(IDB=> {...}) // 载入配置,生成数据,拿到db实例进行后面操作。
这时候,我们就可以看到浏览器上的数据库建立好了
拿到 IDB后,我就可以操作了,比如来个添加,插入三条数据,调用add方法:
IDB.add(
{
tableName: "grade",
data: [
{ id: 1,score: 98, name: "小明"},
{ id: 2, score: 100,name: "小华" },
{ id: 3,score: 97,name: "小红"}
]
}
);
我们可以看到数据库此时多了三条数据:
数据插入以后我们用query来查一下小红的数据
// 按条件查询
const res = await IDB.query({
tableName: "grade",
condition: (item, index) => item.name == "小红",
});
console.log(`按条件查询:`, res);
从console打印可以看到,我们查到了一条小红的数据
接下来我们再来修改小明的分数为60分,调用update方法
await IDB.update({
tableName: "grade",
condition: (item, index) => item.name === '小明',
handler: (row) => { row.score = 60;},
});
可以看到小明的分数已经变成60了
删除小华的数据,调用delete方法
await IDB.delete({
tableName: "grade",
condition: (item, index) => item.name === "小华",
});
是不是很方便,^-^。
仓库地址
idb-js更多的操作请查看idb-js的文档,顺便给个star支持一下,欢迎大家提issue。
TODO
- 增加单元测试
- 支持typescript