Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

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

Open
mengtuifrontend opened this issue Mar 11, 2019 · 0 comments
Open

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

mengtuifrontend opened this issue Mar 11, 2019 · 0 comments

Comments

@mengtuifrontend
Copy link
Owner

本地存储方案介绍 —— 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,同时它还有一些额外的目标:

  • 构建于 IndexedDB 之上,这避免了引入新的存储类型的麻烦并且提供了开发者在必要的情况下直接访问 IndexedDB 使用数据的可能;
  • 现代化的 API 接口,API 命名将对齐 Javascript 中的 Map 对象;
  • 支持隔离存储区域,有别于 LS 这种需要小心翼翼地命名存储键(key),防止值之间的覆盖。KVS 采用类似 localForage 的方式创建一个新的有别于默认的存储区域;
  • 是一个内建模块,KVS 将基于内建模块方式而非内置为全局变量。
<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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant