ウェブアプリなどがブラウザ内にデータを保存するための localStorage は文字列しか保存できません。
なので、配列やJSONなどのObject
などを一旦JSON.stringify()
で文字列にしてから保存し、取り出した後はJSON.parse()
して元に戻してやる必要があります。
少し不便ですね。
そしてさらに、もうひとつ厄介なことがあります。実はこの localStorage は Chromeアプリ 内では使用することができないのです。Chromeアプリには chrome.storage.local
という非同期型のストレージAPIが用意されており、これが localStorage の代わりになります。*1
そこで、この2つの不便さを解消する、つまり、
- Object を Object のまま保存できる
- ブラウザとchromeアプリ意識せずにストレージを呼ぶことが出来る
- これまでの手軽さを保つ
の3つの条件を満たす storage を目指して、新たにラッパースクリプト「appStorage.js」を書いてみました。
appStorage.js
- chromeアプリ か ブラウザ かを見分ける。以下の方法で見分けています:
- chromeアプリならば
chrome.storage.local
に、ブラウザならばlocalStorage
を保存先とする。 - 保存先が
localStorage
であれば、Object
が与えられた場合、setの際にJSON.stringify()
とgetの際にJSON.parse()
する。
以上のことを自動で行います。使う場合はappStorage
を呼ぶだけでOKです。appStorage
は以下のように使用することができます。Callback関数の引数には、取得またはセットしたitem
、key
配列が与えられます。
(function(key, value) { // // SET // appStorage({"key": key, "value": value}, "set", function() { // // GET // appStorage(key, "get", function() { // // REMOVE // appStorage(key, "remove") }); }); })("test2", [{"name": "daiz"}, 2, "test"]);
これを実行してみると、ブラウザであっても、chromeアプリであっても、次のように全く同じ結果が得られます。
ブラウザで実行
Chromeアプリで実行
appStorage.js を入手する
ソースコードはGitHubから入手することができます。より便利になるように、自分でdogfoodingして改良を続けていきます。
*1:こちらは、ObjectをObjectのまま保存できるので localStorage より優れ物です。