前端本地存储数据库IndexedDB

news2024/11/15 17:59:48

前端本地存储数据库IndexedDB

  • 1、前言
  • 2、什么是 indexedDB?
  • 3、什么是 localForage?
  • 4、localForage 的使用
  • 5、VUE 推荐使用 Pinia 管理 localForage

1、前言

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

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

当我们的存储量比较大的时候,我们一定会想到我们的 indexedDB,让我们在浏览器中也可以使用数据库这种形式来玩转本地化存储,然而 indexedDB 的使用是比较繁琐而复杂的,有一定的学习成本,但第三方库 localForage 的出现,让我们轻松无负担的在浏览器中使用 indexedDB
截止今天,localForagegithubstar 已经23.4k了,可以说 localForageindexedDB 算是相互成就了。

2、什么是 indexedDB?

通俗地说,IndexedDB 就是浏览器提供的本地数据库,它可以被网页脚本创建和操作。IndexedDB 允许储存大量数据,提供查找接口,还能建立索引。这些都是 LocalStorage 所不具备的。就数据库类型而言,IndexedDB 不属于关系型数据库(不支持 SQL 查询语句),更接近 NoSQL 数据库。

IndexedDB 具有以下特点。

(1)键值对储存IndexedDB 内部采用对象仓库(object store)存放数据。所有类型的数据都可以直接存入,包括 JavaScript 对象。对象仓库中,数据以"键值对"的形式保存,每一个数据记录都有对应的主键,主键是独一无二的,不能有重复,否则会抛出一个错误。

(2)异步IndexedDB 操作时不会锁死浏览器,用户依然可以进行其他操作,这与 LocalStorage 形成对比,后者的操作是同步的。异步设计是为了防止大量数据的读写,拖慢网页的表现。

(3)支持事务IndexedDB 支持事务(transaction),这意味着一系列操作步骤之中,只要有一步失败,整个事务就都取消,数据库回滚到事务发生之前的状态,不存在只改写一部分数据的情况。

(4)同源限制IndexedDB 受到同源限制,每一个数据库对应创建它的域名。网页只能访问自身域名下的数据库,而不能访问跨域的数据库。

(5)储存空间大IndexedDB 的储存空间比 LocalStorage 大得多,一般来说不少于 250MB,甚至没有上限。

(6)支持二进制储存IndexedDB 不仅可以储存字符串,还可以储存二进制数据(ArrayBuffer 对象和 Blob 对象)。

3、什么是 localForage?

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

在这里插入图片描述

在这里插入图片描述

但是你也不必太过担心,因为 localforage 有一个降级策略,若浏览器不支持 IndexedDB 则使用 WebSQL ,如果不支持 WebSQL 则使用 localStorage。在所有主流浏览器中都可用:ChromeFirefoxIESafari(包括 Safari Mobile)。

4、localForage 的使用

localForage

  1. 下载并引入
// 下载
npm i localforage
or
pnpm add 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('somekey');
  // 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('somekey')
  1. 重置数据库
myIndexedDB.clear()

5、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)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1230356.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

键盘控制ROS车运动

键盘控制ROS车运动 上位机 使用pyseria库与stm32单片机进行通信控制 #!/usr/bin/env python # -*- coding: utf-8 -*import sys, select, termios, tty import serialmsg """ ---------------------------w a x ds w : x a : y s : -x …

NX二次开发UF_CAM_ask_cam_preferences 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_cam_preferences Defined in: uf_cam.h int UF_CAM_ask_cam_preferences(UF_CAM_preferences_p_t prefs ) overview 概述 This function provides the current settings of the CAM pre…

2024一定要看的文章系列!!!接口自动化测试框架思路和实战(5):【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键字驱动测试看上去与手工测…

Leetcode 153. 寻找旋转排序数组中的最小值

