IndexedDB 実践:ブラウザでの大容量ファイル保存とオフラインアーキテクチャ

技术架构(更新: 2026年5月22日)

なぜ IndexedDB が必要か?

ブラウザのストレージ方式にはそれぞれ限界があります:

方式 容量 データ型 同期 API 用途
Cookie ~4KB 文字列 セッション識別
localStorage ~5MB 文字列 簡単な設定
sessionStorage ~5MB 文字列 一時的な状態
IndexedDB 数百 MB~GB 任意の構造化データ ❌ 非同期 大容量ファイル、オフラインアプリ

PDF 処理の中間結果、WASM モジュール、ユーザーのアップロード履歴をブラウザにキャッシュする必要があるツールサイトにとって、IndexedDB は唯一の現実的な選択肢です。


基本概念

データベース → オブジェクトストア → レコード

Database: "toolsku-cache"
  ├── ObjectStore: "wasm-modules"     (key: moduleName)
  ├── ObjectStore: "file-cache"       (key: fileHash, index: timestamp)
  └── ObjectStore: "user-preferences" (key: settingKey)

トランザクションと並行処理

IndexedDB のトランザクションは自動コミットされ、同一 ObjectStore には同時に 1 つの読み書きトランザクションしか実行できません:

const tx = db.transaction(['file-cache'], 'readwrite');
const store = tx.objectStore('file-cache');
await store.put({ hash: 'abc123', data: arrayBuffer, timestamp: Date.now() });
await tx.done; // トランザクション完了を待つ

ToolsKu における IndexedDB の活用

WASM モジュールのキャッシュ

ffmpeg.wasm は約 30MB で、毎回の読み込みに 3~5 秒かかります。IndexedDB にキャッシュすれば、2 回目以降はほぼ待ち時間ゼロになります:

async function getWasmModule(name: string): Promise<ArrayBuffer> {
  const cached = await idb.get('wasm-modules', name);
  if (cached) return cached;

  const response = await fetch(`/wasm/${name}.wasm`);
  const buffer = await response.arrayBuffer();
  await idb.put('wasm-modules', buffer, name);
  return buffer;
}

大容量ファイルのチャンク保存

50MB を超えるファイルは IndexedDB に一度に保存するのに適していません。チャンク戦略:

ファイル (200MB) → 4MB チャンクに分割 → IndexedDB に個別保存
key: "file:{hash}:chunk:{index}"
読み取り時に順番に結合 → 完全なファイルを復元

バージョン移行

データベースのスキーマ変更時は onupgradeneeded で移行を処理します:

const request = indexedDB.open('toolsku-cache', 2); // バージョン 2

request.onupgradeneeded = (event) => {
  const db = event.target.result;
  if (event.oldVersion < 2) {
    db.createObjectStore('processing-history', { keyPath: 'id' });
  }
};

ベストプラクティス:ObjectStore は追加のみ、削除しない。バージョン番号を増やして移行をトリガーし、ユーザーデータの削除を避けます。


IndexedDB vs OPFS

特性 IndexedDB OPFS (Origin Private File System)
API の成熟度 広くサポート Chrome 86+ / Safari 15.2+
読み書きモデル キーバリューストア 本物のファイルシステム
パフォーマンス 中程度 より高い(特に同期アクセス)
用途 構造化キャッシュ 大容量ファイルの I/O

ToolsKu は主に IndexedDB を使用し、Chrome 上では OPFS をパフォーマンス最適化の代替として検討しています。


まとめ

IndexedDB はオフラインファーストのブラウザツールを構築するための重要な基盤です。ObjectStore の適切な設計、WASM キャッシュ、チャンク保存戦略により、ToolsKu は低速ネットワーク環境でもスムーズな体験を提供できます。

ブラウザローカルツールを無料で試す →

#IndexedDB#浏览器存储#离线#大文件#架构