💾

DenoのWeb Storage APIサポートとその将来について

2021/09/15に公開

はじめに

Denoはv1.10からWeb Storage APIをサポートしています。

この記事ではDenoにおけるWeb Storage APIのサポートについて解説します。

前提

この記事はDeno v1.14を想定して記述されています。

基本的な使い方

localStorage

まず、localStorageの使い方について解説します。

main.ts
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

main.ts
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のサポートに関する紹介でした。

脚注
  1. https://github.com/denoland/deno/issues/11882 ↩︎

Discussion