Back

Comparaison entre IndexedDB, LocalStorage et SessionStorage

Comparaison entre IndexedDB, LocalStorage et SessionStorage

Lors de la création d’applications web modernes, le choix de la bonne API de stockage côté client peut avoir un impact significatif sur les performances de votre application et l’expérience utilisateur. Bien que LocalStorage et SessionStorage fonctionnent bien pour des données simples, IndexedDB offre des capacités qui le rendent essentiel pour les applications web hors ligne et la gestion de données complexes. Examinons comment ces options de stockage de navigateur JavaScript se comparent et quand utiliser chacune.

Points clés à retenir

  • LocalStorage et SessionStorage sont des API synchrones limitées à 5-10 Mo de données sous forme de chaînes de caractères
  • IndexedDB fournit des opérations asynchrones et non bloquantes avec un stockage pratiquement illimité
  • IndexedDB prend en charge les types de données complexes, les transactions et l’indexation pour des requêtes efficaces
  • Choisissez le stockage en fonction de la complexité des données : utilisez LocalStorage pour les chaînes simples, IndexedDB pour les objets complexes

Comprendre les trois API de stockage côté client

LocalStorage : Simple et persistant

LocalStorage stocke des paires clé-valeur sous forme de chaînes de caractères qui persistent indéfiniment jusqu’à ce qu’elles soient explicitement effacées. Avec une capacité typique de 5-10 Mo par origine, il est idéal pour les préférences utilisateur, les paramètres de thème ou les petites données de configuration.

localStorage.setItem('userTheme', 'dark');
const theme = localStorage.getItem('userTheme'); // Returns 'dark'

La nature synchrone de LocalStorage signifie que chaque opération bloque le thread principal. La lecture ou l’écriture d’à peine 1 Mo de données peut figer votre interface utilisateur pendant 100-200 millisecondes sur des appareils moyens.

SessionStorage : Stockage temporaire par onglet

SessionStorage fonctionne de manière identique à LocalStorage mais avec une différence cruciale : les données expirent lorsque l’onglet se ferme. Il maintient la même limite de 5-10 Mo et une API synchrone, ce qui le rend adapté aux données de formulaire temporaires ou à la gestion d’état pour une session unique.

sessionStorage.setItem('formDraft', JSON.stringify(formData));

Les données restent isolées par onglet — l’ouverture de la même page dans un nouvel onglet crée une instance SessionStorage distincte.

IndexedDB vs LocalStorage et SessionStorage : Différences clés

Capacité de stockage et types de données

Alors que LocalStorage et SessionStorage vous limitent aux chaînes de caractères et à 5-10 Mo d’espace, IndexedDB gère un stockage pratiquement illimité (souvent 50% de l’espace disque disponible) et stocke directement les objets JavaScript :

// IndexedDB stores complex objects without serialization
const userData = {
  id: 1,
  profile: { name: 'Alice', avatar: blobData },
  settings: { theme: 'dark', notifications: true },
  lastSync: new Date()
};
// Note: Map objects cannot be directly stored in IndexedDB

Caractéristiques de performance

La différence la plus critique réside dans les performances. LocalStorage et SessionStorage utilisent des opérations synchrones qui bloquent l’exécution JavaScript :

  • LocalStorage/SessionStorage : Synchrone, bloque le thread principal
  • IndexedDB : Asynchrone, opérations non bloquantes

Pour des ensembles de données plus volumineux, LocalStorage peut bloquer visiblement l’interface utilisateur en raison de sa nature synchrone, tandis que les opérations IndexedDB s’exécutent de manière asynchrone et maintiennent l’interface utilisateur réactive.

Intégrité des données et transactions

IndexedDB fournit des opérations transactionnelles garantissant la cohérence des données. Si une partie d’une transaction échoue, toutes les modifications sont automatiquement annulées — crucial pour les applications web hors ligne maintenant l’intégrité des données.

Quand IndexedDB surpasse LocalStorage

Applications « offline-first »

Considérez une application de prise de notes qui fonctionne hors ligne. Avec IndexedDB, vous pouvez stocker des milliers de documents avec pièces jointes, les rechercher efficacement en utilisant des index et synchroniser les modifications une fois reconnecté — impossible avec les limitations de LocalStorage.

Gestion de grands ensembles de données

Les sites e-commerce peuvent mettre en cache des catalogues de produits entiers dans IndexedDB. Des applications comme Linear utilisent cette approche pour stocker localement les données de projet, vérifiant la validité du cache avant d’effectuer des requêtes serveur, réduisant considérablement les temps de chargement.

Structures de données complexes

IndexedDB gère nativement les Blobs, Files et tableaux typés. Une application d’édition photo peut stocker directement des images sans encodage base64 (qui augmente la taille de 33% dans LocalStorage).

Comparaison d’implémentation pratique

Voici un exemple concret de stockage de données utilisateur :

// LocalStorage - requires serialization, blocks UI
const saveToLocalStorage = (data) => {
  localStorage.setItem('userData', JSON.stringify(data)); // Blocks thread
};

// IndexedDB - handles objects, non-blocking (using idb library)
const saveToIndexedDB = async (data) => {
  const db = await openDB('MyApp', 1, {
    upgrade(db) {
      db.createObjectStore('users', { keyPath: 'id' });
    }
  });
  const tx = db.transaction('users', 'readwrite');
  await tx.objectStore('users').put(data); // Non-blocking
};

Compatibilité des navigateurs et limitations

Les trois API bénéficient d’un support universel des navigateurs en 2025. Cependant, le comportement varie en navigation privée :

  • Safari : Applique des quotas plus bas en mode privé par rapport à la navigation normale
  • Firefox : Efface tout le stockage lorsque la session privée se termine
  • Chrome : Maintient des quotas standard en mode incognito

Les politiques d’éviction du stockage diffèrent également. Les navigateurs peuvent effacer le stockage lorsque l’espace disque devient insuffisant, les données IndexedDB marquées comme « persistantes » recevant une protection contre la suppression automatique.

Faire le bon choix

Choisissez LocalStorage pour :

  • Les préférences utilisateur de moins de 1 Mo
  • Les données sous forme de chaînes simples
  • Les prototypes rapides

Choisissez SessionStorage pour :

  • Les brouillons de formulaires
  • L’état temporaire de l’interface utilisateur
  • Les flux de travail sur un seul onglet

Choisissez IndexedDB pour :

  • Les fonctionnalités hors ligne
  • Les données de plus de 5 Mo
  • Les objets et fichiers complexes
  • Les besoins de recherche et de filtrage
  • Les besoins d’intégrité transactionnelle

Conclusion

Bien que LocalStorage et SessionStorage restent précieux pour des besoins de stockage simples, IndexedDB est essentiel pour construire des applications web performantes et capables de fonctionner hors ligne. Sa nature asynchrone, sa capacité illimitée et son support des transactions en font le seul choix viable pour stocker de grands ensembles de données ou des structures de données complexes. Pour les besoins de stockage de navigateur JavaScript modernes au-delà des simples paires clé-valeur, IndexedDB est le choix recommandé pour un stockage côté client complexe ou à grande échelle.

FAQ

Non, IndexedDB ne peut pas stocker directement les objets Map et Set. Vous devez les convertir en objets ou tableaux réguliers avant de les stocker. Utilisez Array.from() pour les Sets et Object.fromEntries() pour les Maps, puis reconstruisez-les lors de la récupération des données.

L'effacement du cache du navigateur n'affecte généralement pas les données IndexedDB. Les utilisateurs doivent spécifiquement effacer les données du site ou les cookies pour supprimer le contenu IndexedDB. Cependant, les navigateurs peuvent évincer les données IndexedDB en cas de pression sur le stockage, sauf si elles sont marquées comme persistantes à l'aide de l'API Storage.

Pour de minuscules données de moins de 100 Ko, LocalStorage peut être plus rapide pour des lectures simples en raison de sa nature synchrone. Cependant, les opérations non bloquantes d'IndexedDB empêchent le gel de l'interface utilisateur, ce qui le rend meilleur pour l'expérience utilisateur même avec de petits ensembles de données dans les applications en production.

Understand every bug

Uncover frustrations, understand bugs and fix slowdowns like never before with OpenReplay — the open-source session replay tool for developers. Self-host it in minutes, and have complete control over your customer data. Check our GitHub repo and join the thousands of developers in our community.

OpenReplay