lvncerpedia

いいユースケースだね〜。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にタグとか付けたい?

ここ決まれば、テーブル設計まで一緒にやろ。私そういうの考えるの好きなんだよね。