摘要:那么是否有既簡單并且又不阻塞主線程的呢好消息是正在嘗試一種稱為內(nèi)置模塊的新功能,計劃發(fā)布的第一個內(nèi)置模塊是名為的異步鍵值存儲模塊,先來了解一下什么是內(nèi)置模塊。
相信作為web開發(fā)者大家都使用過瀏覽器的本地存儲localStorage,它是一個會阻止主線程的同步API,只要使用就可能會阻止頁面的交互。
我們都知道瀏覽器有異步的IndexedDB作為存儲方案,只是它的API使用方式比localStorage要復雜很多。
那么是否有既簡單并且又不阻塞主線程的API呢?
好消息是Chrome正在嘗試一種稱為內(nèi)置模塊的新功能,計劃發(fā)布的第一個內(nèi)置模塊是名為KV Storage的異步鍵/值存儲模塊,先來了解一下什么是內(nèi)置模塊。
內(nèi)置模塊內(nèi)置模塊就像常規(guī)JavaScript 模塊一樣,唯一區(qū)別是它們不必下載,而是隨瀏覽器一起提供。
與傳統(tǒng)的Web API一樣,內(nèi)置模塊必須經(jīng)過標準化過程 - 每個模塊都有自己的規(guī)范,需要進行設計審查,并且在發(fā)布之前需要Web開發(fā)人員和其他瀏覽器供應商提供支持。
與傳統(tǒng)的Web API不同,內(nèi)置模塊不會在全局范圍內(nèi)公開 它們只能通過導入獲得。
不全局暴露內(nèi)置模塊有很多優(yōu)點:它們不會增加任何開銷來啟動新的JavaScript運行時上下文,并且不會消耗任何內(nèi)存或CPU。此外,可以避免與當前上下文變量命名沖突的風險。
在支持的瀏覽器中,您可以使用以下代碼導入KV存儲模塊。
import {storage, StorageArea} from "std:kv-storage";KV存儲模塊
KV存儲模塊的簡單性與localStorage API類似,但其API形狀實際上更接近 JavaScriptMap。
除了getItem(), setItem()以及removeItem(),它還有get(), set()和delete()以及Map類似的方法,如 keys(), values()和 entries()。
鍵名不必是字符串。它們可以是任何結構化可序列化類型。
與Map不同的是,所有KV存儲方法都返回 promises或 異步迭代器
KV存儲模塊對外暴露兩個變量:storage和StorageArea,其中storage是StorageArea名為"default"的默認實例。
以下是如何在代碼中使用KV存儲模塊的示例:
import {storage} from "std:kv-storage"; const main = async () => { const oldPreferences = await storage.get("preferences"); document.querySelector("form").addEventListener("submit", async () => { const newPreferences = Object.assign({}, oldPreferences, { // Updated preferences go here... }); await storage.set("preferences", newPreferences); }); }; main();如果瀏覽器不支持內(nèi)置模塊怎么辦?
對于不支持內(nèi)置模塊的瀏覽器,std:kv-storage無法識別成有效的URL,這時可以通過引入polyfill解決,但如果瀏覽器支持內(nèi)置模塊,我們更希望的是優(yōu)先使用內(nèi)置提供的模塊,這就需要一個導入映射的功能,也是chrome正在嘗試的一個新功能。
導入映射導入映射本質(zhì)上是一種機制,開發(fā)人員可以通過該機制將導入標識符另起別名,這可以為瀏覽器無法識別std:kv-storage的時侯提供備用路徑。
代碼示例:
上面代碼中的關鍵點是URL /path/to/kv-storage-polyfill.mjs 被映射到兩個不同的資源:std:kv-storage和 /path/to/kv-storage-polyfill.mjs。
因此,當瀏覽器遇到引用該URL(/path/to/kv-storage-polyfill.mjs)的import語句時,它首先嘗試加載std:kv-storage,如果不能,則它會回退到加載 /path/to/kv-storage-polyfill.mjs。
# 那么根本不支持模塊的瀏覽器呢?
為了使用導入映射有條件地加載內(nèi)置模塊,必須實際使用導入語句,這也意味著必須使用模塊腳本,即