KV Storage のリリースは、Webプラットフォームにとって大きな問題です。 これは標準ライブラリ提案の一部であり、JavaScript用に導入されているより広範な標準ライブラリを見ることができます。
what kv-storage
にジャンプする前に、まずブラウザ内にデータを保存する方法について説明しましょう。 今すぐローカルデータを保存したい場合、私の主なオプションの1つは、localStorageを使用することです。
それを念頭に置いて、localStorage
を利用するJavaScriptを使用した単純なTodoアプリケーションを作成しましょう。 index.html
とmain.js
の2つのファイルが必要です。
main.js
const TODOS_KEY = 'todos'; const ul = document.getElementsByTagName('ul')[0]; const showExistingTodos = todos => { if (todos.length > 0) { todos.map(todo => { addLi(todo); }); } }; const addTodo = () => { const input = document.getElementById('todoInput').value; if (input.length > 0) { addLi(input); saveTodo(input); document.getElementById('todoInput').value = ''; } }; const addLi = text => { const li = document.createElement('li'); li.appendChild(document.createTextNode(text)); ul.appendChild(li); }; const saveTodo = todo => { let loadedTodos = loadTodos(); loadedTodos = [...loadedTodos, todo]; localStorage.setItem(TODOS_KEY, JSON.stringify(loadedTodos)); }; const loadTodos = () => { const todos = JSON.parse(localStorage.getItem(TODOS_KEY)); return todos != null ? todos : []; }; const clearTodos = () => { localStorage.removeItem(TODOS_KEY); const todos = Array.from(document.getElementsByTagName('li')); todos.map(todo => ul.removeChild(todo)); }; const todos = loadTodos(); showExistingTodos(todos);
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> </head> <body> <div> <input id="todoInput" type="text" /> <button onclick="addTodo()">Add Todo</button> <button onclick="clearTodos()">Clear todos</button> </div> <ul> </ul> <script src="main.js"></script> </body> </html>
これは間違いなく改善される可能性がありますが、例として使用できるアプリケーションができました。 Todoアイテムをいくつか追加してからページを更新すると、すぐに表示されることがわかります。
うーん…調べてみたところ、
localStorage
は同期していることがわかりました。 それは私たちのアプリケーションにとってどういう意味ですか?
基本的に、これはlocalStorage
への呼び出しがDOM内のレンダリングをブロックすることを意味します。 localStorage
に多くの要素がある場合、これは問題を表す可能性があり、パフォーマンスに大きな影響を与えます。
KVストレージ(キー/値ストレージ用)という名前の実験的な組み込みモジュールを見てみましょう。 これは、非同期ストレージAPIであるIndexedDBに基づいて構築されています。
では、IndexedDBをネイティブに使用してみませんか?
KVストレージを使用すると、localStorage
に似たより直感的なAPIが提供されます。 また、サードパーティのIndexedDBライブラリを使用する必要はありません。これで、ブラウザ内から直接使用できるようになりました。
KVストレージ
この例では、Chrome内で実験機能を有効にする必要があります。 Chromeブラウザ内で、次のアドレスに移動します。
実験的なウェブプラットフォーム機能で「有効」を選択します: [chrome://flags/#enable-experimental-web-platform-features chrome:// flags /#enable-experimental-web-platform-features]。
また、すべての実験的/新しいWeb機能に ChromeCanaryを使用することをお勧めします。 例として使用します。
次に、次の更新を実行する必要があります。
index.html
内で、main.js
をモジュールとしてインポートします。
<script type="module" src="main.js"></script>
次に、saveTodo
関数を更新して、localStorage.setItem()
の代わりにstorage.set()
を使用できるようにします。
const saveTodo = async todo => { let loadedTodos = await loadTodos(); loadedTodos = [...loadedTodos, todo]; await storage.set(TODOS_KEY, loadedTodos); };
loadTodos
関数は、localStorage.getItem()
の代わりにstorage.get()
を使用します。
const loadTodos = async () => { const todos = await storage.get(TODOS_KEY); return todos != null ? todos : []; };
ここで、 async/await関数を使用して非同期性を簡単に処理していることに注目してください。
最後に、localStorage.removeItem()
の代わりにstorage.delete()
を使用することで、clearTodos
機能を改善できます。
const clearTodos = () => { storage.delete(TODOS_KEY); const todos = Array.from(document.getElementsByTagName('li')); todos.map(todo => ul.removeChild(todo)); };
これらをwindow
オブジェクトに公開する必要もあります。
window.addTodo = addTodo; window.clearTodos = clearTodos;
アプリケーションが再び機能するようになりました。がlocalStorage
の代わりに、std:kv-storage
の組み込みWebモジュールを使用します。 これについての最もよい事は? 内部でIndexedDBを使用しています!
これは、すべてが非同期であることを意味します(async
およびawait
のpromise呼び出しでも参照されます)。
クライアントサポート
ブラウザがkv-storage
をサポートしていない場合はどうなりますか? 現時点では、これは非常に可能性が高いです。 幸い、ここで利用可能なポリフィルがあります:https://github.com/GoogleChromeLabs/kv-storage-polyfill。
この段階で本番環境でkv-storage
を使用する予定がある場合は、これをアプリケーションに追加することをお勧めします。
参考文献
Googleは、kv-storage
のデモを用意しています。 URLは次のとおりです: https://rollup-built-in-modules.glitch.me/