-
Notifications
You must be signed in to change notification settings - Fork 0
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, the Web's First Built-In Module #6
Comments
看这篇文章要结合另外两篇文章作为前提: 值得翻译一遍。 |
在过去十年中,浏览器供应商和网络性能专家一直在说 localStorage 很慢,网络开发者应该停止使用它。 说实在的,确实如此,localStorage 是一个阻止主线程的同步 API,当你使用它的时候它可能会影响页面之间的交互。 问题在于 localStorage API 的设计十分简单,唯一能够替代 localStorage 的异步方案只有 IndexedDB,而它却因为 API 易用性设计较差鲜为人知。 因此开发者需要在难用的 IndexedDB 和有性能问题的 localStorage 中作出抉择。虽然有些库提供了 localStorage API 的简洁性,同时又采用异步调用来解决性能问题,但是在网页应用中,一个库本身的文件大小所包含的网络下载开销和 JS 解析开销也会影响到性能。 是否可以有这么一个库,既提供异步调用的 Storage API,性能方面又比较良好,并且我们使用它的时候还不需要支付文件大小开销呢? 答案是 Yes!Chrome 正在实验一个 build-in 模块的新功能,我们计划发布了第一个名为 在我介绍 KV Storage 之前,先给大家介绍下什么是 build-in 模块。 什么是 build-in 模块?build-in 模块和普通的 JavaScript 模块一样,只不过它无需下载,原生内置在浏览器中。 与传统的 Web API 一样,内置模块必须经过标准化和具有明确定义的规范化;但与传统 Web API 不同的是,它们不会暴露在全局范围内,可以通过
要导入 build-in 模块,需要使用前缀 import {storage, StorageArea} from 'std:kv-storage'; KV Storage 模块KV Storage 模块的 API 与 localStorage 是相似的,只不过它的 API 有点像 JavaScript 的 但是与 你可能注意到了上面的代码,包含 import {storage} from 'std:kv-storage';
const main = async () => {
const oldPreferences = await storage.get('preferences');
document.querySelector('form').addEventListener('submit', () => {
const newPreferences = Object.assign({}, oldPreferences, {
// Updated preferences go here...
});
await storage.set('preferences', newPreferences);
});
};
main(); 这里需要注意的是,KV Storage 目前只有 Chrome 74+ 版本才支持,你需要在实验室打开对应的开关:chrome://flags/#enable-experimental-web-platform-features. 浏览器不支持 KV Storage 时如何处理?如果你熟悉在浏览器中使用原生 JavaScript 模块,你可能知道(至少到目前为止)导入除 URL 以外的任何内容都会产生错误。而 那么,这里我们抛出一个问题:我们是否需要等待所有的浏览器都支持 build-in 模块的时候才开始在代码中使用它呢? 答案当然是 NO!你现在就可以配合 import maps import maps 本质上是一种机制,开发人员可以通过该机制将 这就为 build-in 模块提供了一种 polyfill 的机制,具体如下所示: <!-- 定义好 import map -->
<script type="importmap">
{
"imports": {
"/path/to/kv-storage-polyfill.mjs": [
"std:kv-storage",
"/path/to/kv-storage-polyfill.mjs"
]
}
}
</script>
<!-- 在 import 执行时会读取 map 配置-->
<script type="module">
import {storage} from '/path/to/kv-storage-polyfill.mjs';
// 使用 `storage` ...
</script> 上面的代码中, 这里的妙处就在于,不支持 build-in 模块的浏览器在执行这句代码的时候,真正引用的是 如果浏览器连
|
https://developers.google.com/web/updates/2019/03/kv-storage
The text was updated successfully, but these errors were encountered: