IndexedDB in der Praxis: Große-Datei-Speicherung und Offline-Architektur im Browser

技术架构

Warum IndexedDB?

Die Browser-Speicheroptionen haben jeweils klare Grenzen:

Option Kapazität Datentypen Sync-API Anwendungsfall
Cookie ~4KB String Sitzungskennungen
localStorage ~5MB String Einfache Einstellungen
sessionStorage ~5MB String Temporärer Zustand
IndexedDB Hunderte MB–GB Beliebige strukturierte Daten ❌ Async Große Dateien, Offline-Apps

Für Tool-Seiten, die PDF-Verarbeitungszwischenergebnisse, WASM-Module oder den Upload-Verlauf der Benutzer im Browser zwischenspeichern müssen, ist IndexedDB die einzig tragfähige Wahl.


Kernkonzepte

Datenbank → Object Store → Datensatz

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

Transaktionen und Nebenläufigkeit

IndexedDB-Transaktionen werden auto-committed, und pro Object Store ist jeweils nur eine Lese-/Schreibtransaktion gleichzeitig erlaubt:

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; // Wait for transaction to complete

IndexedDB in ToolsKu

WASM-Modul-Caching

ffmpeg.wasm ist etwa 30 MB groß und benötigt beim Laden jedes Mal 3–5 Sekunden. Nach dem Caching in IndexedDB sind nachfolgende Besuche nahezu augenblicklich:

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;
}

Gechunkte Speicherung für große Dateien

Dateien über 50 MB auf einmal in IndexedDB zu speichern, ist nicht ideal. Eine Chunking-Strategie:

File (200MB) → split into 4MB chunks → store each in IndexedDB
key: "file:{hash}:chunk:{index}"
Read in order and concatenate → restore full file

Versionsmigration

Wenn sich das Datenbankschema ändert, erfolgt die Migration in onupgradeneeded:

const request = indexedDB.open('toolsku-cache', 2); // version 2

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

Beste Praxis: Fügen Sie nur ObjectStores hinzu — entfernen Sie sie niemals. Erhöhen Sie die Versionsnummer, um die Migration auszulösen, und vermeiden Sie das Löschen von Benutzerdaten.


IndexedDB vs. OPFS

Merkmal IndexedDB OPFS (Origin Private File System)
API-Reife Breite Unterstützung Chrome 86+ / Safari 15.2+
Lese-/Schreibmodell Key-Value-Speicher Echtes Dateisystem
Leistung Mäßig Höher (besonders synchroner Zugriff)
Am besten für Strukturiertes Cache Große Datei-E/A

ToolsKu verwendet in erster Linie IndexedDB, mit OPFS als Leistungsoptimierung unter Chrome.


Zusammenfassung

IndexedDB ist wesentliche Infrastruktur für offline-fähige Browser-Tools. Gut gestaltete ObjectStores, WASM-Caching und gechunkte Speicherstrategien ermöglichen es ToolsKu, auch in langsamen Netzwerken reaktionsfähig zu bleiben.

Probiere diese browser-lokalen Tools aus — keine Registrierung erforderlich →

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