idb-js 2.0.0发布啦

74 阅读24分钟

对于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。

github地址

TODO

  • 增加单元测试
  • 支持typescript