localStorage容量太小?试试它们
localStorage 是前端本地存储的一种,其容量一般在 5M-10M 左右,用来缓存一些简单的数据基本够用,毕竟定位也不是大数据量的存储。
在某些场景下 localStorage 的容量就会有点捉襟见肘,其实浏览器是有提供大数据量的本地存储的如 IndexedDB 存储数据大小一般在 250M 以上。
弥补了localStorage容量的缺陷,但是使用要比localStorage复杂一些 mdn IndexedDB
不过已经有大佬造了轮子封装了一些调用过程使其使用相对简单,下面我们一起来看一下
localforage
localforage 拥有类似 localStorage API,它能存储多种类型的数据如 **Array ArrayBuffer Blob Number Object String**,而不仅仅是字符串。
这意味着我们可以直接存 对象、数组类型的数据避免了 JSON.stringify 转换数据的一些问题。
存储其他数据类型时需要转换成上边对应的类型,比如vue3中使用 reactive 定义的数据需要使用toRaw 转换成原始数据进行保存, ref 则直接保存 xxx.value 数据即可。
安装
下载最新版本 或使用 npm bower 进行安装使用。
1 | 引入下载的 localforage 即可使用 |
使用
提供了与 localStorage 相同的api,不同的是它是异步的调用返回一个 Promise 对象
1 | localforage.getItem('somekey').then(function(value) { |
提供的方法有
getItem根据数据的key获取数据 差不多返回nullsetItem根据数据的key设置数据(存储undefined时getItem获取会返回null)removeItem根据key删除数据length获取key的数量key根据 key 的索引获取其名keys获取数据仓库中所有的 key。iterate迭代数据仓库中的所有value/key键值对。
配置
完整配置可查看文档 这里说个作者觉得有用的
localforage.config({ name: 'My-localStorage' }); 设置仓库的名字,不同的名字代表不同的仓库,当一个应用需要多个本地仓库隔离数据的时候就很有用。
1 | const store = localforage.createInstance({ |
同时也支持删除仓库
1 | // 调用时,若不传参,将删除当前实例的 “数据仓库” 。 |
idb-keyval
idb-keyval是用IndexedDB实现的一个超级简单的基于 promise 的键值存储。
安装
npm npm install idb-keyval
1 | // 全部引入 |
浏览器直接引入 <script src="https://cdn.jsdelivr.net/npm/idb-keyval@6/dist/umd.js"></script>
暴露的全局变量是 idbKeyval 直接使用即可。
提供的方法
由于其没有中文的官网,会把例子及自己的理解附上
set 设置数据
值可以是 数字、数组、对象、日期、Blobs等,尽管老Edge不支持null。
键可以是数字、字符串、日期,(IDB也允许这些值的数组,但IE不支持)。
1 | import { set } from 'idb-keyval'; |
setMany 设置多个数据
一个设置多个值,比一个一个的设置更快
1 | import { set, setMany } from 'idb-keyval'; |
get 获取数据
如果没有键,那么val将返回undefined的。
1 | import { get } from 'idb-keyval'; |
getMany 获取多个数据
一次获取多个数据,比一个一个获取数据更快
1 | import { get, getMany } from 'idb-keyval'; |
del 删除数据
根据 key 删除数据
1 | import { del } from 'idb-keyval'; |
delMany 删除多个数据
一次删除多个键,比一个一个删除要快
1 | import { del, delMany } from 'idb-keyval'; |
update 排队更新数据,防止由于异步导致数据更新问题
因为 get 与 set 都是异步的使用他们来更新数据可能会存在问题如:
1 | // Don't do this: |
上述代码我们期望的是 2 但实际结果是 1,我们可以在第一个回调执行第二次操作。
更好的方法是使用 update 来更新数据
1 | // Instead: |
将自动排队更新,所以第一次更新将计数器设置为1,第二次更新将其设置为2。
clear 清除所有数据
1 | import { clear } from 'idb-keyval'; |
entries 返回 [key, value] 形式的数据
1 | import { entries } from 'idb-keyval'; |
keys 获取所有数据的 key
1 | import { keys } from 'idb-keyval'; |
values 获取所有数据 value
1 | import { values } from 'idb-keyval'; |
createStore 自定义仓库
文字解释:表 === store === 商店 一个意思
1 | // 自定义数据库名称及表名称 |
使用 createStore 创建的数据库一个库只会创建一个表即:
1 | // 同一个库有不可以有两个表,custom-store-2 不会创建成功: |
promisifyRequest
自己管理定制商店,这个没搞太明白,看文档中说既然都用到这个了不如直接使用idb 这个库
总结
本文介绍了两个 IndexedDB 的库,用来解决 localStorage 存储容量太小的问题
localforage 与 idb-keyval 之间我更喜欢 localforage 因为其与 localStorage 相似的api几乎没有上手成本。
如果需要更加灵活的库可以看一下 dexie.js、PouchDB、idb、JsStore 或者 lovefield 之类的库