Angular 22: o que mudou de verdade, e o que fazer num app em produção

O Angular 22 saiu em 3 de junho de 2026. No fundo é um release de amadurecimento: Signal Forms, as APIs assíncronas resource e httpResource e o Angular Aria saíram do experimental e viraram estáveis. Mas tem uma mudança de default que mexe com todo componente do seu app: OnPush agora é o padrão de change detection. Vou destrinchar o que mudou e o que eu faria na prática.

O que o Angular 22 é de verdade

O Angular 22 chegou em 3 de junho de 2026. Bate o olho na lista de features e parece coisa demais. Mas olha com cabeça de tech lead que tem app em produção e tudo se separa em dois grupos: o que era experimento e virou estável, e os defaults que mudaram.

O que virou estável é opcional. Signal Forms, as APIs assíncronas resource e httpResource e o Angular Aria agora são estáveis, mas ninguém te obriga a usar. Já as mudanças de default, não: OnPush, strictTemplates, o backend Fetch do HttpClient e o incremental hydration passam a valer a não ser que você diga o contrário, e o ng update escreve migrações no seu código pra segurar o comportamento antigo.

Então a pergunta que importa no upgrade não é "o que tem de novo". É "quais migrações a CLI acabou de escrever no meu app, e quais eu quero mesmo manter". O resto do guia é responder isso, área por área.

A mudança que mexe com todo componente: OnPush por padrão

Pra um app que já existe, o que pega é uma linha no changelog: a estratégia padrão de change detection agora é OnPush. Um componente que nunca definiu changeDetection rodava eager, checando a cada tick. No v22 esse mesmo componente é OnPush.

O ng update não te deixa na mão. Ele escreve changeDetection: ChangeDetectionStrategy.Eager nos seus componentes pra nada mudar em runtime. É a jogada segura, e também uma lista de tarefas: cada Eager que ele adiciona é um componente que dependia da checagem eager, e um candidato a virar OnPush de verdade com calma.

O que eu faria: deixa os componentes novos serem OnPush, porque o padrão novo é o certo, e trata os Eager que a migração adicionou como backlog, não como veredito. Os componentes que quebram quando você tira o Eager são os que mudam estado do template sem avisar o Angular, o mesmo tipo de código que aparece quando um app vira zoneless. O v22 só deixou a pergunta inevitável.

O novo default, e o que a migração escreve no código antigots
// v22: agora este componente é OnPush por padrão. Sem linha de strategy.
@Component({ selector: 'app-badge', template: '{{ count() }}' })
export class BadgeComponent {
  count = signal(0);   // a escrita do signal marca a view OnPush como suja, então beleza
}

// O que o ng update põe nos seus componentes ANTIGOS pra preservar o eager:
@Component({
  selector: 'app-legacy',
  changeDetection: ChangeDetectionStrategy.Eager,   // adicionado pela migração
  template: '...',
})
export class LegacyComponent {}

As estabilizações: o que virou estável, e se vale adotar

Três coisas saíram do experimental no v22, e a resposta honesta pra "devo adotar" muda de uma pra outra.

Signal Forms é o destaque. Era developer preview no v21, e ser estável muda a conta: código novo já pode usar, e o v22 fechou as lacunas que me deixavam cauteloso antes (validators de data, validação async com debounce, getError com narrowing de tipo). Eu mostro como eu adotaria hoje, e o resumo é: usa num form novo, mas não sai reescrevendo reactive form que funciona só por isso.

As APIs resource e httpResource são a camada de dados dos async signals, e também são estáveis. Isso encerra a cautela do Estado HTTP sem transformar tudo em Signals: o httpResource não é mais um experimento pra isolar, é ferramenta que você pode pôr numa leitura de verdade. O Angular Aria também virou estável junto, e agora funciona com Signal Forms, o que faz controle de form acessível deixar de ser um trabalho de construir na mão.

FeatureStatus v21Status v22O que eu faria
Signal FormsDeveloper previewEstávelUse em forms novos; não reescreva reactive forms que funcionam
resource / httpResourceExperimentalEstávelUse em leituras remotas novas; mantenha RxJS onde streams compõem
Angular Aria (@angular/aria)Developer previewEstável (GA)Adote pra controles acessíveis customizados

Os testes também andaram, e a maior parte a seu favor

Se você migrou testes pro Vitest, o v22 transformou dois workarounds em features suportadas. O zone.js/plugins/vitest-patch que mantém o fakeAsync vivo agora é o caminho documentado, não um truque. E há schematics novos: uma migração migrate-karma-to-vitest faz a troca de runner, e o refactor-jasmine-vitest ganhou um flag --fake-async que reescreve testes de tempo pra timers nativos do Vitest por você.

Isso não aposenta o trabalho, só muda o formato. O schematic converte os casos mecânicos, mas os testes com Promise na cadeia ainda precisam de review, e você ainda tem que decidir se vale migrar uma suíte. O piso ficou mais alto do que estava um release atrás.

Os schematics de teste do v22bash
# Converte specs Jasmine pra Vitest, com timers nativos pros testes de fakeAsync:
ng generate @schematics/angular:refactor-jasmine-vitest --fake-async --include=src/app

