百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程网 > 正文

强烈推荐用1.2kb 的 idb 来管理 IndexedDB

yuyutoo 2024-12-15 17:42 5 浏览 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

相关推荐

当 Linux 根分区 (/) 已满时如何释放空间?

根分区(/)是Linux文件系统的核心,包含操作系统核心文件、配置文件、日志文件、缓存和用户数据等。当根分区满载时,系统可能出现无法写入新文件、应用程序崩溃甚至无法启动的情况。常见原因包括:...

玩转 Linux 之:磁盘分区、挂载知多少?

今天来聊聊linux下磁盘分区、挂载的问题,篇幅所限,不会聊的太底层,纯当科普!!1、Linux分区简介1.1主分区vs扩展分区硬盘分区表中最多能存储四个分区,但我们实际使用时一般只分为两...

Linux 文件搜索神器 find 实战详解,建议收藏

在Linux系统使用中,作为一个管理员,我希望能查找系统中所有的大小超过200M文件,查看近7天系统中哪些文件被修改过,找出所有子目录中的可执行文件,这些任务需求...

Linux 操作系统磁盘操作(linux 磁盘命令)

一、文档介绍本文档描述Linux操作系统下多种场景下的磁盘操作情况。二、名词解释...

Win10新版19603推送:一键清理磁盘空间、首次集成Linux文件管理器

继上周四的Build19592后,微软今晨面向快速通道的Insider会员推送Windows10新预览版,操作系统版本号Build19603。除了一些常规修复,本次更新还带了不少新功能,一起来了...

Android 16允许Linux终端使用手机全部存储空间

IT之家4月20日消息,谷歌Pixel手机正朝着成为强大便携式计算设备的目标迈进。2025年3月的更新中,Linux终端应用的推出为这一转变奠定了重要基础。该应用允许兼容的安卓设备...

Linux 系统管理大容量磁盘(2TB+)操作指南

对于容量超过2TB的磁盘,传统MBR分区表的32位寻址机制存在限制(最大支持2.2TB)。需采用GPT(GUIDPartitionTable)分区方案,其支持64位寻址,理论上限为9.4ZB(9....

Linux 服务器上查看磁盘类型的方法

方法1:使用lsblk命令lsblk输出说明:TYPE列显示设备类型,如disk(物理磁盘)、part(分区)、rom(只读存储)等。...

ESXI7虚机上的Ubuntu Linux 22.04 LVM空间扩容操作记录

本人在实际的使用中经常遇到Vmware上安装的Linux虚机的LVM扩容情况,最终实现lv的扩容,大多数情况因为虚机都是有备用或者可停机的情况,一般情况下通过添加一块物理盘再加入vg,然后扩容lv来实...

5.4K Star很容易!Windows读取Linux磁盘格式工具

[开源日记],分享10k+Star的优质开源项目...

Linux 文件系统监控:用脚本自动化磁盘空间管理

在Linux系统中,文件系统监控是一项非常重要的任务,它可以帮助我们及时发现磁盘空间不足的问题,避免因磁盘满而导致的系统服务不可用。通过编写脚本自动化磁盘空间管理,我们可以更加高效地处理这一问题。下面...

Linux磁盘管理LVM实战(linux实验磁盘管理)

LVM(逻辑卷管理器,LogicalVolumeManager)是一种在Linux系统中用于灵活管理磁盘空间的技术,通过将物理磁盘抽象为逻辑卷,实现动态调整存储容量、跨磁盘扩展等功能。本章节...

Linux查看文件大小:`ls`和`du`为何结果不同?一文讲透原理!

Linux查看文件大小:ls和du为何结果不同?一文讲透原理!在Linux运维中,查看文件大小是日常高频操作。但你是否遇到过以下困惑?...

使用 df 命令检查服务器磁盘满了,但用 du 命令发现实际小于磁盘容量

在Linux系统中,管理员或开发者经常会遇到一个令人困惑的问题:使用...

Linux磁盘爆满紧急救援指南:5步清理释放50GB+小白也能轻松搞定

“服务器卡死?网站崩溃?当Linux系统弹出‘Nospaceleft’的红色警报,别慌!本文手把手教你从‘删库到跑路’进阶为‘磁盘清理大师’,5个关键步骤+30条救命命令,快速释放磁盘空间,拯救你...

取消回复欢迎 发表评论: