almessadi.
Retour à l'index

Utiliser `localStorage` pour les Préférences, IndexedDB pour les Données_

Le choix du stockage dans le navigateur dépend de la charge de travail. `localStorage` est approprié pour un état synchrone minuscule ; IndexedDB est mieux adapté pour les données hors ligne et les caches plus volumineux.

Publié12 mai 2024
Temps de lecture8 min read

`localStorage` n'est pas maléfique. Il est simplement facile à mal utiliser.

Il fonctionne bien pour :

- une préférence de thème
- un petit cache de drapeau de fonctionnalité
- des indications de session légères

Il est mal adapté pour :

- de grands ensembles de données hors ligne
- des systèmes de brouillon avec beaucoup de contenu
- des files d'attente d'opérations synchronisées
- des charges utiles image ou binaire

## La Principale Limitation

L'API est synchrone.

Cela signifie que les lectures et les écritures se produisent sur le thread principal, ce qui est exactement l'endroit où vous ne voulez pas que de gros travaux de stockage se déroulent dans une application moderne.

Pour les petites clés, cela est généralement acceptable. Pour des caches de taille application, cela devient un signe de conception problématique.

## Quand IndexedDB Est le Meilleur Choix

IndexedDB est beaucoup mieux adapté lorsque vous avez besoin de :

- enregistrements structurés
- accès asynchrone
- transactions
- persistance plus importante côté client

C'est pourquoi les applications web sérieuses capables de fonctionner hors ligne finissent souvent par l'utiliser.

L'inconvénient est l'ergonomie. L'API native n'est pas agréable à utiliser directement.

## Pourquoi les Bibliothèques Aident

Des wrappers comme Dexie rendent IndexedDB beaucoup plus facile à considérer comme une partie de l'architecture de l'application plutôt que comme une originalité du navigateur de bas niveau.

```ts
import Dexie, { type EntityTable } from "dexie";

interface Draft {
  id: number;
  title: string;
  body: string;
}

const db = new Dexie("writer") as Dexie & {
  drafts: EntityTable<Draft, "id">;
};

db.version(1).stores({
  drafts: "++id, title",
});

Cela suffit souvent à rendre la persistance côté navigateur maintenable.

Une Meilleure Règle Générale

Utilisez :

  • localStorage pour un état léger semblable à une préférence
  • IndexedDB pour des données réelles d'application

Cette ligne vous fera éviter beaucoup de douleurs d'architecture frontend.

Lectures Complémentaires