Open mengtuifrontend opened 5 years ago
上一篇文章我们提到了 localStorage 和 localForage,我们了解了 LS 的问题所在,以及社区中通常使用的替代 LS 的解决方案。现在,由 WICG(Web Incubator Community Group)提出了一个新的提案,一起来看看这份“真香”。
localStorage
localForage
KV Storage (Key Value Storage 简称,文章且称之为 KVS) 的出现是因为目前越来越多的应用都在依赖和使用 localForage 等基于 IndexedDB 的存储解决方案。为了能够更好的满足开发者的需求,KVS 的提案应允而生,它的目的是旨在提供一套方便、高效的浏览器内建 API 帮助开发者摆脱第三方组件库的依赖。
IndexedDB
在 KVS 的规范中提到的 KVS 的基本功能是提供开发者一套简单易用的异步存储 API,同时它还有一些额外的目标:
<p> You have viewed this page <span id="count">an untold number of</span> time(s). </p> <script type="module"> import { storage } from "std:kv-storage"; (async () => { let pageLoadCount = await storage.get("pageLoadCount") || 0; ++pageLoadCount; document.querySelector("#count").textContent = pageLoadCount; await storage.set("pageLoadCount", pageLoadCount); })(); </script>
KVS 提供 storage 和 StorageArea 两个对象,其中 storage 提供一个默认的 StorageArea 对象实例,而 StorageArea 则提供开发者创建不同储存区域的能力。
storage
StorageArea
import { storage, StorageArea } from "std:kv-storage";
storage 对象是一个 StorageArea 类的实例,我们这里就只介绍一下 StorageArea 类。
class StorageArea { constructor(name) set(key, value) // 设置 get(key) // 获取 delete(key) // 删除 clear() // 清除 keys() // 返回 key 集合 values() // 返回 value 集合 entries() // 成员遍历器,返回存储条目集合,数组类型 get backingStore() // 返回一个 BackingStore 对象 }
首先,在构造函数中,需要传参 name,它会被用于创建一个 kv-storage:${name} 为名称的 IndexedDB 数据库。如果 name 传入了一个非字符串,那么会进行 toString 强制转换为字符串。
name
kv-storage:${name}
toString
其他的方法和 Map 对象所提供的方法基本一致,不同的是,get、set、delete 和 clear 方法最终都会返回一个 Promise 对象。
Map
get
set
delete
clear
比较需要注意的是,如果 set 方法的第二个参数是 undefined 将会导致这个 key 被删除。
undefined
key
我们可以通过 storage.backingStore 的方式获得 BackingStore 对象,该对象包含了数据库名称等信息,可以被用于 IndexedDB 操作。
storage.backingStore
BackingStore
const { database, store, version } = storage.backingStore; const request = indexedDB.open(database, version); request.onsuccess = () => { const db = request.result; bulbasaurEvolve.onclick = () => { const transaction = db.transaction(store, "readwrite"); const store = transaction.objectStore(store); store.put("bulbasaur", false); store.put("ivysaur", true); db.close(); }; };
上面的例子展示了从 KVS 降级到 IndexedDB 的操作方法。
KVS 规范从浏览器层面为我们打造一套更加高效简单的存储方案,接下来就看各大浏览器厂商的实现计划了。
kv-storage 介绍 kv-storage 规范
本地存储方案介绍 —— KV Storage 介绍
上一篇文章我们提到了
localStorage
和localForage
,我们了解了 LS 的问题所在,以及社区中通常使用的替代 LS 的解决方案。现在,由 WICG(Web Incubator Community Group)提出了一个新的提案,一起来看看这份“真香”。KV Storage
KV Storage (Key Value Storage 简称,文章且称之为 KVS) 的出现是因为目前越来越多的应用都在依赖和使用
localForage
等基于IndexedDB
的存储解决方案。为了能够更好的满足开发者的需求,KVS 的提案应允而生,它的目的是旨在提供一套方便、高效的浏览器内建 API 帮助开发者摆脱第三方组件库的依赖。KVS 的特性
在 KVS 的规范中提到的 KVS 的基本功能是提供开发者一套简单易用的异步存储 API,同时它还有一些额外的目标:
localForage
的方式创建一个新的有别于默认的存储区域;storage & StorageArea
KVS 提供
storage
和StorageArea
两个对象,其中storage
提供一个默认的StorageArea
对象实例,而StorageArea
则提供开发者创建不同储存区域的能力。StorageArea 类
storage
对象是一个StorageArea
类的实例,我们这里就只介绍一下StorageArea
类。首先,在构造函数中,需要传参
name
,它会被用于创建一个kv-storage:${name}
为名称的IndexedDB
数据库。如果name
传入了一个非字符串,那么会进行toString
强制转换为字符串。其他的方法和
Map
对象所提供的方法基本一致,不同的是,get
、set
、delete
和clear
方法最终都会返回一个 Promise 对象。比较需要注意的是,如果
set
方法的第二个参数是undefined
将会导致这个key
被删除。BackingStore 对象
我们可以通过
storage.backingStore
的方式获得BackingStore
对象,该对象包含了数据库名称等信息,可以被用于IndexedDB
操作。上面的例子展示了从 KVS 降级到 IndexedDB 的操作方法。
总结
KVS 规范从浏览器层面为我们打造一套更加高效简单的存储方案,接下来就看各大浏览器厂商的实现计划了。
参考文档
kv-storage 介绍 kv-storage 规范
Thanks