DenoのWeb Storage APIサポートとその将来について
はじめに
Denoはv1.10からWeb Storage APIをサポートしています。
この記事ではDenoにおけるWeb Storage APIのサポートについて解説します。
前提
この記事はDeno v1.14を想定して記述されています。
基本的な使い方
localStorage
まず、localStorageの使い方について解説します。
localStorage.setItem("foo", "bar");
console.assert(localStorage.getItem("foo") === "bar");
console.assert(localStorage.length === 1);
localStorage.clear();
console.assert(localStorage.length === 0);
APIについてはブラウザと同様であるものの、このファイルをdeno runで実行しようとするとエラーが発生します。
$ deno run main.ts
error: Uncaught ReferenceError: Access to "location", run again with --location <href>.
エラーメッセージにも表示されているように、localStorageを使用する際は--locationオプションでOriginとして扱うURLを指定する必要があります
$ deno run --location=http://localhost/ main.ts
localStorageにはOriginごとに最大で10MBまでデータを格納できます。
sessionStorage
sessionStorage.setItem("foo", "bar");
console.assert(sessionStorage.getItem("foo") === "bar");
console.assert(sessionStorage.length === 1);
sessionStorage.clear();
console.assert(sessionStorage.length === 0);
sessionStorageを使う際は、localStorageとは異なり--locationオプションの指定は不要です。
また、sessionStorageに保存したデータはDenoの実行が終了すると自動で破棄されます。
内部実装について
永続化
DenoはWeb Storage APIの永続化の手段としてSQLiteを使用しています。
localStorageを使用する際は、--locationオプションで指定されたOriginごとにデータベースファイルが作成され、そこにデータが保存されます。
sessionStorageを使用する際は、SQLiteのインメモリデータベースが使用されるため、Denoのプロセスが終了すると自動でデータが破棄されます。
データベースファイルはどこにあるの?
deno infoコマンドで調べることができます。
$ deno info
DENO_DIR location: "/home/uki00a/.cache/deno"
...
Origin storage: "/home/uki00a/.cache/deno/location_data"
データベースファイルの保存先は、Origin storageに表示されたパス+--locationオプションに指定したURLを元に決定されます。
例えば、--location=http://localhost/を指定した場合、
~/.cache/deno/location_data/e35da960b323d1fc5825fcc4a5332a3e94fb68dbe72f44832c270f2b02d7f871/local_storage
がデータベースファイルとして扱われます。(OriginをSHA256でハッシュ化した値がパスとして扱われます)
このパスを指定することで、例えばsqlitebrowserなどのGUIツールを使用してデータベースの中身を閲覧することもできます。
Denoの永続化の今後について
先週、GitHub DiscussionsにてDeno v2.0のスコープが公開されました。
この中に含まれている機能として、localStorageの利便性の向上やさらなる永続化API(IndexedDBなど)の実装に備えて、Internal Origin[1]の導入が検討されています。
このInternal Originが導入されれば、例えばlocalStorageを使用する際に--locationオプションを明示する必要がなくなるため、使い勝手がよくなることが想定されます。
おわりに
以上、DenoのWeb Storage APIのサポートに関する紹介でした。
Discussion