Back

Como o IndexedDB se Compara ao LocalStorage e SessionStorage

Como o IndexedDB se Compara ao LocalStorage e SessionStorage

Ao construir aplicações web modernas, escolher a API de armazenamento client-side correta pode impactar significativamente o desempenho da sua aplicação e a experiência do usuário. Enquanto LocalStorage e SessionStorage funcionam bem para dados simples, o IndexedDB oferece capacidades que o tornam essencial para aplicações web offline e gerenciamento de dados complexos. Vamos examinar como essas opções de armazenamento em navegador JavaScript se comparam e quando usar cada uma.

Pontos-Chave

  • LocalStorage e SessionStorage são APIs síncronas limitadas a 5-10MB de dados em string
  • IndexedDB fornece operações assíncronas e não-bloqueantes com armazenamento virtualmente ilimitado
  • IndexedDB suporta tipos de dados complexos, transações e indexação para consultas eficientes
  • Escolha o armazenamento baseado na complexidade dos dados: strings simples usam LocalStorage, objetos complexos precisam de IndexedDB

Entendendo as Três APIs de Armazenamento Client-Side

LocalStorage: Simples e Persistente

O LocalStorage armazena pares chave-valor como strings que persistem indefinidamente até serem explicitamente removidas. Com uma capacidade típica de 5-10MB por origem, é ideal para preferências do usuário, configurações de tema ou pequenos dados de configuração.

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

A natureza síncrona do LocalStorage significa que cada operação bloqueia a thread principal. Ler ou escrever apenas 1MB de dados pode congelar sua UI por 100-200 milissegundos em dispositivos médios.

SessionStorage: Armazenamento Temporário por Aba

O SessionStorage funciona de forma idêntica ao LocalStorage, mas com uma diferença crucial: os dados expiram quando a aba é fechada. Mantém o mesmo limite de 5-10MB e API síncrona, tornando-o adequado para dados temporários de formulários ou gerenciamento de estado de sessão única.

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

Os dados permanecem isolados por aba—abrir a mesma página em uma nova aba cria uma instância separada de SessionStorage.

IndexedDB vs LocalStorage e SessionStorage: Diferenças Principais

Capacidade de Armazenamento e Tipos de Dados

Enquanto LocalStorage e SessionStorage restringem você a strings e 5-10MB de espaço, o IndexedDB lida com armazenamento virtualmente ilimitado (frequentemente 50% do espaço disponível em disco) e armazena objetos JavaScript diretamente:

// IndexedDB armazena objetos complexos sem serialização
const userData = {
  id: 1,
  profile: { name: 'Alice', avatar: blobData },
  settings: { theme: 'dark', notifications: true },
  lastSync: new Date()
};
// Nota: Objetos Map não podem ser armazenados diretamente no IndexedDB

Características de Desempenho

A diferença mais crítica está no desempenho. LocalStorage e SessionStorage usam operações síncronas que bloqueiam a execução do JavaScript:

  • LocalStorage/SessionStorage: Síncrono, bloqueia a thread principal
  • IndexedDB: Assíncrono, operações não-bloqueantes

Para conjuntos de dados maiores, o LocalStorage pode bloquear visivelmente a UI devido à sua natureza síncrona, enquanto as operações do IndexedDB executam de forma assíncrona e mantêm a UI responsiva.

Integridade de Dados e Transações

O IndexedDB fornece operações transacionais garantindo consistência de dados. Se qualquer parte de uma transação falhar, todas as alterações são revertidas automaticamente—crucial para aplicações web offline que mantêm integridade de dados.

Quando o IndexedDB Supera o LocalStorage

Aplicações Offline-First

Considere uma aplicação de anotações que funciona offline. Com IndexedDB, você pode armazenar milhares de documentos com anexos, pesquisá-los eficientemente usando índices e sincronizar alterações quando reconectado—impossível com as limitações do LocalStorage.

Gerenciamento de Grandes Conjuntos de Dados

Sites de e-commerce podem armazenar em cache catálogos inteiros de produtos no IndexedDB. Aplicações como Linear usam essa abordagem para armazenar dados de projetos localmente, verificando a validade do cache antes de fazer requisições ao servidor, reduzindo significativamente os tempos de carregamento.

Estruturas de Dados Complexas

O IndexedDB lida com Blobs, Files e typed arrays nativamente. Uma aplicação de edição de fotos pode armazenar imagens diretamente sem codificação base64 (que aumenta o tamanho em 33% no LocalStorage).

Comparação de Implementação Prática

Aqui está um exemplo do mundo real armazenando dados de usuário:

// LocalStorage - requer serialização, bloqueia UI
const saveToLocalStorage = (data) => {
  localStorage.setItem('userData', JSON.stringify(data)); // Bloqueia thread
};

// IndexedDB - lida com objetos, não-bloqueante (usando biblioteca idb)
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); // Não-bloqueante
};

Compatibilidade de Navegadores e Limitações

Todas as três APIs desfrutam de suporte universal em navegadores a partir de 2025. No entanto, o comportamento varia na navegação privada:

  • Safari: Impõe cotas menores no modo privado comparado à navegação normal
  • Firefox: Limpa todo o armazenamento quando a sessão privada termina
  • Chrome: Mantém cotas padrão no modo anônimo

As políticas de remoção de armazenamento também diferem. Navegadores podem limpar o armazenamento quando o espaço em disco está baixo, com dados do IndexedDB marcados como “persistentes” recebendo proteção contra exclusão automática.

Fazendo a Escolha Certa

Escolha LocalStorage para:

  • Preferências de usuário abaixo de 1MB
  • Dados simples em string
  • Protótipos rápidos

Escolha SessionStorage para:

  • Rascunhos de formulários
  • Estado temporário da UI
  • Fluxos de trabalho de aba única

Escolha IndexedDB para:

  • Funcionalidade offline
  • Dados acima de 5MB
  • Objetos e arquivos complexos
  • Requisitos de busca e filtragem
  • Necessidades de integridade transacional

Conclusão

Embora LocalStorage e SessionStorage permaneçam valiosos para necessidades simples de armazenamento, o IndexedDB é essencial para construir aplicações web performáticas e capazes de funcionar offline. Sua natureza assíncrona, capacidade ilimitada e suporte a transações o tornam a única escolha viável para armazenar grandes conjuntos de dados ou estruturas de dados complexas. Para necessidades modernas de armazenamento em navegador JavaScript além de pares chave-valor básicos, o IndexedDB é a escolha recomendada para armazenamento client-side complexo ou em larga escala.

Perguntas Frequentes

Não, o IndexedDB não pode armazenar objetos Map e Set diretamente. Você precisa convertê-los para objetos regulares ou arrays antes de armazenar. Use Array.from() para Sets e Object.fromEntries() para Maps, depois reconstrua-os ao recuperar os dados.

Limpar o cache do navegador tipicamente não afeta os dados do IndexedDB. Os usuários devem especificamente limpar dados do site ou cookies para remover o conteúdo do IndexedDB. No entanto, navegadores podem remover dados do IndexedDB sob pressão de armazenamento, a menos que sejam marcados como persistentes usando a Storage API.

Para dados pequenos abaixo de 100KB, o LocalStorage pode ser mais rápido para leituras simples devido à sua natureza síncrona. No entanto, as operações não-bloqueantes do IndexedDB previnem congelamentos da UI, tornando-o melhor para a experiência do usuário mesmo com pequenos conjuntos de dados em aplicações de produção.

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