强烈推荐用1.2kb 的 idb 来管理 IndexedDB
yuyutoo 2024-12-15 17:42 3 浏览 0 评论
大家好,很高兴又见面了,我是"高级前端?进阶?",由我带着大家一起关注前端前沿、深入前端底层技术,大家一起进步,也欢迎大家关注、点赞、收藏、转发!
1.什么是 IndexedDB
IndexedDB 是一个大型 NoSQL 存储系统,允许存储用户浏览器中的几乎所有内容。 除了常见的搜 search、get、put 操作之外,IndexedDB 还支持事务。
以下是 MDN 上 IndexedDB 和 NoSQL 的定义:
- IndexedDB 是一个底层 API,用于客户端存储大量结构化数据(包括文件 / blob), 此 API 使用索引来实现对此数据的高性能搜索。 虽然 DOM 存储对于存储少量数据很有用,但对于存储大量结构化数据则不太有用,而 IndexedDB 提供了一个解决方案。
- NoSQL 数据库,又名 “not only SQL”,是非表格数据库,其数据存储方式与关系表不同。 根据数据模型,NoSQL 数据库有多种类型, 主要类型有:文档、键值、宽列和图表,其提供灵活的模式,并可以轻松扩展大量数据和高用户负载。
每个 IndexedDB 数据库对于某个源(通常是站点域或子域)来说都是唯一的,这意味着其无法访问或被任何其他源访问。 数据存储限制通常相当大(如果存在的话),但不同的浏览器以不同的方式处理限制和数据清理。
可以通过下面方式判断浏览器是否支持 IndexedDB:
function indexedDBStuff () {
// Check for IndexedDB support:
if (!('indexedDB' in window)) {
// Can't use IndexedDB
console.log("This browser doesn't support IndexedDB");
return;
} else {
// Do IndexedDB stuff here:
// ...
}
}
// Run IndexedDB code:
indexedDBStuff();
2.什么是 idb
idb 是一个很小的(~1.19kB)JavaScript 库,主要包括 IndexedDB API,但有一些小的改进,比如:可用性。idb 面向现代主流浏览器,包括: Chrome、Firefox、Safari 以及使用这些引擎的其他浏览器(例如 Edge),但是不包括 IE。
目前 idb 在 Github 通过 MIT 协议开源,有超过 5.8k 的 star、5970k 的项目使用量,NPM 周平均下载了 5,315k,是一个值得关注的前端优质开源项目。
如何使用 idb
安装 idb
首先需要通过 npm 安装:
npm install idb
然后使用模块兼容的系统,如: webpack、Rollup 等:
import {openDB, deleteDB, wrap, unwrap} from 'idb';
async function doDatabaseStuff() {
const db = await openDB(…);
}
当然,也可以通过 CDN 引用相关 UMD 依赖直接在浏览器 HTML 中使用:
<script src="https://cdn.jsdelivr.net/npm/idb@8/build/umd.js"></script>
<script>
async function doDatabaseStuff() {
const db = await idb.openDB(…);
}
</script>
此时将创建一个全局 idb 对象,其中包含模块版本的所有导出。
idb 常见方法
openDB
此方法打开一个数据库,并返回一个增强的 IDBDatabase 的 Promise。
const db = await openDB(name, version, {
upgrade(db, oldVersion, newVersion, transaction, event) {
// …
},
blocked(currentVersion, blockedVersion, event) {
// …
},
blocking(currentVersion, blockedVersion, event) {
// …
},
terminated() {
// …
},
});
deleteDB
删除数据库:
await deleteDB(name, {
blocked() {
// …
},
});
- name:数据库的名称。
- blocked(可选):如果数据库已存在并且存在未响应版本更改事件而关闭的打开连接,则调用该请求,直到它们全部关闭为止。
unwrap
获取增强的 IndexedDB 对象并返回未修改的普通对象。
const unwrapped = unwrap(wrapped);
如果出于某种原因,开发者想返回到普通 IndexedDB 可以使用该方法。,Promise 也将被转换回 IDBRequest 对象。
wrap
获取 IDB 对象并返回由此库增强的版本。
const wrapped = wrap(unwrapped);
如果某些第三方代码为开发者提供了 IDBDatabase 对象并且希望它具有该库的功能,则这非常有用。
普通增强
打开数据库后,API 与 IndexedDB 相同,只是做了一些使事情变得更容易的更改。 首先,任何通常返回 IDBRequest 对象的方法现在都将返回结果的 Promise。
const store = db.transaction(storeName).objectStore(storeName);
const value = await store.get(key);
该库将所有 IDBRequest 对象转换为 Promise,但它事先并不知道哪些方法可能返回 Promise。因此,诸如 store.put 之类的方法可能会抛出异常而不是返回 Promise。而如果开发者使用异步函数,则没有明显的差异。
Transaction lifetime
在 Transaction 开始和结束之间不要 await 其他事情,否则 Transaction 将在完成之前关闭。
如果处理完微任务后没有任何剩余操作,IDB 事务会自动关闭。因此,下面代码能正常工作:
const tx = db.transaction('keyval', 'readwrite');
const store = tx.objectStore('keyval');
const val = (await store.get('counter')) || 0;
await store.put(val + 1, 'counter');
await tx.done;
但是下面代码却不能:
const tx = db.transaction('keyval', 'readwrite');
const store = tx.objectStore('keyval');
const val = (await store.get('counter')) || 0;
// This is where things go wrong:
const newVal = await fetch('/increment?val=' + val);
// 这里抛出错误
await store.put(newVal, 'counter');
await tx.done;
idb 的更多方法和使用示例可以参考文末资料,这里不再过多展开。
3.本文总结
本文主要和大家介绍 idb ,其是一个很小的(~1.19kB)JavaScript 库,主要包括 IndexedDB API,但有一些小的改进,比如:可用性。因为篇幅问题,关于 idb 主题只是做了一个简短的介绍,但是文末的参考资料提供了大量优秀文档以供学习,如果有兴趣可以自行阅读。如果大家有什么疑问欢迎在评论区留言。
参考资料
https://github.com/jakearchibald/idb
https://www.npmjs.com/package/idb
https://web.dev/articles/indexeddb
https://www.mongodb.com/nosql-explained
https://hackernoon.com/use-indexeddb-with-idb-a-1kb-library-that-makes-it-easy-8p1f3yqq
https://blog.openreplay.com/getting-started-with-indexeddb-for-big-data-storage/
https://filipvitas.medium.com/indexeddb-with-promises-and-async-await-3d047dddd313
相关推荐
- YAML配置文件简介及使用(yaml 配置)
-
简介YAML是"YAMLAin'taMarkupLanguage"(YAML不是一种标记语言)的缩写。相比JSON格式的方便。...
- 教你如何解决最常见的58种网络故障排除方法
-
1.故障现象:网络适配器(网卡)设置与计算机资源有冲突。分析、排除:通过调整网卡资源中的IRQ和I/O值来避开与计算机其它资源的冲突。有些情况还需要通过设置主板的跳线来调整与其它资源的冲突。2.故障现...
- 一分钟带你了解服务器网卡(服务器网卡怎么用)
-
今天小编和大家聊一下服务器的网卡。什么是网卡?简单说网卡就是计算机与局域网互连的设备。计算机主要通过网卡接入网络。网卡又称为网络适配器或网络接口卡NIC(NetworkinterfaceCard)...
- linux文件之ssh配置文件的含义与作用
-
ssh远程登录命令是操作系统(包括linux和window系统)下常用的操作命令,可以帮助用户,远程登录服务器系统,查看,操作系统相关信息。linux系统对于ssh命令有专门保存其相关配置的目录和文件...
- Cilium 官方文档翻译 - IPAM(二)Kubernetes Host模式
-
KubernetesHostScopeciliumIPAM的kuberneteshost-scope模式通过选项ipam:kubernetes开启,将集群IP地址分配委托给每个独立的节点,并...
- 域名劫持跳转,域名劫持跳转的解决办法只需5步
-
简单来说,域名劫持就是把原本准备访问某网站的用户,在不知不觉中,劫持到仿冒的网站上,例如用户准备访问某家知名品牌的网上商店,黑客就可以通过域名劫持的手段,把其带到假的网上商店,同时收集用户的ID信息和...
- Linux 磁盘和文件系统管理(linux磁盘管理fdisk)
-
1检测并确认新硬盘...
- windows host文件怎么恢复?局域网访问全靠这些!
-
windowshost文件怎么恢复?windowshost文件是常用网址域名及其相应IP地址建立一个关联文件,通过这个host文件配置域名和IP的映射关系,以提高域名解析的速度,方便局域网用户使用...
- Nginx配置文件详解与优化建议(nginx 配置详解)
-
1、概述今天来详解一下Nginx的配置文件,以及给出一些配置建议,希望能对大家有所帮助。...
- Mac电脑hosts文件锁定,如何修改hosts文件权限
-
有时候我们需要修改hosts文件,但是网上很多教程都行不通,使用sudo命令也不行。其实有一个很简单的方法。打开终端命令行,使用如下命令即可:sudochflags-hvnoschg/etc/...
- windows电脑如何修改hosts文件?(windows 修改hosts文件)
-
先来简单说下电脑host的作用hosts文件的作用:hosts文件是一个用于储存计算机网络中各节点信息的计算机文件;作用是将一些常用的网址域名与其对应的IP地址建立一个关联“数据库”,当用户在浏览器中...
- Vigilante恶意软件行为怪异:修改Hosts文件以阻止受害者访问盗版网站
-
Sophos刚刚报道了一款名叫Vigilante的恶意软件,但其行为却让许多受害者感到不解。与其它专注于偷密码、搞破坏、或勒索赎金的恶意软件不同,Vigilante会通过修改Hosts文件...
- hosts文件无法修改几种现象和解决方法
-
第一种、hosts文件修改完不是直接保存而是弹出另存为窗口解决:1、右击hosts文件——属性——把“只读”前面勾去掉。第二种、打开hosts文件时提示“你没有权限打开该文件,请向文件的所有者或管理员...
- hosts文件位置在哪里,教你hosts文件位置在哪里
-
Hosts是一个没有扩展名的系统文件,其基本作用就是将一些常用的网址域名与其对应的IP地址建立一个关联"数据库",当用户在浏览器中输入一个需要登录的网址时,系统会首先自动从Hosts文件中寻找对应的I...
你 发表评论:
欢迎- 一周热门
-
-
前端面试:iframe 的优缺点? iframe有那些缺点
-
带斜线的表头制作好了,如何填充内容?这几种方法你更喜欢哪个?
-
漫学笔记之PHP.ini常用的配置信息
-
其实模版网站在开发工作中很重要,推荐几个参考站给大家
-
推荐7个模板代码和其他游戏源码下载的网址
-
[干货] JAVA - JVM - 2 内存两分 [干货]+java+-+jvm+-+2+内存两分吗
-
正在学习使用python搭建自动化测试框架?这个系统包你可能会用到
-
织梦(Dedecms)建站教程 织梦建站详细步骤
-
2024PHP在线客服系统源码+完全开源 带详细搭建教程
-
【开源分享】2024在线客服系统PHP源码(安装教程+全新UI)
-
- 最近发表
- 标签列表
-
- mybatis plus (70)
- scheduledtask (71)
- css滚动条 (60)
- java学生成绩管理系统 (59)
- 结构体数组 (69)
- databasemetadata (64)
- javastatic (68)
- jsp实用教程 (53)
- fontawesome (57)
- widget开发 (57)
- vb net教程 (62)
- hibernate 教程 (63)
- case语句 (57)
- svn连接 (74)
- directoryindex (69)
- session timeout (58)
- textbox换行 (67)
- extension_dir (64)
- linearlayout (58)
- vba高级教程 (75)
- iframe用法 (58)
- sqlparameter (59)
- trim函数 (59)
- flex布局 (63)
- contextloaderlistener (56)