OPFS(Origin Private File System)
一言まとめ
ブラウザがオリジンごとに提供するプライベートなファイルシステム。権限ダイアログなしで GB 単位のバイナリを置け、Worker 限定の同期ハンドルが IndexedDB より大幅に速い。SQLite Wasm や DuckDB-Wasm の保存先に使われる。
調査時点: 2026-04。
何か
OPFS は File System Access API の一部として標準化された、オリジン(ドメイン)専用のファイルシステム。ユーザーの実ファイルシステムとは別の隔離領域で、OS のファイラーからは見えない。
| 特徴 | 中身 |
|---|---|
| オリジン専用 | そのオリジンだけがアクセスできる |
| 権限不要 | showOpenFilePicker() と違い、ダイアログなしで使える |
| 高速 | FileSystemSyncAccessHandle(Worker 限定の同期 API)は IndexedDB より桁違いに速い |
| 大容量 | ブラウザのストレージクォータの範囲で GB 単位を保存できる |
localStorage / IndexedDB との違い
| localStorage | IndexedDB | OPFS | |
|---|---|---|---|
| データモデル | KVS(文字列) | オブジェクトストア | ファイル |
| 容量 | 小(5〜10MB) | 中〜大 | 大 |
| 速度 | 中 | 遅〜中 | 速(Sync Handle は特に) |
| Worker 対応 | × | ○ | ○(Sync Handle は Worker 必須) |
| 用途 | 軽量な設定 | 構造化データ | バイナリ・DB ファイル |
典型ユースケース
- SQLite を Wasm でブラウザ実行し、DB ファイルを OPFS に置く(sql.js、wa-sqlite、SQLite 公式の wasm ビルド)。
- DuckDB-Wasm で分析用 DB をブラウザで動かす。
- 動画・画像編集ツールのスクラッチ領域。
- PWA のオフラインキャッシュで大きなバイナリを扱う。
createSyncAccessHandle() と FileSystemSyncAccessHandle
FileSystemFileHandle.createSyncAccessHandle() がメソッドで、FileSystemSyncAccessHandle はその戻り値の型。Worker スレッドでのみ使える。
const root = await navigator.storage.getDirectory();const fileHandle = await root.getFileHandle("data.db", { create: true });const syncHandle = await fileHandle.createSyncAccessHandle(); // FileSystemSyncAccessHandlesyncHandle.read(buffer, { at: 0 });syncHandle.write(buffer, { at: 0 });syncHandle.close();対応状況
Chrome・Edge・Firefox・Safari で対応済み(バージョン差あり)。ストレージクォータの実際の上限はブラウザ・OS ごとに異なる。
関連
更新履歴
- 2026-04-18: 初版(ローカル調査ノート)
- 2026-10-17: Wiki へ移植、概念ページとして再構成
同じトピック — Web
- 単一画面の Canvas ツールのスタック選定(vanilla TS / Svelte / Preact と PWA ツーリング)
- DAM カラオケ検索(clubdam)の挙動と制約
- Core Web Vitals と画像最適化
- favicon の最小構成(SVG + ICO + apple-touch-icon + manifest)
- フロントエンドのフレームワークとツールの動き(2025)
- HTML-in-Canvas API
- HTML-in-Canvas の実現性(a11y・性能・セットアップ・シェーダー)
- iOS Safari で canvas の画像を保存させる(download 属性 / Web Share / 長押し)
- 日本語 Web フォントのライセンスとサブセット化
- 個人サイトのライブウィジェットと外部 API の制限
- モダン CSS / Web API の対応状況(2025-2026)
- Google Places API のキーの守り方(ブラウザ露出 vs サーバ中継)
- iOS の PWA 制限
- 機能別 React / TS ライブラリ対応表(2026-04 時点)
- URL 長の上限と日本語の URL エンコード膨張
- 書き出すテキストファイルの UTF-8 BOM と Markdown 継続行
- 縦書き Web の実装(writing-mode・ルビ・圏点・縦中横・禁則)
- PWA の Web Share Target(Android)の実測と落とし穴
- WebAssembly(Wasm)
- YouTube oEmbed で動画タイトルとチャンネル名を取る