Aula 19 - Gerenciamento de Estado Global e Persistência 💾
Objetivo Pedagógico
Objetivo: Construção de lojas de estado reativas compartilhadas utilizando módulos .svelte.ts, integração com Web Storage e sincronização multi-abas.
📑 1. Fundamentos Teóricos & Análise Técnica
No Svelte 5, o gerenciamento de estado global transcendeu a necessidade de APIs especiais como writable() ou bibliotecas externas como Redux. Como as Runes operam universalmente em qualquer arquivo com a extensão .svelte.ts, um estado global nada mais é do que uma classe ou objeto regular exportado contendo campos $state().
Essa simplicidade elimina qualquer atrito arquitetural: 1. Qualquer componente que importar a instância da classe terá acesso imediato aos mesmos dados reativos. 2. O compilador garante que alterações nos campos da classe disparam re-renderizações cirúrgicas apenas nos componentes que consomem tais propriedades. 3. A persistência em localStorage ou sessionStorage pode ser facilmente encapsulada com sincronização reativa através do evento window.addEventListener('storage'), permitindo que diferentes abas do navegador reflitam mudanças de estado em tempo real.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
StoreFile["appState.svelte.ts (Instância Global com Runes)"] --> CompHeader["Header.svelte (Consome Usuário)"]
StoreFile --> CompCart["CartView.svelte (Consome Itens)"]
StoreFile --> Storage["Local Storage do Navegador"]
Storage -.->|Evento storage| OtherTab["Outra Aba do Navegador Sincronizada!"]
CompCart -->|Mutação Direta| StoreFile
style StoreFile fill:#e3f2fd,stroke:#1565c0
style Storage fill:#fff3e0,stroke:#e65100
style CompCart fill:#e8f5e9,stroke:#2e7d32 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Ausência de Boilerplate: Classes TypeScript normais com $state tornam-se lojas de estado completas. - Sincronização entre Janelas: Uso do evento nativo storage para sincronizar sessões abertas simultaneamente. - Acesso Fora de Componentes: Funções de serviço e utilitários podem ler e alterar a store diretamente. - Performance Incomparável: Sem vDOM e sem seletores manuais; o rastreamento é feito pelo compilador.
🛠️ 2. Implementação Prática em Svelte Universal Stores
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// authStore.svelte.ts (Loja de Estado Global com Persistência em Svelte 5)
// Estado global puro compartilhado via .svelte.ts
class AuthManager {
user = $state<string | null>(localStorage.getItem('auth_user'));
isAuthenticated = $derived(this.user !== null);
login(username: string) {
this.user = username;
localStorage.setItem('auth_user', username);
}
logout() {
this.user = null;
localStorage.removeItem('auth_user');
}
}
// Exporta uma única instância singleton
export const auth = new AuthManager();
💡 Análise Passo a Passo do Código
- Instância Compartilhada: Ao exportar
auth = new AuthManager(), todos os arquivos compartilham a mesma referência em memória. - Rune $derived Integrada:
isAuthenticatedcomputa a condição booleana instantaneamente e notifica a interface. - Persistência Transparente: O
localStorageé atualizado conjuntamente com o estado sem requerer plugins ou bibliotecas externas.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto