Aula 20 - Projeto Capstone: Aplicação Web Vanilla SPA Autônoma 🏆
Objetivo Pedagógico
Objetivo: Construção de uma aplicação Single Page Application (SPA) completa em JavaScript Vanilla, com roteamento History API, reatividade e isolamento de estado.
📑 1. Fundamentos Teóricos & Análise Técnica
O Projeto Capstone de JavaScript e DOM é a oportunidade de consolidar todo o ecossistema da linguagem sem a muleta de frameworks externos. A criação de uma Single Page Application (SPA) em JavaScript puro (Vanilla JS) exige que o desenvolvedor domine os mecanismos subjacentes que bibliotecas como React, Vue ou Angular executam por debaixo dos panos.
O projeto exige a implementação dos seguintes subsistemas de engenharia: 1. Roteador Baseado em History API: Gerenciamento de rotas no cliente com history.pushState(), history.replaceState() e interceptação do evento popstate, permitindo navegação instantânea com URLs limpas. 2. Motor de Reatividade Baseado em Proxy: Observação de alterações de dados em tempo real através da API nativa Proxy, disparando atualizações seletivas na view sem redesenhar o documento inteiro. 3. Arquitetura Baseada em Componentes Web: Encapsulamento de estilos e estruturas com Shadow DOM e Custom Elements (Web Components nativos). 4. Camada de Comunicação com Backend: Módulo HTTP baseado em fetch com interceptores de erro, retry automático com backoff exponencial e suporte a cancelamento via AbortController.
📐 Arquitetura Conceitual & Diagrama de Fluxo
graph TD
User["Ação do Usuário (Navegação / Input)"] --> Router["Client-Side Router (History API)"]
Router --> Controller["Controlador do Módulo"]
Controller --> Store["Store Reativa (ES6 Proxy)"]
Store -->|Trigger Reativo| View["Renderizador Seletivo (DOM)"]
Controller --> Service["Serviço HTTP (Fetch + AbortController)"]
Service --> API["API Externa / Servidor REST"]
style User fill:#e1f5fe,stroke:#01579b
style Router fill:#fff3e0,stroke:#e65100
style Store fill:#e8f5e9,stroke:#2e7d32
style View fill:#f3e5f5,stroke:#7b1fa2 🔍 Pilares e Diretrizes Técnicas
Nesta unidade, aprofundamos os seguintes conceitos fundamentais: - Roteamento Cliente Resiliente: URLs que funcionam com botão Voltar/Avançar do navegador e preservam o estado da sessão. - Reatividade com Proxy ES6: Intercepção de operações de set para atualizar nós pontuais da interface de forma cirúrgica. - Resiliência de Rede: Cancelamento automático de requisições pendentes ao navegar para outra página antes do término do download. - Zero Dependências Externas: Demonstração de proficiência sênior em APIs padrão do ECMAScript e do W3C.
🛠️ 2. Implementação Prática em JavaScript Vanilla e Arquitetura SPA
Abaixo está a implementação técnica de referência, estruturada com padrões de engenharia de software e foco em robustez:
// vanilla-spa-core.js (Núcleo do Roteador e Estado Reativo)
// 1. Estado Reativo com Proxy
function createReactiveStore(initialState, onUpdate) {
return new Proxy(initialState, {
set(target, prop, value) {
target[prop] = value;
onUpdate(prop, value);
return true;
}
});
}
// 2. Roteador Client-Side com History API
class Router {
constructor(routes, outletId) {
this.routes = routes;
this.outlet = document.getElementById(outletId);
window.addEventListener('popstate', () => this.resolveRoute());
}
navigate(path) {
window.history.pushState({}, '', path);
this.resolveRoute();
}
resolveRoute() {
const path = window.location.pathname || '/';
const component = this.routes[path] || this.routes['/404'];
this.outlet.innerHTML = '';
this.outlet.appendChild(component.render());
}
}
// Inicialização da SPA
const store = createReactiveStore({ count: 0 }, (prop, val) => {
const el = document.getElementById('counter-display');
if (el) el.textContent = val;
});
💡 Análise Passo a Passo do Código
- Proxy Trap: O método
set()intercepta qualquer alteração de estado e notifica imediatamente a funçãoonUpdate. - History Popstate: O listener em
popstateescuta as setas de navegação do browser e troca a tela sem recarregar a página. - Injeção Limpa:
outlet.innerHTML = ''limpa o contêiner de visualização e injeta o novo nó renderizado.
🎯 3. Próximos Passos & Sequência Didática
-
Slides da Aula
-
Quiz de Fixação
-
Exercícios Práticos
-
Desafio de Projeto