JavaScript

Como Usar Web Storage em JavaScript: localStorage, sessionStorage e IndexedDB em Produção

8 min de leitura

Como Usar Web Storage em JavaScript: localStorage, sessionStorage e IndexedDB em Produção

Web Storage em JavaScript: localStorage, sessionStorage e IndexedDB A persistência de dados no navegador é fundamental para criar aplicações web modernas. Web Storage oferece três mecanismos distintos, cada um com propósitos específicos. Dominar essas tecnologias permite que você construa experiências offline, melhore performance e gerencie estado de forma eficiente. localStorage: Armazenamento Persistente O localStorage mantém dados indefinidamente no navegador do usuário, mesmo após fechar a aba ou reiniciar o computador. Funciona como um dicionário chave-valor simples, perfeito para preferências do usuário, temas, tokens de autenticação e configurações. Operações Básicas Trabalhando com Objetos Como localStorage só armazena strings, você precisa serializar objetos com JSON: Limite e Considerações localStorage oferece tipicamente 5-10MB de espaço. Use para dados que precisam persistir entre sessões, mas evite armazenar senhas ou informações sensíveis sem criptografia. sessionStorage: Armazenamento Temporário O sessionStorage funciona identicamente ao localStorage, mas os dados são descartados quando a aba do navegador fecha. Ideal para dados temporários da sessão atual, como filtros de busca,

<h2>Web Storage em JavaScript: localStorage, sessionStorage e IndexedDB</h2>

<p>A persistência de dados no navegador é fundamental para criar aplicações web modernas. Web Storage oferece três mecanismos distintos, cada um com propósitos específicos. Dominar essas tecnologias permite que você construa experiências offline, melhore performance e gerencie estado de forma eficiente.</p>

<h2>localStorage: Armazenamento Persistente</h2>

<p>O localStorage mantém dados indefinidamente no navegador do usuário, mesmo após fechar a aba ou reiniciar o computador. Funciona como um dicionário chave-valor simples, perfeito para preferências do usuário, temas, tokens de autenticação e configurações.</p>

<h3>Operações Básicas</h3>

<pre><code class="language-javascript">// Salvar dados

