mengtuifrontend / Blog

芦叶满汀洲,寒沙带浅流。二十年重过南楼。柳下系船犹未稳,能几日,又中秋。 黄鹤断矶头,故人今在否?旧江山浑是新愁。欲买桂花同载酒,终不似,少年游。
18 stars 5 forks source link

本地存储方案介绍 —— KV Storage 介绍 #6

Open mengtuifrontend opened 5 years ago

mengtuifrontend commented 5 years ago

本地存储方案介绍 —— KV Storage 介绍

上一篇文章我们提到了 localStoragelocalForage,我们了解了 LS 的问题所在,以及社区中通常使用的替代 LS 的解决方案。现在,由 WICG(Web Incubator Community Group)提出了一个新的提案,一起来看看这份“真香”。

KV Storage

KV Storage (Key Value Storage 简称,文章且称之为 KVS) 的出现是因为目前越来越多的应用都在依赖和使用 localForage 等基于 IndexedDB 的存储解决方案。为了能够更好的满足开发者的需求,KVS 的提案应允而生,它的目的是旨在提供一套方便、高效的浏览器内建 API 帮助开发者摆脱第三方组件库的依赖。

KVS 的特性

在 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>

storage & StorageArea

KVS 提供 storageStorageArea 两个对象,其中 storage 提供一个默认的 StorageArea 对象实例,而 StorageArea 则提供开发者创建不同储存区域的能力。

import { storage, StorageArea } from "std:kv-storage";

StorageArea 类

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 强制转换为字符串。

其他的方法和 Map 对象所提供的方法基本一致,不同的是,getsetdeleteclear 方法最终都会返回一个 Promise 对象。

比较需要注意的是,如果 set 方法的第二个参数是 undefined 将会导致这个 key 被删除。

BackingStore 对象

我们可以通过 storage.backingStore 的方式获得 BackingStore 对象,该对象包含了数据库名称等信息,可以被用于 IndexedDB 操作。

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 规范


Thanks