LoginSignup
0
1

More than 5 years have passed since last update.

Web Storage

Posted at

Web Storageとは

  • JSで扱うデータを手軽に永続化させるためのインターフェース
  • Key-Value型のシンプルなストレージ
  • 通常のJSオブジェクトと同様の操作で読み書きが可能
  • (Cookieと比べ)大容量のデータを保存可能。しかしインデックス作成やトランザクション処理は不可。



また注意点として

  • 大凡の目安で、保存可能の上限は5M
  • オリジンごとに共有のストレージが用意されるため注意。サービスが異なってもオリジンが同じであれば意味はない。

sessionStorageとlocalStorage

  • WebStorageの実態はグローバルオブジェクトに定義されたsessionStorageとlocalStorageという2つのオブジェクトである。
  • これらは通常のオブジェクトと同じように、ページ遷移してもプロパティは保存される。

sessionStorageとlocalStorageの違い

localStorage sessionStorage
共有される場合 ブラウザやPCの再起動でも生存し続ける。 通常のページ遷移や、リロード、iframeの子ページ、クラッシュからの復元など。
共有されない場合 明示的に削除した場合 新規ウィンドウや、新規タブ。ウィンドウを閉じて新しく開き直した場合のみ。

基本操作

  • データの読み書き (setItem,getItem)
  • データの削除 (removeItem)
  • データの列挙 (key,length)
  • storageイベントについて

データの読み書き

js
//読み書き
localStorage.setItem('key', 'foo');
let data = localStorage.getItem('key');

//JSと同様のアクセスが可能
localStorage.key = 'foo';
let data = localStorage.key;

//オブジェクトの読み書き
const obj = {x:1, y:2};

//オブジェクトをJSON文字列に変換して保存する
localStorage.key = JSON.stringify(obj);

//保存されたJSON文字列をオブジェクトに復元
const obj2 = JSON.parse(localStorage.key);

データの削除

js
//読み書き
localStorage.removeItem('key');

delete localStorage.key;

データの列挙

js
//保存されたデータを列挙
for (let i = 0; i < localStorage.length ; i++) {
  let key = localStorage.key(i);
  let value = localStorage[key];

  console.log(key, value);
}

storageオブジェクトの利用

js
window.addEventListener('storage', function(e) {
  if(event.key === 'userid') {
    const msg = 'こんにちは' + event.newValue; //更新後の値を取得するプロパティ
    document.getElementById('msg').textContent = msg;
  }
}, false);

ネームスペースの管理

  • ローカルストレージのでデータは明示的に削除しない限りリセットされないため、ローカル変数の感覚でセットしすぎると管理が困難になる。そのためネームスペースを利用しする。
js
let SERVICE_NAME = 'SERVICE_NAME';
let storage = null;

window.onload = function() {
  try {
    storage = JSON.parse(localStorage[SERVICE_NAME] || {});
  }catch ( e ) {
    storage = {};
  }
};

//画面を閉じるときにstorageを保存
window.onbeforeunload = function() {
  localStorage[SERVICE_NAME] = JSON.stringify(storage);
}

Cookieの利用

これまでブラウザにデータを保存する方法はCookieを利用していた。
しかし、Cookieには以下の問題点がある

  • 容量制限が4KBと少ない
  • サーバーへリクエストするたびにCookieが一緒に送られる
  • セッション情報などの重要な情報が格納されている事が多い

Cookieの利用法

  • データのセット
  • データの削除
  • データの取得
  • 有効期限を設定
js
//セット
document.cookie = 'hello';

//削除
document.cookie = 'hello; max-age=0';

//取得
const data = document.cookie.split(';');
data.forEach(function(value) {
  console.log(value);
}) 

//有効期限
document.cookie = 'hello; max-age=180'; //3分

//GMTで有効期限を設定
const count = new Date();
document.cookie = 'hello; expires=' + (Date.now() + 3600000).toUTCString;
0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1