class Solution {//因为最小值和最大值总是相邻的(除了初始状态)//1.用二分查找,如果右侧是有序则最小值在左侧//2.如果右侧无序则最小值在右侧//如果mid正好是最小值,那么右侧自然是有序的,//为了将mid加入到搜索的一…

如何用内容营销推动企业成长?媒介盒子教你三步实现

信息时代下每个人都能通过网络了解自己所需的信息,企业与受众的接触也更加直接,企业在获得更多消费者触达通道的同时,消费者也在经历信息爆炸和碎片化,如何在大量信息中脱颖而出,抓住消费者心智,成为许多品…

外卖小程序系统:数字化餐饮的编码之道

在当今数字化时代,外卖小程序系统成为了餐饮业的一项技术巨制。这个系统不仅提供了便捷的点餐体验,更通过先进的技术手段,实现了高效订单处理、实时配送追踪以及个性化推荐。让我们深入了解外卖小程序系统的技术魔法,一起揭秘数字…

API接口接入1688电商数据平台获取商品详情数据示例

1688电商数据平台是一个提供海量商品信息的数据平台,通过API接口可以方便地获取商品详情数据。以下是一个示例,演示如何接入1688电商数据平台,获取商品详情数据。 步骤一:注册1688账号并获取API权限 首先需要在1688电商数据平台…

ArkTS编程语法基础,让你成为HarmonyOS开发高手

文章目录 ArkTS简介ArkUI开发框架的整体架构ArkTS的基础类型条件语句函数类模块函数定义函数的参数箭头函数 迭代器后续学习资源介绍 ArkTS简介 ArkTS是HarmonyOS主力应用开发语言。它在TypeScript (简称TS)的基础上,匹配ArkUI框架,扩展了声明式UI、状态…

防火墙..

目录 1.什么是防火墙 1.1分类 1.2.Netfilter(数据包过滤) 1.2.1定义 1.2.2Netfilter分析内容 1.3防火墙无法完成的任务 1.4iptables 与firewalld区别 2.iptables 2.1iptables执行原则 2.1.1原则 2.1.2防火墙规则 2.2规则链 2.2.1概念 2.2.2分析 2.2.3规则链分类…

leetcode:反转链表

题目描述 题目链接:206. 反转链表 - 力扣(LeetCode) 分析题目 思路一 我们可以设计算法让整个链表掉头 定义三个代码n1,n2,n3 n1指向NULL,n2指向head,n3指向第二个结点 当n2不为NULL的时候,让n2->ne…

fastdfs-client-java-1.30 maven 打包安装

1. 进入源代码目录,打开cmd mvn clean install 或者 mvn package 问题不大的话会在同级目录target目录下生成打包后文件 2. 当前目录下cmd进行maven安装 mvn install:install-file -DgroupIdorg.csource -DartifactIdfastdfs-client-java -Dversion${version} -D…

CompletableFuture.join() vs Future.get(),开发中哪个更好

CompletableFuture和Future都是Java中的接口,用于异步编程和并发处理。 Future表示一种异步计算的结果,可以通过get()方法获取计算结果或等待计算的完成。但是,如果计算还未完成,get()方法会阻塞线程,这会影响并发性能…

虾皮台湾站点什么好卖

在如今的电商时代,越来越多的人选择通过网购来满足购物需求。而中国台湾地区作为一个充满机遇的市场,吸引了许多商家的目光。虾皮作为台湾地区最大的电商平台之一,为卖家提供了丰富的销售机会。但是,卖家们在选择什么产品来销售时…

文档明明在桌面上却不显示?5个方法轻松解决!

“我之前保存文档的时候明明选择保存在桌面,上次看的时候文件还在,但是今天打开电脑后发现我保存在桌面的文档不见了,这是为什么呢?还有机会找回我的文件吗?” 在日常使用电脑时,有些用户为了方便&#xff…

大势智慧代理商体系持续开疆拓土,全国代理火热招募中...

11月15日,武汉大势智慧科技有限公司(后简称“大势智慧”)与上海宝天信息科技有限公司(后简称“宝天信息”)金牌代理商签约授牌仪式成功举行。大势智慧副总裁周济安先生、宝天信息经理王芳女士分别作为双方签约代表出席…

virtuoso 后仿 ADE L error

ADE后仿时出现error ERROR (SFE-23): "input.scs" 299: The instance _57_D32_noxref is referencing an undefined model or subcircuit, parasitic_nwd. Either include the file containing the definition of parasitic_nwd, or define parasitic_nwd before run…

STM32定时器输入捕获测量高电平时间

STM32定时器输入捕获测量高电平时间 输入捕获测量高电平时间CuebMX配置代码部分 本篇内容要求读者对STM32通用定时器有一点理解,如有不解,请看 夜深人静学32系列15——通用定时器 输入捕获 输入捕获是STM32通用定时器的一种功能,可以捕获特定…

mysql数据库【进阶篇】

1.存储引擎 1.1 mysql的体系结构 连接层:最上层是一些客户端和链接服务,主要完成- -些类似于连接处理、授权认证、及相关的安全方案。服务器也会为安全接入的每个客户端验证它所具有的操作权限。服务层:第二层架构主要完成大多数的核心服务功…

Scrum敏捷开发培训团队和组织来说的重要性

Scrum敏捷开发培训对于团队和组织来说是至关重要的,有以下几点,大家可以参考下: 理解敏捷价值观和原则: 培训有助于团队理解敏捷方法背后的核心理念和价值观,包括个体和互动、工作软件、客户合作和响应变化。这有助于建…