Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】LocalStorage vs IndexedDB: JavaScript Guide (Storage, Limits & Best Practices)

2025年09月28日に「Dev.to」が公開したITニュース「LocalStorage vs IndexedDB: JavaScript Guide (Storage, Limits & Best Practices)」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Webアプリのデータ保存にはLocalStorageとIndexedDBがある。LocalStorageは小容量の文字列データを同期的に保存するのに適しており、ユーザー設定などに使う。一方、IndexedDBは大容量のオブジェクトを非同期で扱うデータベースで、オフライン機能や複雑なデータ管理に最適だ。用途に応じた選択が重要となる。

ITニュース解説

ウェブアプリケーションを開発する際、データを効率的に保存することは非常に重要である。JavaScriptには、ブラウザの内部でデータを保存するための主要な選択肢としてLocalStorageとIndexedDBの二つが存在する。これらはそれぞれ異なる特徴を持ち、用途に応じて使い分ける必要がある。

まず、LocalStorageについて解説する。LocalStorageは、ブラウザ内に少量のデータを保存するためのシンプルで手軽な仕組みだ。データを「鍵(キー)」と「値(バリュー)」のペアで管理する。ちょうど、鍵とそれに対応する引き出しの中身、と考えるとイメージしやすいだろう。特徴としては、保存できるデータは文字列形式に限られるという点が挙げられる。数字やオブジェクトを保存したい場合は、一度文字列に変換してから保存する必要がある。また、処理が「同期」で行われるため、LocalStorageへのデータの読み書きが行われている間、ウェブページの表示やユーザーインターフェース(UI)の操作が一時的に停止してしまう可能性がある。保存容量は約5MBまでと比較的少ない。しかし、一度保存されたデータは、ブラウザを閉じたりコンピュータを再起動したりしても消えることなく、永続的に保持される。データの検索やインデックス付けといった高度な機能は持たない。LocalStorageの具体的な利用例としては、ユーザーがウェブサイトで選択したテーマの色やフォントサイズといった設定、一時的な認証トークン、あるいは基本的なアプリケーションの各種設定の保存などが挙げられる。データの保存はlocalStorage.setItem("キー", "値")、取得はlocalStorage.getItem("キー")、削除はlocalStorage.removeItem("キー")、全てのデータの消去はlocalStorage.clear()といった非常に直感的な方法で行える。

次に、IndexedDBについて見ていこう。IndexedDBは、LocalStorageとは異なり、より大規模で複雑なデータを保存するための強力なデータベースシステムだ。これはブラウザ内で動作するNoSQLデータベースの一種であり、リレーショナルデータベースのように厳密なスキーマを必要とせず、柔軟な形式でデータを保存できる。大きな特徴として、文字列だけでなく、JavaScriptのオブジェクト、画像、ファイル(Blob)といった多様な種類のデータを直接保存できる点が挙げられる。処理は「非同期」で行われるため、データの読み書き中にウェブページのUIが固まることなく、スムーズなユーザー体験を提供できる。保存容量は非常に大きく、利用可能なディスク容量の最大50%程度まで利用できる場合もあるため、実質的に大量のデータを扱える。さらに、トランザクション機能やインデックス(索引)機能もサポートしており、これにより複数のデータ操作をまとめて安全に行ったり、大量のデータの中から特定の情報を高速に検索したりすることが可能だ。LocalStorageと同様にデータは永続的に保存される。IndexedDBの代表的な利用例としては、オフラインでも利用できるウェブアプリケーションの構築、商品カタログのような大規模なデータセットの保存、取得したAPIレスポンスの効率的なキャッシュ、画像や動画ファイルなどのバイナリデータの保存などが挙げられる。IndexedDBの操作はLocalStorageよりもやや複雑で、データベースを開く、オブジェクトストア(データを保存する場所)を作成する、トランザクションを開始してデータを追加・読み取り・削除するといった手順が必要となる。例えば、indexedDB.open("データベース名", バージョン)でデータベースを開き、onupgradeneededイベントでオブジェクトストアを定義し、onsuccessイベントでトランザクションを開始してobjectStore.add()などでデータを操作する。

LocalStorageとIndexedDBの主な違いを比較すると、まずデータ型において、LocalStorageが文字列のみを扱うのに対し、IndexedDBはオブジェクトやファイルなど多様なデータ型を扱える。保存容量では、LocalStorageが約5MBに制限される一方、IndexedDBはギガバイト単位の大容量データを扱える。パフォーマンスの面では、LocalStorageが同期処理でUIをブロックする可能性があるのに対し、IndexedDBは非同期処理でUIをブロックしない。データの検索機能については、LocalStorageにはなく、IndexedDBはインデックスを使った高速なクエリをサポートしている。また、IndexedDBはACID特性を持つトランザクションをサポートし、データの整合性を保証できるが、LocalStorageにはそのような機能はない。セキュリティに関しても、LocalStorageはJavaScriptから簡単にアクセスできるためクロスサイトスクリプティング(XSS)攻撃のリスクがある一方、IndexedDBはよりセキュアなサンドボックス環境で動作する。

これらのストレージを利用する上での制限とベストプラクティスも理解しておくべきだ。LocalStorageの容量制限は約5MBであり、この制限を超えるとエラーが発生する。IndexedDBは非常に大容量を扱えるものの、ブラウザは容量が一定量を超えるとユーザーに許可を求める場合がある。特にSafariブラウザでは、ディスク容量が不足している場合、IndexedDBのデータが自動的に削除される可能性があるため注意が必要だ。最適な使い分けとしては、ユーザー設定や簡単な状態など、ごく少量のシンプルなキーバリューデータを保存する場合にはLocalStorageが適している。一方、オフライン機能や大規模なデータ処理、画像やファイルの保存、複雑なクエリが必要な場合にはIndexedDBを選択すべきである。ストレージ容量を節約するために、データを保存する前にJSON形式で文字列化し、さらにGzipなどで圧縮する工夫も有効だ。また、容量オーバーなどのエラーが発生した場合に備え、適切なエラーハンドリングを実装することも重要である。利用可能なストレージ容量を確認するには、navigator.storage.estimate()というAPIを使用すると、現在の使用量と利用可能な総容量をプログラムから確認できる。

結論として、どのストレージを選択するかは、アプリケーションの具体的な要件に依存する。ウェブサイトのテーマ設定やユーザーの簡単な好みを保存するだけならLocalStorageが手軽で十分である。しかし、現代の多くのウェブアプリケーションでは、スケーラビリティ、パフォーマンス、セキュリティを考慮するとIndexedDBがより適切な選択となることが多い。特に、オフラインでのデータ利用、大規模なデータセットの管理、複雑なデータ検索機能を実装したい場合には、IndexedDBの利用が強く推奨される。シンプルな用途で手軽さを求めるならLocalStorage、大規模で高機能なデータ管理が必要ならIndexedDBというように、それぞれの特徴を理解して使い分けることが、効率的で堅牢なウェブアプリケーション開発の鍵となる。

関連コンテンツ

関連IT用語