indexDB & localForage

2023-11-04

一、前言

前端本地化存储算是一个老生常谈的话题了,我们对于 cookies、Web Storage(sessionStorage、localStorage)的使用已经非常熟悉,在面试与实际操作之中也会经常遇到相关的问题,但这些本地化存储的方式还存在一些缺陷,比较明显的缺点如下:

  1. 存储量小:即使是web storage的存储量最大也只有 5M
  2. 存取不方便:存入的内容会经过序列化,当存入非字符串的时候,取值的时候需要通过反序列化。

当我们的存储量比较大的时候,我们一定会想到我们的 indexedDB,让我们在浏览器中也可以使用数据库这种形式来玩转本地化存储,然而 indexedDB 的使用是比较繁琐而复杂的,有一定的学习成本,但第三方库 localForage 的出现几乎抹平了这个缺陷,让我们轻松无负担的在浏览器中使用 indexedDB

二、indexedDB

IndexedDB是一种底层 API,用于在客户端存储大量的结构化数据(也包括文件/二进制大型对象)该 API 使用索引实现对数据的高性能搜索。IndexedDB 是一个事务型数据库系统,类似于基于 SQL 的 RDBMS。

1.存取方便

IndexedDB 是一个基于 JavaScript 的面向对象数据库。IndexedDB 允许你存储和检索用键索引的对象;可以存储结构化克隆算法支持的任何对象。

之前我们使用 webStorage 存储对象或数组的时候,还需要先经过先序列化为字符串,取值的时候需要经过反序列化,那indexedDB就比较完美的解决了这个问题,可以轻松存取对象或数组等结构化克隆算法支持的任何对象。以 stackblitz.com/ 网站为例,我们来看看对象存到 indexedDB 的表现:

2.异步存取

我相信你肯定会思考一个问题:localStorage如果存储内容多的话会消耗内存空间,会导致页面变卡。那么 IndexedDB 存储量过多的话会导致页面变卡吗?不会有太大影响,因为 IndexedDB 的读取和存储都是异步的,不会阻塞浏览器进程。

3.庞大的存储量

IndexedDB 的储存空间比LocalStorage 大得多,一般可达到500M,甚至没有上限。

三、 localForage

localForage 是基于 indexedDB 封装的库,通过它我们可以简化 IndexedDB 的使用。

兼容性

想必你一定很关注兼容性问题吧,我们可以看下 localStorage 与 indexedDB 兼容性比对,两者之间还是有一些小差距。

但是你也不必太过担心,因为 localforage 已经帮你消除了这个心智负担,它有一个优雅降级策略,若浏览器不支持 IndexedDB 则使用 WebSQL ,如果不支持 WebSQL 则使用 localStorage。在所有主流浏览器中都可用:Chrome,Firefox,IE 和 Safari(包括 Safari Mobile)。

localForage 的使用

import localforage from 'localforage'

  1. 创建一个 indexedDB
const myIndexedDB = localforage.createInstance({ name: 'myIndexedDB', })
  1. 存值
myIndexedDB.setItem(key, value)
  1. 取值

由于indexedDB的存取都是异步的,建议使用 promise.then() 或 async/await 去读值

myIndexedDB.getItem('somekey').then(function (value) {
  // we got our value
}).catch(function (err) {
  // we got an error
});

or

try { 
    const value = await myIndexedDB.getItem('key'); 
    // This code runs once the value has been loaded
    // from the offline store. 
    console.log(value); 
} catch (err) { 
    // This code runs if there were any errors. 
    console.log(err); 
}
  1. 删除某项
myIndexedDB.removeItem('key')
  1. 重置数据库
myIndexedDB.clear()

细节及其他使用方式请参考官方中文文档localforage.docschina.org/#localforag…

VUE 推荐使用 Pinia 管理 localForage

如果你想使用多个数据库,建议通过 pinia 统一管理所有的数据库,这样数据的流向会更明晰,数据库相关的操作都写在 store 中,让你的数据库更规范化。

// store/indexedDB.ts
import { defineStore } from 'pinia'
import localforage from 'localforage'

export const useIndexedDBStore = defineStore('indexedDB', {
  state: () => ({
    filesDB: localforage.createInstance({
      name: 'filesDB',
    }),
    usersDB: localforage.createInstance({
      name: 'usersDB',
    }),
    responseDB: localforage.createInstance({
      name: 'responseDB',
    }),
  }),
  actions: {
    async setfilesDB(key: string, value: any) {
      this.filesDB.setItem(key, value)
    },
  }
})

我们使用的时候,就直接调用 store 中的方法

import { useIndexedDBStore } from '@/store/indexedDB'
const indexedDBStore = useIndexedDBStore()
const file1 = {a: 'hello'}
indexedDBStore.setfilesDB('file1', file1)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

indexDB & localForage 的相关文章

