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