いいユースケースだね〜。URLまとめ+背景画像保存なら、localStorageは早めに見切りつけて正解だよ👍 じゃあ超ざっくり→ちょい実務目線でいくね。
まず一言でいうと
localStorage は 👉「小さいメモ帳」
IndexedDB は 👉「ちゃんとしたデータベース」
って思ってくれればOK。
localStorage って何者?
特徴
- キー=文字列 / 値=文字列
- 同期API(処理が止まる)
- 容量めちゃ小さい(だいたい5MB前後)
- 画像?無理。やるならbase64地獄
向いてるもの
- フラグ(
isFirstLaunch) - テーマ(
dark / light) - トグルON/OFF
向いてないもの
- URLリスト(数増えると辛い)
- 画像・バイナリ
- 構造化データ
IndexedDB って何者?
特徴
- 非同期
- オブジェクトをそのまま保存できる
- Blob / File / ArrayBuffer OK
- 容量かなり大きい(数百MB〜GB)
つまり 👉 画像保存できる 👉 URLオブジェクト配列そのまま突っ込める
具体的にどう違うか(超重要)
localStorage
localStorage.setItem(
"urls",
JSON.stringify([
{ title: "google", url: "https://google.com" }
])
);
- 毎回
JSON.stringify / parse - 全件読み込み
- 更新が雑&重い
IndexedDB
db.urls.add({
id: "google",
title: "Google",
url: "https://google.com",
createdAt: Date.now(),
});
- 1件ずつCRUD
- 検索・更新が速い
- データ壊れにくい
画像保存の違いが決定打
localStorage(地獄)
const base64 = canvas.toDataURL();
localStorage.setItem("bg", base64);
- サイズ爆増
- すぐ上限
- パフォーマンス死亡
IndexedDB(正解)
await db.backgrounds.put({
id: "main",
blob: file, // File or Blob
});
const bg = await db.backgrounds.get("main");
const url = URL.createObjectURL(bg.blob);
ElectronでもWebでも同じ。
「なんか難しそう…」問題
👉 素のIndexedDBは確かにキモい だから Dexie / idb を使う。
Dexieのいいとこ
- 宣言的
- async/await
- 型つけやすい
- 学習コスト低
正直 「IndexedDB使ってる」=「Dexie使ってる」 くらいの感覚でOK。
URL+画像保存ならこう考える
| データ | 保存先 |
|---|---|
| URLリスト | IndexedDB |
| 背景画像 | IndexedDB(Blob) |
| UI状態 | useState |
| 設定 | IndexedDB(settings table) |
迷ったらこれ覚えといて
- 「文字列ちょっと」 → localStorage
- 「構造化データ」 → IndexedDB
- 「画像・ファイル」 → IndexedDB
- 「Web & Electron両対応」 → IndexedDB一択
正直、URLまとめアプリ+背景画像って 「IndexedDBを使うために生まれてきた」レベルの構成だから安心して突っ込んでいいよ😌
もしよかったら
- 画像は1枚だけ?
- 複数背景を切り替える?
- URLにタグとか付けたい?
ここ決まれば、テーブル設計まで一緒にやろ。私そういうの考えるの好きなんだよね。