localStorage とは
localStorage は、ブラウザが端末の中に、名前と値の組を保存する仕組みです。ページを閉じても、再読み込みしても、値が残ります。
このレッスンでは、保存の書き方と、大きさの上限、消えてしまう場合を学びます。
このレッスンのゴール
メモ
データを端末に保存する方法と、その限界を説明できる。
重要な言葉
| ことば | いみ | れい |
|---|---|---|
| localStorage | 文字の組を、端末のブラウザの中に保存する仕組み | |
| キーと値 | 名前と、それに結びついた中身の組 | "habits" と JSON の文字 |
| 上限 | 保存できる大きさの限り | |
| オリジン | アドレスの、https と名前とポートの組 | |
| IndexedDB | 大きなデータも入る、ブラウザの中のデータベース |
学生が入力するセルは、このプレビューでは空白です。
値は文字だけ。JSON にして入れる
localStorage に入れられるのは、文字だけです。setItem で入れ、getItem で読みます。
配列や辞書のようなデータは、JSON.stringify で文字にして入れ、読んだら JSON.parse で戻します。ラボのアプリも、この形です。
学食の注文を保存する
const KEY = "orders";
// 保存する。配列を JSON の文字にして入れる
function save(orders) {
localStorage.setItem(KEY, JSON.stringify(orders));
}
// 読む。何もなければ、空の配列を使う
function load() {
return JSON.parse(localStorage.getItem(KEY) || "[]");
}ラボのアプリの保存を探す
ラボのアプリは、習慣の一覧を localStorage に入れています。grep で、その行を探します。
-n は、行の番号を付ける印です。出力は、行の番号とその行の文です。
localStorage を使う行を探す
docker exec jupyter grep -n localStorage app/app.jsここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
保存できる大きさには上限がある
保存できる大きさには、上限があります。多くのブラウザで、オリジンごとに 5 MB 前後ですが、ブラウザしだいです。
上限を超えて入れようとすると、エラーが起きます。エラーを受け止める try と catch を、書いておきます。
あふれたときのエラーを受ける
function trySave(key, text) {
try {
localStorage.setItem(key, text);
return true;
} catch (error) {
// 上限を超えると、ここに来る
console.log("保存できませんでした");
return false;
}
}大きさは、文字の数とは限らない
日本語の文字は、保存の大きさを数えるとき、英数字より大きくなることがあります。UTF-8 では、ひらがなは1文字が3バイトです。
次の Run は、「あ」を UTF-8 の列にして、バイトの数を出します。
「あ」のバイト数を数える
docker exec jupyter python3 -c "print(len('\u3042'.encode('utf-8')))"ここでは表示のみで、実行されません。無料アカウントを作成すると、実行ボタンで自分のラボのターミナルに入力できます。
保存したデータが消える場合
| 場面 | どうなるか | 対策 |
|---|---|---|
| 利用者がサイトのデータを消す | すべて消える | 大事な物は、サーバーにも置く |
| 別のブラウザで開く | 見えない | サーバーで共有する |
| 別の端末で開く | 見えない | ログインして、サーバーから読む |
| プライベートな閲覧 | 閉じると消えることが多い | 消えても困らない作りにする |
| 保存の上限を超える | エラーで保存されない | エラーを受けて、知らせる |
学生が入力するセルは、このプレビューでは空白です。
ほかの保存場所との使い分け
IndexedDB は、大きなデータや、写真のような中身も入る、ブラウザの中のデータベースです。使い方は、localStorage より複雑です。
パスワードのような秘密は、localStorage に置きません。ページの中のどのスクリプトからも、読めてしまうからです。
よくある間違い
注意
ブラウザに保存すれば、ずっと残ると考える間違いが多いです。利用者が消すと、なくなります。ほかの端末にも、ありません。大事なデータは、サーバーにも置きます。