As viradas de default menores que pegam no upgrade

Um punhado de mudanças mais discretas aparece como surpresa se você não souber delas. O HttpClient agora usa o backend Fetch por padrão e o withFetch() está deprecado, com a migração tirando ele. O strictTemplates vem ligado, então templates que passavam no type-check de forma frouxa podem começar a falhar o build. Incremental hydration é o padrão pra apps SSR. E a toolchain andou: TypeScript 6 é obrigatório, o Node 20 saiu e o Node 26 entrou.

Nenhuma é difícil, mas cada uma é um ponto onde um ng update limpo ainda te deixa uma decisão manual. O router tem uma sem migração nenhuma: paramsInheritanceStrategy agora tem default 'always', o que pode mudar o que uma rota filha lê dos params.

O que eu faria essa semana

O upgrade em si é ng update @angular/core @angular/cli, e aí o trabalho real é ler o que ele escreveu. Rode as migrações, e revise o diff com duas perguntas: quais adições de Eager no change detection eu quero manter, e quais remoções de deprecação eu aceito.

Depois do upgrade mecânico, as decisões de adoção são a parte interessante, e são o mesmo filtro disciplinado de sempre: adote o que é seguro, teste o que não é, deixe código estável quieto. Signal Forms e httpResource estáveis os movem da coluna de spike pra coluna de adotar-em-código-novo, que é exatamente o tipo de mudança que um plano de modernização deve absorver sem virar reescrita.

O v22 recompensa quem já estava migrando pra signals aos poucos, e o padrão OnPush sobe sem alarde a régua de higiene de change detection pro resto. É um release pra encarar com calma e critério.

Artefato para reaproveitar

Checklist de upgrade pro Angular 22

  • Rode ng update @angular/core @angular/cli e deixe os schematics aplicarem as migrações.
  • Confirme a toolchain: TypeScript 6, Node 22.22+, 24 ou 26 (Node 20 saiu).
  • Revise cada changeDetection: Eager que a migração adicionou: cada um é candidato a OnPush, não conclusão.
  • Decida sobre o backend Fetch (withFetch() foi removido) e sobre as falhas de strictTemplates que o build agora mostra.
  • Anote o default do router: paramsInheritanceStrategy agora é 'always', sem migração.
  • Trate Signal Forms e httpResource como adotar-em-código-novo agora que são estáveis; não reescreva código que funciona por isso.

Perguntas frequentes

Quando o Angular 22 foi lançado, e o que ele exige?

O Angular 22 foi lançado em 3 de junho de 2026. Exige TypeScript 6 e Node 22.22+, 24 ou 26; o suporte ao Node 20 foi removido. RxJS 7.4+ continua suportado.

Qual a maior mudança do Angular 22 pra um app existente?

A estratégia default de change detection agora é OnPush. Um componente sem changeDetection explícito é OnPush no v22. O ng update preserva o comportamento antigo adicionando ChangeDetectionStrategy.Eager nos seus componentes existentes, mas componentes novos são OnPush por default.

Signal Forms estão estáveis no Angular 22?

Sim. Signal Forms saíram de developer preview pra estável no v22, junto com as APIs de async signal resource e httpResource e o pacote @angular/aria. Estão prontos pra produção, embora adotar siga sendo opcional.

O Angular 22 mudou algo sobre testes com Vitest?

Sim, a seu favor. O zone.js/plugins/vitest-patch que mantém o fakeAsync funcionando agora é o caminho documentado, e o v22 adiciona um schematic migrate-karma-to-vitest mais um flag --fake-async no refactor-jasmine-vitest que reescreve testes de tempo pra timers nativos do Vitest.

Subir pro Angular 22 é arriscado?

A parte mecânica é um ng update com migrações automáticas. As decisões são revisar as adições de Eager no change detection e as remoções de deprecação como o withFetch(). Nada te força a adotar as APIs recém-estáveis, então o risco está mais no que você escolhe mudar depois do upgrade do que no upgrade em si.

Fontes consultadas

Modern Angular Playbook

Este artigo é um play.

O Playbook do Angular Moderno reúne o diagnóstico, a matriz de adoção, onze jogadas e o plano de 30 dias. Grátis, em inglês e português.

Você recebe os dois PDFs por email, pela lista do Dojo IA.

Abrir playbook →

André Ramosdisponível para vagas remotas, UTC−3Entre em contato →

Leia também

Nota · 6 min

O que adotar, testar ou deixar para depois no Angular 21

Um filtro de adoção para Angular 21: o que entra em trechos que já vão mudar, o que merece branch e o que deve ficar longe de fluxos críticos.

Ler artigo →

Nota · 6 min

Como eu adotaria Signal Forms agora que são estáveis no Angular 22

Um filtro de adoção pra Signal Forms agora que são estáveis no Angular 22: use em forms novos, mantenha reactive forms onde já funcionam.

Ler artigo →

Guia · 6 min

Quando migrar uma suíte Angular para Vitest

Vitest virou o test runner padrão do Angular CLI, mas migrar uma suíte existente ainda é experimental: quais specs migrar primeiro, o que o fakeAsync quebra, e como manter o CI confiável.

Ler artigo →