Capstone · Performance & rendering
Capstone "Ticker": painel de mercado ao vivo com 100k+ linhas em Angular 21 zoneless que força junto OnPush/signals granulares, virtual scroll, Web Worker off-main-thread, SSR+hydration+@defer, análise de bundle e budgets/CWV no CI — cada ganho provado por número antes/depois, anti-tutorial-hell por construção.
→ Abrir o Ticker (100k instrumentos, preços ao vivo)
Referência construída do que "pronto" significa: 60fps, ~25 linhas no DOM de 100k, ~15k updates/s via Web Worker, com HUD de performance. É o teu alvo — agora constrói a tua versão em Angular 21.
Você constrói uma única feature real: um painel de cotações ao vivo — 100.000+ instrumentos (ações/cripto), busca e filtro instantâneos, uma tabela virtualizada que atualiza de preços por WebSocket, e um bloco de gráficos que só carrega quando entra em viewport. Pequeno para um fim de semana, denso o bastante para portfólio.
Essa feature é o pretexto perfeito porque cada gargalo de performance aparece naturalmente — você não "estuda" os tópicos, você bate de frente com eles:
provideZonelessChangeDetection(), estado 100% em signal()/computed(), tudo OnPush, e prova que só as células que mudaram re-renderizam.@for track por id estável forçam DOM recycling. Aqui você sente por que track errado destrói o ganho.requestIdleCallback + debounce na busca evitam layout thrash.@defer como "islands" para o pacote de gráficos; streaming SSR para o TTFB.source-map-explorer prova onde o peso está; budgets no CI impedem regressão.web-vitals) e trava orçamento no pipeline.O fio condutor: tornar visível o invisível. Todo ganho de perf tem que ser medido antes/depois, não sentido "no olho".
Ordem incremental — cada passo entrega algo medível e prepara o próximo. Meça no fim de cada um.
@for sem virtual scroll, Zone.js ligado, filtro síncrono na main thread. Rode Lighthouse e Performance panel. Anote os números horríveis — esse é seu ponto de comparação. Sem baseline, nada do resto tem prova.provideZonelessChangeDetection(), migre estado para signals, marque tudo OnPush. Meça INP e o custo de CD. Aqui você entende por que CheckAlways não escala com stream de alta frequência.track. Compare DOM node count e fps antes/depois.ng generate web-worker). Debounce a busca; use requestIdleCallback para o que não é urgente. Prove no Performance panel que a main thread respira durante a digitação.interval) atualizando preços. Atualize por signal granular — só a célula do preço, não a linha, não a tabela. Observe o CD com Angular DevTools profiler.@defer (on viewport). Meça LCP e TTFB; experimente streaming SSR e compare.source-map-explorer no build de prod. Ache o peso morto, garanta que charts está em chunk lazy, elimine duplicação. Commit do relatório de chunks.angular.json (ou bundlesize) + Lighthouse-CI com asserts de LCP/INP/CLS. Faça uma PR que estoura o budget de propósito e mostre o CI vermelho.web-vitals, mande as métricas pra um endpoint (ou log). Feche o README com a tabela antes/depois.