随机推荐

  • Docker开发指南(自用)

    Docker开发指南 自用 本指南总结归纳菜鸟教程上的常用指令 并在文末给出了一个应用实例 序言 Docker是什么 Docker 是一个开源的应用容器引擎 基于 Go 语言 并遵从 Apache2 0 协议开源 Docker 可以让开发者
  • 【C语言练习题】计算1 * 2 * 3+3 * 4 * 5+5 * 6 * 7+...+99 * 100 * 101的值。

    计算1 2 3 3 4 5 5 6 7 99 100 101的值 错误版本 循环结束后仍执行i i 多余 include
  • 金融风控反欺诈之图算法

    先介绍下金融借贷业务流程 用户前来申请借贷 会先经过欺诈识别 把欺诈团伙和主观欺诈的个人拒绝掉 然后对通过的人做信用评估 最后根据额度模型 算出利润最大化时放款金额 刚才提到了团队欺诈 举个真实的例子 宜人贷在他们的财报中公布的 他们被一个
  • BFS和DFS代码实现

    BFS DFS实现图的遍历 以以下图数据为例 首先BFS是广度优先遍历算法 从图的某一个节点出发 然后遍历完这个节点相邻的节点 这个算法的核心就是 先把周围的找完 再去找更深的地方 通俗易懂的说法 DFS就是一条路走到底 发现没路了 返回来
  • uniapp uni-table表格组件 合并单元格

    注意 目前该方法只适用于H5 小程序和APP无法适配 就不用往下看了 解决方案 直接使用 rowspan 和 colspan 就可以 虽然文档上并没有写这些参数 但是我实际使用后以后 发现这些参数是可以直接用的 我猜测其他的一些参数都是可以
  • 软件测试V模型

    以 编码 为黄金分割线 将整个过程分为开发和测试 并且开发和测试之间是串行的关系 特点 明确标注了测试的类型 明确标注了测试阶段和开发阶段之间的对应关系 缺点 测试后置 V模型是基于瀑布模型的 将测试放在整个开发的最后阶段 没有让测试今早介
  • 时序预测

    时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 目录 时序预测 MATLAB实CNN LSTM 卷积长短期记忆神经网络 时间序列预测 基本介绍 CNN LSTM模型 CNN网络架构 LSTM网络架构 CNN
  • JAVA 数据类型强制转换详解

    JAVA 数据类型转换 强制类型转换 强制类型转换 将 取值范围大的类型 强制转换成 取值范围小的类型 特点 代码需要进行特殊的格式处理 不能自动完成 转换格式 范围小的类型 范围小的变量名 范围小的类型 原本范围大的数据 int i in
  • 原码反码补码:计算机整数的运算为啥用补码?运算过程举例理解

    原码 反码 补码基本知识 正整数 原码 反码 补码均是原码本身 负整数 反码 原码按位取反 符号位除外 补码 反码 1 例如 byte 1 原码 0000 0001 反码 0000 0001 补码 0000 0001 byte 3 原码 1
  • 前端PS基础使用教程

    详细教程https t2tfktotho feishu cn docx doxcndr868igJ0ubjf7Z0dRqAEb from from copylink 目录 常用快捷键 切片导出工具 cutterman 安装 操作技巧 3 6
  • 基于 DETR 的开放世界目标检测

    本文首发于微信公众号 CVHub 不得以任何形式转载到其它平台 仅供学习交流 违者必究 Title Open World DETR Transformer based Open World Object Detection Paper ht
  • MIPI学习记录——(4)mipi数据流实现

    数据流实现 数据流接收过程 1 sensor发送过来的数据 通过data lane到达D PHY 2 D PHY将接收到的data buffer缓存到内部DMA 3 CPU将DDR中的buffer table地址 0x 写入到D PHY的寄
  • 百度地图根据地点名称,获得坐标(但是延时太重,不利于使用)

    localSearch setSearchCompleteCallback function searchResult var poi searchResult getPoi 0 lng poi point lng lat poi poin
  • vue更换主题设置主题

    1 创建一个后缀为 scss文件将下述代码放进去 将scss文件引入main js中 如果引入报错可以网上搜一下 很多 root bg white color fff bg pink color pink bg black color 37
  • 送书

    如图1所示是网易财经展示的贵州茅台股票的历史交易数据 图1 单击 下载数据 超链接 会弹出如图2所示的对话框 选择完成后单击 下载 按钮就可以下载数据了 所下载的数据是CSV格式 图2 CSV Comma Separated Values
  • RTSP流媒体服务搭建

    主要用于测试目的 系统是windows 使用的是docker desktop 3 5 1 1 rtsp simple server 参考 https github com aler9 rtsp simple server docker 运行
  • React中 Real DOM 和 Virtual DOM 的区别?优缺点?

    一 是什么 Real DOM 真实 DOM 意思为文档对象模型 是一个结构化文本的抽象 在页面渲染出的每一个结点都是一个真实 DOM 结构 如下 Virtual Dom 本质上是以 JavaScript 对象形式存在的对 DOM 的描述 创
  • Qt 音乐播放器:实现点击窗体外的地方该窗口自动关闭

    最近在模仿网易云播放器的时候遇到这个问题 点击 播放列表 弹出音乐列表窗体 点击该窗体的其他的地方 该窗口自动关闭 如下所示 ps 录屏的时候 鼠标显示不出来 尴尬 为此 记录实现该种效果的方法 创建该对象的时候 设置坐标和大小都为0 m
  • tcp为什么要三次握手,tcp为什么可靠。

    为什么不能两次握手 防止已失效的连接请求又传送到服务器端 因而产生错误 假设改为两次握手 client端发送的一个连接请求在服务器滞留了 这个连接请求是无效的 client已经是closed的状态了 而服务器认为client想要建立 一个新
  • indexDB & localForage

    一 前言 前端本地化存储算是一个老生常谈的话题了 我们对于 cookies Web Storage sessionStorage localStorage 的使用已经非常熟悉 在面试与实际操作之中也会经常遇到相关的问题 但这些本地化存储的方