localStorage.setItem(&#039;usuario&#039;, &#039;João Silva&#039;);

localStorage.setItem(&#039;tema&#039;, &#039;escuro&#039;);

// Recuperar dados

const usuario = localStorage.getItem(&#039;usuario&#039;);

console.log(usuario); // &#039;João Silva&#039;

// Remover item específico

localStorage.removeItem(&#039;tema&#039;);

// Limpar todo o localStorage

localStorage.clear();

// Verificar quantidade de itens

console.log(localStorage.length);</code></pre>

<h3>Trabalhando com Objetos</h3>

<p>Como localStorage só armazena strings, você precisa serializar objetos com JSON:</p>

<pre><code class="language-javascript">const usuario = {

id: 1,

nome: &#039;Maria&#039;,

email: &#039;maria@email.com&#039;,

preferencias: {

notificacoes: true,

idioma: &#039;pt-BR&#039;

}

};

// Salvar objeto

localStorage.setItem(&#039;userData&#039;, JSON.stringify(usuario));

// Recuperar e desserializar

const dadosRecuperados = JSON.parse(localStorage.getItem(&#039;userData&#039;));

console.log(dadosRecuperados.preferencias.idioma); // &#039;pt-BR&#039;

// Deletar se não existir erro

if (dadosRecuperados) {

console.log(&#039;Dados encontrados&#039;);

}</code></pre>

<h3>Limite e Considerações</h3>

<p>localStorage oferece tipicamente 5-10MB de espaço. Use para dados que precisam persistir entre sessões, mas evite armazenar senhas ou informações sensíveis sem criptografia.</p>

<h2>sessionStorage: Armazenamento Temporário</h2>

<p>O sessionStorage funciona identicamente ao localStorage, mas os dados são descartados quando a aba do navegador fecha. Ideal para dados temporários da sessão atual, como filtros de busca, estado de formulários em progresso ou tokens de sessão curta.</p>

<h3>Diferenças Práticas</h3>

<pre><code class="language-javascript">// Salvar dados de sessão

sessionStorage.setItem(&#039;filtroAtivo&#039;, &#039;ultimas24h&#039;);

sessionStorage.setItem(&#039;carrinhoTemp&#039;, JSON.stringify({

items: [&#039;produto1&#039;, &#039;produto2&#039;],

timestamp: Date.now()

}));

// Recuperar dados

const filtro = sessionStorage.getItem(&#039;filtroAtivo&#039;);

const carrinho = JSON.parse(sessionStorage.getItem(&#039;carrinhoTemp&#039;));

// Dados desaparecem ao fechar a aba

sessionStorage.clear();</code></pre>

<p>O sessionStorage é isolado por aba: diferentes abas do mesmo site têm seus próprios espaços de armazenamento. Aproveite isso para fluxos independentes.</p>

<h2>IndexedDB: Armazenamento Estruturado em Grande Escala</h2>

<p>IndexedDB é um banco de dados NoSQL do navegador, oferecendo capacidade muito maior (centenas de MB), suporte a índices, transações e consultas complexas. Use para aplicações offline robustas, sincronização de dados e armazenamento estruturado.</p>

<h3>Criação e Configuração Inicial</h3>

<pre><code class="language-javascript">let db;

// Abrir ou criar banco de dados

const request = indexedDB.open(&#039;minhaApp&#039;, 1);

request.onerror = () =&gt; console.error(&#039;Erro ao abrir banco&#039;);

request.onsuccess = (event) =&gt; {

db = event.target.result;

console.log(&#039;Banco aberto com sucesso&#039;);

};

// Evento acionado apenas na primeira vez ou ao atualizar versão

request.onupgradeneeded = (event) =&gt; {

db = event.target.result;

// Criar object store (tabela)

if (!db.objectStoreNames.contains(&#039;usuarios&#039;)) {

const objectStore = db.createObjectStore(&#039;usuarios&#039;, { keyPath: &#039;id&#039; });

objectStore.createIndex(&#039;email&#039;, &#039;email&#039;, { unique: true });

objectStore.createIndex(&#039;nome&#039;, &#039;nome&#039;, { unique: false });

}

};</code></pre>

<h3>Inserir, Ler e Atualizar Dados</h3>

<pre><code class="language-javascript">// Inserir/atualizar documento

function salvarUsuario(usuario) {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readwrite&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const request = objectStore.put(usuario);

request.onsuccess = () =&gt; console.log(&#039;Usuário salvo&#039;);

request.onerror = () =&gt; console.error(&#039;Erro ao salvar&#039;);

}

// Recuperar por chave primária

function buscarUsuario(id) {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readonly&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const request = objectStore.get(id);

request.onsuccess = (event) =&gt; {

console.log(&#039;Usuário:&#039;, event.target.result);

};

}

// Buscar por índice

function buscarPorEmail(email) {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readonly&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const index = objectStore.index(&#039;email&#039;);

const request = index.get(email);

request.onsuccess = (event) =&gt; {

console.log(&#039;Encontrado:&#039;, event.target.result);

};

}

// Deletar

function deletarUsuario(id) {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readwrite&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const request = objectStore.delete(id);

request.onsuccess = () =&gt; console.log(&#039;Deletado&#039;);

}

// Exemplo de uso

salvarUsuario({

id: 1,

nome: &#039;Ana Silva&#039;,

email: &#039;ana@email.com&#039;,

criado: new Date()

});</code></pre>

<h3>Consultas Avançadas</h3>

<pre><code class="language-javascript">// Listar todos os registros

function listarTodos() {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readonly&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const request = objectStore.getAll();

request.onsuccess = (event) =&gt; {

console.log(&#039;Todos os usuários:&#039;, event.target.result);

};

}

// Usar cursor para iteração eficiente

function iterarComCursor() {

const transaction = db.transaction([&#039;usuarios&#039;], &#039;readonly&#039;);

const objectStore = transaction.objectStore(&#039;usuarios&#039;);

const request = objectStore.openCursor();

request.onsuccess = (event) =&gt; {

const cursor = event.target.result;

if (cursor) {

console.log(&#039;ID:&#039;, cursor.key, &#039;Dados:&#039;, cursor.value);

cursor.continue();

}

};

}</code></pre>

<h2>Escolhendo a Tecnologia Correta</h2>

<div class="table-wrap"><table><thead><tr><th>Tecnologia</th><th>Limite</th><th>Persistência</th><th>Melhor Para</th></tr></thead><tbody><tr><td>localStorage</td><td>5-10MB</td><td>Indefinida</td><td>Preferências, tokens, configurações</td></tr><tr><td>sessionStorage</td><td>5-10MB</td><td>Fim da sessão</td><td>Estado temporário, filtros</td></tr><tr><td>IndexedDB</td><td>100s MB+</td><td>Indefinida</td><td>Apps offline, grandes datasets</td></tr></tbody></table></div>

<p>Use localStorage para preferências do usuário, sessionStorage para dados de sessão atual e IndexedDB quando precisar de capacidade, estrutura ou consultas complexas. Para aplicações offline-first, considere combinar IndexedDB com Service Workers para sincronização automática.</p>

<h2>Conclusão</h2>

<p>Dominando Web Storage, você pode: <strong>(1)</strong> Construir aplicações que funcionam offline e sincronizam quando conexão retorna; <strong>(2)</strong> Melhorar performance ao evitar requisições desnecessárias; <strong>(3)</strong> Criar experiências personalizadas e responsivas mantendo preferências do usuário. Escolha a ferramenta certa conforme a escala e persistência necessárias — localStorage para simples, sessionStorage para temporário, IndexedDB para complexo.</p>

<h2>Referências</h2>

<ul>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/API/Web_Storage_API" target="_blank" rel="noopener noreferrer">MDN Web Docs - Web Storage API</a></li>

<li><a href="https://developer.mozilla.org/pt-BR/docs/Web/API/IndexedDB_API" target="_blank" rel="noopener noreferrer">MDN Web Docs - IndexedDB API</a></li>

<li><a href="https://web.dev/storage-for-the-web/" target="_blank" rel="noopener noreferrer">Web.dev - Storage for the web</a></li>

<li><a href="https://javascript.info/localstorage" target="_blank" rel="noopener noreferrer">JavaScript.info - LocalStorage, sessionStorage</a></li>

<li><a href="https://developers.google.com/web/tools/chrome-devtools/storage/indexeddb" target="_blank" rel="noopener noreferrer">Google Developers - IndexedDB Best Practices</a></li>

</ul>

Comentários

Mais em JavaScript

Como Usar Classes em JavaScript: Sintaxe, Herança e Encapsulamento em Produção
Como Usar Classes em JavaScript: Sintaxe, Herança e Encapsulamento em Produção

Fundamentos de Classes em JavaScript Classes em JavaScript são açúcar sintáti...

Boas Práticas de Express.js: Roteamento, Middlewares e Estrutura de APIs REST para Times Ágeis
Boas Práticas de Express.js: Roteamento, Middlewares e Estrutura de APIs REST para Times Ágeis

Express.js: Fundamentos e Arquitetura Express.js é um framework web minimalis...

Boas Práticas de ESLint e Prettier em JavaScript: Qualidade e Formatação de Código para Times Ágeis
Boas Práticas de ESLint e Prettier em JavaScript: Qualidade e Formatação de Código para Times Ágeis

O que são ESLint e Prettier? ESLint é um analisador estático de código JavaSc...