<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Erick Gabriel dos Santos Alves</title>
    <description>The latest articles on DEV Community by Erick Gabriel dos Santos Alves (@erickg123).</description>
    <link>https://dev.to/erickg123</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3820654%2F4d71aafa-6bba-4d2e-abd2-95ada9f5d5f5.jpeg</url>
      <title>DEV Community: Erick Gabriel dos Santos Alves</title>
      <link>https://dev.to/erickg123</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/erickg123"/>
    <language>en</language>
    <item>
      <title>Além da Teoria: Implementando WCAG no Angular Moderno (v21+)</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Tue, 21 Jul 2026 17:02:11 +0000</pubDate>
      <link>https://dev.to/erickg123/alem-da-teoria-implementando-wcag-no-angular-moderno-v21-4d0</link>
      <guid>https://dev.to/erickg123/alem-da-teoria-implementando-wcag-no-angular-moderno-v21-4d0</guid>
      <description>&lt;p&gt;Acessibilidade web (WCAG) é o tipo de tema que todo mundo concorda que é crucial, mas que raramente recebe a atenção prática que merece durante a nossa formação. Seja na faculdade ou na grande maioria dos cursos de desenvolvimento, o assunto ou é completamente ignorado ou é tratado de forma puramente teórica. São raros os conteúdos que mostram como aplicar as diretrizes da WCAG na realidade de um framework componentizado.&lt;/p&gt;

&lt;p&gt;Recentemente, passei pela experiência de implementar conformidade com a WCAG em um sistema corporativo real utilizando as versões mais recentes do Angular. Neste artigo, vamos entender o que é essa sopa de letrinhas, por que ela importa e como aplicar 4 abordagens práticas no ecossistema do Angular moderno.&lt;/p&gt;




&lt;h2&gt;
  
  
  Entendendo a WCAG: O que é e por que devemos nos importar?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;WCAG&lt;/strong&gt; significa &lt;em&gt;Web Content Accessibility Guidelines&lt;/em&gt; (Diretrizes de Acessibilidade para Conteúdo Web). Desenvolvido pelo W3C (World Wide Web Consortium), trata-se do padrão ouro global que define como tornar o conteúdo da web mais acessível para pessoas com deficiências visuais, auditivas, físicas, cognitivas e neurológicas.&lt;/p&gt;

&lt;p&gt;As diretrizes são organizadas sob 4 princípios fundamentais conhecidos como &lt;strong&gt;POUR&lt;/strong&gt;:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Perceptível:&lt;/strong&gt; A informação e os componentes da interface devem ser apresentados de forma que os usuários possam percebê-los (ex: texto alternativo para imagens, contraste adequado).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Operável:&lt;/strong&gt; Os componentes da interface e a navegação devem ser operáveis através de diferentes dispositivos (ex: navegação completa apenas via teclado, sem armadilhas de foco).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Compreensível:&lt;/strong&gt; A informação e a operação da interface devem ser fáceis de entender (ex: mensagens de erro claras em formulários).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Robusto:&lt;/strong&gt; O conteúdo deve ser robusto o suficiente para ser interpretado de forma confiável por uma ampla variedade de tecnologias assistivas (como leitores de tela).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Por que devemos seguir a WCAG?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Inclusão e Alcance:&lt;/strong&gt; Desenvolver pensando na WCAG garante que o seu software possa ser utilizado por qualquer pessoa, independentemente de suas limitações permanentes, temporárias ou situacionais.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Qualidade de Engenharia:&lt;/strong&gt; Código acessível exige HTML semântico. Interfaces acessíveis possuem uma estrutura de árvore do DOM muito mais limpa, o que melhora indiretamente o SEO (Search Engine Optimization) e a manutenibilidade do projeto.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Conformidade Legal:&lt;/strong&gt; Em escala global, governos e empresas estão tornando a acessibilidade um requisito obrigatório por lei. Negligenciar a WCAG pode resultar em barreiras comerciais e até processos jurídicos para sistemas corporativos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Longe da teoria dos slides, o jogo muda quando precisamos abrir o repositório. Vamos ao código.&lt;/p&gt;




&lt;h2&gt;
  
  
  1. Atributos ARIA Dinâmicos com Signals
&lt;/h2&gt;

&lt;p&gt;Acessibilidade em Single Page Applications (SPAs) precisa ser reativa. Quando o estado da interface muda, o leitor de tela precisa ser notificado imediatamente.&lt;/p&gt;

&lt;p&gt;Em formulários de login, por exemplo, a ação de alternar a visibilidade da senha exige que o &lt;code&gt;aria-label&lt;/code&gt; mude dinamicamente para que o usuário saiba exatamente o que o botão fará a seguir. Com a reatividade dos &lt;strong&gt;Signals&lt;/strong&gt;, conseguimos vincular isso diretamente ao DOM utilizando o prefixo &lt;code&gt;attr.&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"input-group"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;input&lt;/span&gt; 
    &lt;span class="na"&gt;[type]=&lt;/span&gt;&lt;span class="s"&gt;"showPassword() ? 'text' : 'password'"&lt;/span&gt; 
    &lt;span class="na"&gt;id=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; 
    &lt;span class="na"&gt;formControlName=&lt;/span&gt;&lt;span class="s"&gt;"password"&lt;/span&gt; 
  &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
    &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;
    &lt;span class="na"&gt;[attr.aria-label]=&lt;/span&gt;&lt;span class="s"&gt;"showPassword() ? 'Esconder senha' : 'Mostrar senha'"&lt;/span&gt;
    &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"togglePasswordVisibility()"&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;[class]=&lt;/span&gt;&lt;span class="s"&gt;"showPassword() ? 'pi pi-eye-slash' : 'pi pi-eye'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  2. Navegação por Teclado e Gerenciamento de Foco
&lt;/h2&gt;

&lt;p&gt;Um dos maiores problemas de acessibilidade na web moderna é a quebra de navegação por teclado. Elementos nativos como &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; e &lt;code&gt;&amp;lt;a&amp;gt;&lt;/code&gt; já possuem comportamento de foco nativo, mas quando criamos componentes customizados (como timelines ou itens de menu baseados em &lt;code&gt;div&lt;/code&gt;), eles ficam invisíveis para a tecla &lt;code&gt;Tab&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para resolver isso, precisamos injetar explicitamente o &lt;code&gt;tabindex="0"&lt;/code&gt; (colocando o elemento na sequência natural de tabulação) e capturar os eventos de teclado correspondentes ao clique (&lt;code&gt;Enter&lt;/code&gt; ou &lt;code&gt;Espaço&lt;/code&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; 
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-item"&lt;/span&gt; 
  &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt;
  &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt;
  &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"selectEvent(event)"&lt;/span&gt;
  &lt;span class="na"&gt;(keydown.enter)=&lt;/span&gt;&lt;span class="s"&gt;"selectEvent(event)"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-marker"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"timeline-content"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;h3&amp;gt;&lt;/span&gt;{{ event.title }}&lt;span class="nt"&gt;&amp;lt;/h3&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;{{ event.description }}&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  3. Papéis Semânticos (Roles) Explícitos para Interfaces Ricas
&lt;/h2&gt;

&lt;p&gt;Quando a árvore do DOM é gerada através de múltiplos componentes aninhados do Angular, a semântica nativa do HTML pode se perder facilmente em meio a um mar de tags customizadas e invólucros estruturais.&lt;/p&gt;

&lt;p&gt;Se você está construindo estruturas complexas, como uma barra de navegação ou um menu de configurações, o uso do atributo &lt;code&gt;role&lt;/code&gt; ajuda o leitor de tela a mapear a árvore de acessibilidade corretamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;nav&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"sidebar-menu"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"menu"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  @for (item of menuItems(); track item.id) {
    &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-item"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"menuitem"&lt;/span&gt; &lt;span class="na"&gt;tabindex=&lt;/span&gt;&lt;span class="s"&gt;"0"&lt;/span&gt; &lt;span class="na"&gt;(keydown.enter)=&lt;/span&gt;&lt;span class="s"&gt;"navigate(item.path)"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;[class]=&lt;/span&gt;&lt;span class="s"&gt;"item.icon"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;
      &lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;{{ item.label }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

    @if (item.hasSeparator) {
      &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"menu-separator"&lt;/span&gt; &lt;span class="na"&gt;role=&lt;/span&gt;&lt;span class="s"&gt;"separator"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
    }
  }
&lt;span class="nt"&gt;&amp;lt;/nav&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  4. Alternativas de Texto para Botões Apenas com Ícones
&lt;/h2&gt;

&lt;p&gt;Botões que contêm apenas ícones (como botões de busca com uma lupa, exclusão com uma lixeira ou fechamento com um "X") são visualmente limpos, mas completamente mudos para um leitor de tela se não forem tratados. O software de acessibilidade tentará ler a classe CSS do ícone (ex: &lt;code&gt;pi-search&lt;/code&gt;), resultando em uma experiência confusa.&lt;/p&gt;

&lt;p&gt;Adicionar um &lt;code&gt;aria-label&lt;/code&gt; descritivo garante que a função do botão seja anunciada perfeitamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; 
  &lt;span class="na"&gt;type=&lt;/span&gt;&lt;span class="s"&gt;"button"&lt;/span&gt; 
  &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"p-button-rounded"&lt;/span&gt;
  &lt;span class="na"&gt;aria-label=&lt;/span&gt;&lt;span class="s"&gt;"Pesquisar registros"&lt;/span&gt;
  &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"executeSearch()"&lt;/span&gt;
&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;i&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"pi pi-search"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/i&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusão e Fluxo de Testes
&lt;/h2&gt;

&lt;p&gt;Escrever código acessível não aumenta a complexidade da sua arquitetura; pelo contrário, força a escrita de um HTML mais limpo, semântico e robusto. Acessibilidade não é uma feature secundária para entregar no final do projeto, é parte fundamental da qualidade da engenharia do software.&lt;/p&gt;

&lt;p&gt;Para validar essas implementações no dia a dia, recomendo fortemente integrar testes manuais ao seu fluxo de desenvolvimento:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Desconecte o mouse:&lt;/strong&gt; Tente realizar o fluxo principal do seu sistema (como autenticação e navegação) usando apenas as teclas &lt;code&gt;Tab&lt;/code&gt;, &lt;code&gt;Shift + Tab&lt;/code&gt; e &lt;code&gt;Enter&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Use Leitores Reais:&lt;/strong&gt; Utilize ferramentas como o &lt;strong&gt;NVDA&lt;/strong&gt; (Windows) ou o &lt;strong&gt;VoiceOver&lt;/strong&gt; (macOS) em conjunto com o navegador para ouvir como a sua aplicação está se comportando em tempo real.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;O ecossistema do Angular nos dá todas as ferramentas necessárias para criar aplicações inclusivas. Cabe a nós, desenvolvedores, virar a chave da teoria para a prática.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>programming</category>
      <category>architecture</category>
      <category>angular</category>
    </item>
    <item>
      <title>Angular 22: O Framework finalmente encontrou sua identidade?</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Fri, 12 Jun 2026 17:38:45 +0000</pubDate>
      <link>https://dev.to/erickg123/angular-22-o-framework-finalmente-encontrou-sua-identidade-3ba5</link>
      <guid>https://dev.to/erickg123/angular-22-o-framework-finalmente-encontrou-sua-identidade-3ba5</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Durante anos, uma crítica acompanhou o Angular em praticamente toda discussão sobre Front-end:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"O Angular é poderoso, mas complexo."&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E, para ser justo, essa crítica tinha fundamento.&lt;br&gt;
NgModules, Zone.js, Change Detection global, decorators em excesso, Reactive Forms verbosos e uma curva de aprendizado considerável fizeram muita gente migrar para alternativas consideradas mais simples.&lt;/p&gt;

&lt;p&gt;Mas algo interessante aconteceu entre o Angular 16 e o Angular 22.&lt;/p&gt;

&lt;p&gt;Pela primeira vez desde o lançamento do Ivy, não parece que estamos vendo apenas uma sequência de novas funcionalidades. Estamos vendo uma direção arquitetural clara.&lt;/p&gt;

&lt;p&gt;O Angular 22 não é importante por causa de uma única feature. Ele é importante porque consolida uma transformação iniciada anos atrás: &lt;strong&gt;Angular agora é oficialmente um framework Signal-First.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  O Angular de 2026 é muito diferente do Angular de 2020
&lt;/h2&gt;

&lt;p&gt;Se você ficou alguns anos longe do framework, provavelmente lembrará de algo assim:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AppModule&lt;/li&gt;
&lt;li&gt;SharedModule&lt;/li&gt;
&lt;li&gt;Guards em Classes&lt;/li&gt;
&lt;li&gt;Change Detection padrão&lt;/li&gt;
&lt;li&gt;Zone.js&lt;/li&gt;
&lt;li&gt;Reactive Forms&lt;/li&gt;
&lt;li&gt;Webpack&lt;/li&gt;
&lt;li&gt;RxJS para praticamente tudo&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;Hoje um projeto Angular moderno nasce com:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Standalone Components&lt;/li&gt;
&lt;li&gt;Functional Guards&lt;/li&gt;
&lt;li&gt;&lt;code&gt;inject()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Signals&lt;/li&gt;
&lt;li&gt;Signal Forms&lt;/li&gt;
&lt;li&gt;Resource API&lt;/li&gt;
&lt;li&gt;OnPush por padrão&lt;/li&gt;
&lt;li&gt;Hydration&lt;/li&gt;
&lt;li&gt;Esbuild + Vite&lt;/li&gt;
&lt;li&gt;SSR de primeira classe&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A quantidade de conceitos obrigatórios diminuiu drasticamente. E talvez essa seja a maior evolução do framework.&lt;/p&gt;


&lt;h2&gt;
  
  
  1. OnPush finalmente virou o padrão
&lt;/h2&gt;

&lt;p&gt;Durante anos praticamente todo desenvolvedor Angular experiente fazia isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;templateUrl&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./dashboard.component.html&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;changeDetection&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ChangeDetectionStrategy&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OnPush&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashboardComponent&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Por quê?&lt;/strong&gt; Porque o comportamento padrão verificava componentes demais.&lt;br&gt;
Agora o Angular oficializou essa prática. Você não precisa mais adicionar &lt;code&gt;OnPush&lt;/code&gt; manualmente em cada componente.&lt;/p&gt;

&lt;p&gt;Parece uma mudança pequena. &lt;strong&gt;Não é.&lt;/strong&gt; Ela mostra que o framework assumiu definitivamente uma arquitetura baseada em reatividade explícita.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos verificações globais.&lt;/li&gt;
&lt;li&gt;Menos trabalho para CPU.&lt;/li&gt;
&lt;li&gt;Mais previsibilidade.&lt;/li&gt;
&lt;li&gt;Mais performance.&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  2. Signals deixaram de ser novidade e viraram fundação
&lt;/h2&gt;

&lt;p&gt;Quando Signals apareceram no Angular 16, muita gente tratou como uma funcionalidade interessante. No Angular 22 eles já fazem parte da identidade do framework.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Antes:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agora:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CounterComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;increment&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;(click)=&lt;/span&gt;&lt;span class="s"&gt;"increment()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  {{ count() }}
&lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A principal diferença é que o Angular sabe exatamente quem depende daquele estado. Nada de verificações desnecessárias.&lt;/p&gt;




&lt;h2&gt;
  
  
  3. Computed Signals: reatividade sem esforço
&lt;/h2&gt;

&lt;p&gt;Uma das APIs mais elegantes introduzidas pelo framework.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;computed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;PedidoComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;itens&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;100&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
    &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;200&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;]);&lt;/span&gt;

  &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;computed&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;itens&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nf"&gt;reduce&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;acc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;acc&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;Total: {{ total() }}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Sempre que a lista mudar, o total será recalculado automaticamente.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Sem subscriptions.&lt;/li&gt;
&lt;li&gt;Sem Subjects.&lt;/li&gt;
&lt;li&gt;Sem RxJS.&lt;/li&gt;
&lt;li&gt;Sem código extra.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  4. Signal Forms finalmente ficaram prontos para produção
&lt;/h2&gt;

&lt;p&gt;Quando os Signals foram lançados, a pergunta era inevitável: &lt;em&gt;"Mas e os formulários?"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A resposta demorou alguns releases. Agora chegou. Signal Forms se tornaram uma alternativa moderna aos tradicionais Reactive Forms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reactive Forms:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;FormControl&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Abordagem baseada em Signals:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;signal&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UsuarioComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;form&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;signal&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;''&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="nf"&gt;atualizarNome&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;form&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;update&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;
      &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;v&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;nome&lt;/span&gt;
    &lt;span class="p"&gt;}));&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Os formulários ficam mais próximos da arquitetura reativa moderna do framework.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Menos boilerplate.&lt;/li&gt;
&lt;li&gt;Mais previsibilidade.&lt;/li&gt;
&lt;li&gt;Melhor tipagem.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  5. Resource API: a evolução mais subestimada do Angular
&lt;/h2&gt;

&lt;p&gt;Essa talvez seja a feature mais importante que pouca gente está comentando.&lt;br&gt;
Historicamente tínhamos duas opções: &lt;code&gt;Observable&lt;/code&gt; ou &lt;code&gt;Promise&lt;/code&gt;.&lt;br&gt;
Agora temos &lt;strong&gt;Resources&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Exemplo simplificado:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;resource&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;usuarios&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;resource&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;loader&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
    &lt;span class="nf"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/api/users&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;then&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;r&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Template:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@if (usuarios.isLoading()) {
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Carregando...&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
}

@if (usuarios.hasValue()) {
  &lt;span class="nt"&gt;&amp;lt;app-user-list&lt;/span&gt;
    &lt;span class="na"&gt;[users]=&lt;/span&gt;&lt;span class="s"&gt;"usuarios.value()"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/app-user-list&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A Resource encapsula: Dados, Loading, Error, Reload e Cancelamento. Tudo integrado com Signals. Não substitui RxJS, mas elimina uma enorme quantidade de código para casos simples.&lt;/p&gt;




&lt;h2&gt;
  
  
  6. &lt;code&gt;inject()&lt;/code&gt; mudou a forma de escrever Angular
&lt;/h2&gt;

&lt;p&gt;Durante anos escrevemos isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Agora:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;http&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;HttpClient&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Ou dentro de uma Functional Guard:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authGuard&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;CanActivateFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;auth&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A API ficou mais limpa, mais funcional e mais fácil de compor.&lt;/p&gt;




&lt;h2&gt;
  
  
  7. O Angular está cada vez mais Zone-less
&lt;/h2&gt;

&lt;p&gt;Se existe uma palavra que define a evolução recente do Angular, ela é: &lt;strong&gt;Controle&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Durante anos o framework monitorava tudo através do &lt;code&gt;Zone.js&lt;/code&gt;. Hoje temos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Signals&lt;/li&gt;
&lt;li&gt;OnPush&lt;/li&gt;
&lt;li&gt;Resources&lt;/li&gt;
&lt;li&gt;Renderização mais previsível&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Tudo aponta para a mesma direção: Menos mágica. Mais controle. Mais performance. O Angular ainda suporta Zone.js. Mas é evidente que o futuro não gira mais em torno dele.&lt;/p&gt;




&lt;h2&gt;
  
  
  8. SSR e Hydration estão amadurecendo rapidamente
&lt;/h2&gt;

&lt;p&gt;Durante muito tempo SSR parecia uma funcionalidade opcional. Hoje não.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Configuração básica:&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;bootstrapApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nf"&gt;provideClientHydration&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Angular reutiliza o HTML renderizado pelo servidor em vez de reconstruir toda a tela.&lt;br&gt;
Benefícios:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Melhor SEO&lt;/li&gt;
&lt;li&gt;Melhor LCP&lt;/li&gt;
&lt;li&gt;Melhor experiência mobile&lt;/li&gt;
&lt;li&gt;Menos JavaScript executado&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  9. O HTTP Client também evoluiu
&lt;/h2&gt;

&lt;p&gt;Outra mudança pouco comentada. Agora é possível utilizar &lt;code&gt;Fetch&lt;/code&gt; como backend principal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="nf"&gt;bootstrapApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
      &lt;span class="nf"&gt;provideHttpClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="nf"&gt;withFetch&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
      &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso aproxima o Angular dos padrões modernos da Web. Menos dependências legadas. Mais alinhamento com o ecossistema JavaScript.&lt;/p&gt;




&lt;h2&gt;
  
  
  10. Angular e IA: o início de uma nova fase
&lt;/h2&gt;

&lt;p&gt;O time do Angular está investindo cada vez mais em integração com ferramentas de IA. Estamos vendo iniciativas envolvendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;WebMCP&lt;/li&gt;
&lt;li&gt;Agent Skills&lt;/li&gt;
&lt;li&gt;Ferramentas para assistentes inteligentes&lt;/li&gt;
&lt;li&gt;Melhor suporte a automação&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Ainda é cedo para saber o impacto real. Mas o sinal é claro: O Angular quer ser um framework preparado para um futuro onde IA participa ativamente do desenvolvimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que esperar do Angular 23, 24 e além?
&lt;/h2&gt;

&lt;p&gt;Se eu tivesse que apostar no futuro do framework, apostaria em cinco movimentos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Menos RxJS obrigatório:&lt;/strong&gt; RxJS continuará relevante, mas cada vez mais opcional.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Mais APIs baseadas em Signals:&lt;/strong&gt; Signals se tornaram o centro da arquitetura. Tudo novo gira em torno deles.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Zone.js cada vez menos relevante:&lt;/strong&gt; A direção do framework é clara.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Build ainda mais rápido:&lt;/strong&gt; Esbuild e Vite foram apenas o começo.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;IA integrada ao fluxo de desenvolvimento:&lt;/strong&gt; O Angular já começou a investir nessa direção.&lt;/li&gt;
&lt;/ol&gt;




&lt;h2&gt;
  
  
  Conclusão
&lt;/h2&gt;

&lt;p&gt;Angular 22 não impressiona por uma única funcionalidade. Ele impressiona porque fecha vários ciclos iniciados anos atrás.&lt;/p&gt;

&lt;p&gt;Signals amadureceram. Signal Forms amadureceram. Resources amadureceram. OnPush virou padrão. SSR evoluiu. O ecossistema de build ficou absurdamente rápido. O framework ficou mais previsível, mais performático e mais alinhado com a Web moderna.&lt;/p&gt;

&lt;p&gt;Depois de acompanhar a evolução do Angular desde a era dos NgModules gigantes e do Webpack dominando tudo, talvez a melhor definição seja esta:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O Angular finalmente parece um framework que sabe exatamente para onde está indo.&lt;/strong&gt; E isso é algo que não acontecia há bastante tempo.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;E você?&lt;/strong&gt; Qual foi a mudança mais importante do Angular nos últimos anos? Deixe nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Desconstruindo o Build: A Revolução do Angular (E a diferença entre Compilador e Bundler)</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:40 +0000</pubDate>
      <link>https://dev.to/erickg123/desconstruindo-o-build-a-revolucao-do-angular-e-a-diferenca-entre-compilador-e-bundler-4p9f</link>
      <guid>https://dev.to/erickg123/desconstruindo-o-build-a-revolucao-do-angular-e-a-diferenca-entre-compilador-e-bundler-4p9f</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Na nossa jornada de migração do YMS (do Angular 16 para o 21), mencionei no primeiro artigo que o tempo de compilação e o &lt;em&gt;hot reload&lt;/em&gt; despencaram. A experiência de desenvolvimento foi para outro patamar. Mas por que isso aconteceu?&lt;/p&gt;

&lt;p&gt;Muitos desenvolvedores acreditam que o Angular "trocou de compilador" nas versões recentes. Mas isso é um mito. Para entender o que realmente deixou o framework tão rápido, precisamos separar duas ferramentas fundamentais que rodam no seu terminal: o &lt;strong&gt;Compilador&lt;/strong&gt; e o &lt;strong&gt;Bundler&lt;/strong&gt; (Empacotador).&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Desfazendo a confusão: Compilador vs. Bundler
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;A. O Compilador (Ivy)&lt;/strong&gt;&lt;br&gt;
O compilador é o tradutor. O navegador não entende TypeScript, nem entende os decorators do Angular (&lt;code&gt;@Component&lt;/code&gt;, &lt;code&gt;@Injectable&lt;/code&gt;) ou a sintaxe de template do HTML (&lt;code&gt;@if&lt;/code&gt;, &lt;code&gt;{{ variavel }}&lt;/code&gt;). &lt;/p&gt;

&lt;p&gt;O papel do compilador do Angular (chamado de &lt;strong&gt;Ivy&lt;/strong&gt;) é ler esse código e transformá-lo em instruções JavaScript puras. &lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A grande sacada aqui é:&lt;/strong&gt; O compilador não mudou. O Angular usa o Ivy desde a versão 9. Tanto o nosso projeto legado no Angular 16 quanto a versão nova no Angular 21 rodam o mesmíssimo compilador por baixo dos panos.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;B. O Bundler (O Empacotador)&lt;/strong&gt;&lt;br&gt;
O &lt;em&gt;Bundler&lt;/em&gt; é o gerente de logística. Depois que o Ivy traduz os arquivos, você fica com milhares de pequenos arquivos JS espalhados. O &lt;em&gt;Bundler&lt;/em&gt; pega tudo isso, resolve as dependências (quem importa quem), aplica o &lt;em&gt;Tree-Shaking&lt;/em&gt; (que explicamos no artigo anterior), minifica o código e empacota tudo em um ou mais arquivos finais para o navegador baixar.&lt;/p&gt;

&lt;p&gt;E é aqui que a mágica da nossa migração aconteceu: nós trocamos o gerente de logística.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. O Passado: A Era do Webpack
&lt;/h3&gt;

&lt;p&gt;No Angular 16, o padrão absoluto para empacotar a aplicação era o &lt;strong&gt;Webpack&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;O Webpack é uma ferramenta fantástica, mas tem um problema de arquitetura para o modo de desenvolvimento: ele precisa construir a aplicação inteira antes de poder servi-la.&lt;/p&gt;

&lt;p&gt;Em um sistema corporativo pesado como o nosso YMS (cheio de telas, regras logísticas e componentes densos do PrimeNG), o Webpack precisava rastrear milhares de arquivos, compilar tudo, empacotar em memória e só então liberar a tela no &lt;code&gt;localhost&lt;/code&gt;. Qualquer mudança num CSS fazia o Webpack recalcular uma parte gigantesca desse pacote. O resultado? Segundos (ou até minutos) olhando para o terminal esperando o &lt;em&gt;reload&lt;/em&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. O Presente: A Revolução do Esbuild + Vite
&lt;/h3&gt;

&lt;p&gt;A partir das versões mais recentes (consolidado como padrão no 17+), o Angular chutou o Webpack e reescreveu todo o seu &lt;em&gt;pipeline&lt;/em&gt; de &lt;em&gt;build&lt;/em&gt; utilizando duas ferramentas absurdamente rápidas: o &lt;strong&gt;Esbuild&lt;/strong&gt; e o &lt;strong&gt;Vite&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Esbuild:&lt;/strong&gt; É um &lt;em&gt;bundler&lt;/em&gt; escrito em Go (uma linguagem compilada e de altíssima performance). Ao contrário do Webpack (escrito em JavaScript), o Esbuild paraleliza o trabalho usando todos os núcleos do seu processador. Ele constrói dependências pesadas (como o PrimeNG ou o RxJS) em milissegundos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Vite:&lt;/strong&gt; Essa é a estrela do modo de desenvolvimento (&lt;code&gt;ng serve&lt;/code&gt;). O Vite inverte a lógica do Webpack. Ele não constrói a aplicação inteira antes de iniciar. Ele inicia o servidor instantaneamente e deixa o navegador pedir os arquivos &lt;strong&gt;sob demanda&lt;/strong&gt; (usando &lt;em&gt;Native ES Modules&lt;/em&gt;). Se você está na tela de "Login", o Vite só pede para o Angular compilar e entregar os arquivos do Login. O resto do YMS fica ignorado até você navegar para lá.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. O Impacto na Prática
&lt;/h3&gt;

&lt;p&gt;Essa mudança do Webpack para o Esbuild/Vite mudou a nossa vida no projeto. O &lt;em&gt;Hot Module Replacement&lt;/em&gt; (HMR) agora é instantâneo. Você altera a cor de um botão no arquivo SCSS, e a tela pisca e atualiza em frações de segundo, sem perder o estado da página.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Nós não escrevemos código mais rápido, mas paramos de esperar a máquina trabalhar. O ciclo de &lt;em&gt;feedback&lt;/em&gt; rápido destrava a produtividade de qualquer equipe de Front-end.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;O Angular 21 não é mais rápido porque tem um novo compilador, mas sim porque o ecossistema de &lt;em&gt;build&lt;/em&gt; ao redor dele evoluiu para ferramentas de próxima geração. &lt;/p&gt;

&lt;p&gt;Se você ainda está preso em versões antigas do Angular, atualize. Nem que seja apenas para sentir o prazer de um &lt;code&gt;ng serve&lt;/code&gt; que inicia em menos de 2 segundos.&lt;/p&gt;

&lt;p&gt;Você já notou essa diferença de tempo de &lt;em&gt;build&lt;/em&gt; nos seus projetos atualizados? Quanto tempo demorava o seu &lt;code&gt;ng serve&lt;/code&gt; mais lento na época do Webpack? Deixa aí nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Desconstruindo o Build: Como o Tree-Shaking realmente funciona (e por que o Bundle importa)</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:38 +0000</pubDate>
      <link>https://dev.to/erickg123/desconstruindo-o-build-como-o-tree-shaking-realmente-funciona-e-por-que-o-bundle-importa-1hc7</link>
      <guid>https://dev.to/erickg123/desconstruindo-o-build-como-o-tree-shaking-realmente-funciona-e-por-que-o-bundle-importa-1hc7</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;No primeiro artigo da nossa série sobre a migração do YMS (do Angular 16 para o 21), mencionei que uma das maiores vitórias de abandonar o &lt;code&gt;app.module.ts&lt;/code&gt; e adotar os &lt;em&gt;Standalone Components&lt;/em&gt; foi a melhora drástica no &lt;strong&gt;Tree-Shaking&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Teoria é legal, mas na nossa área o que manda são os números. Durante essa refatoração estrutural, matando Módulos, limpando arquivos sem uso e ajustando lógicas legadas, nós conseguimos reduzir o tamanho da nossa pasta de build de assustadores &lt;strong&gt;40MB&lt;/strong&gt; para cerca de &lt;strong&gt;15MB&lt;/strong&gt;. Uma redução de mais de 60% no "peso" do sistema!&lt;/p&gt;

&lt;p&gt;Como nós, desenvolvedores, adoramos entender como as engrenagens rodam por baixo dos panos, decidi fazer esta pausa na série principal para desconstruir esse processo. Como exatamente o framework conseguiu arrancar 25MB de "gordura" do nosso projeto?&lt;/p&gt;

&lt;p&gt;A resposta atende por dois nomes: o novo &lt;em&gt;bundler&lt;/em&gt; (Esbuild/Vite) e um &lt;em&gt;Tree-Shaking&lt;/em&gt; finalmente eficiente. Mas antes de balançarmos a árvore, precisamos entender exatamente o que é o "cesto de frutas" que estamos enviando para o navegador do nosso usuário.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Mas primeiro: O que é esse tal de "Bundle"?
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Bundle&lt;/em&gt; (ou empacotamento) é o resultado final do processo de &lt;em&gt;build&lt;/em&gt; do Angular.&lt;/p&gt;

&lt;p&gt;Quando você escreve o código do seu YMS, você cria centenas (ou milhares, num projeto de 5 anos!) de arquivos TypeScript, HTML e CSS. Mas o navegador do seu usuário não entende TypeScript e nem sabe como carregar essa estrutura complexa de pastas.&lt;/p&gt;

&lt;p&gt;O papel do &lt;em&gt;Bundler&lt;/em&gt; é ler todo esse código, processá-lo, compilá-lo para JavaScript nativo e juntar tudo em apenas um (ou alguns poucos) arquivos. É esse pacote único que o navegador baixa e executa para rodar o seu sistema.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. Qual o impacto prático do Bundle?
&lt;/h3&gt;

&lt;p&gt;O tamanho do &lt;em&gt;Bundle&lt;/em&gt; tem um impacto direto e brutal tanto na &lt;em&gt;Developer Experience&lt;/em&gt; (DX) quanto na &lt;em&gt;User Experience&lt;/em&gt; (UX):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Velocidade do Build:&lt;/strong&gt; Durante o desenvolvimento, um &lt;em&gt;bundle&lt;/em&gt; menor significa que o &lt;em&gt;hot reload&lt;/em&gt; (ver a alteração na tela ao salvar o arquivo) é quase instantâneo, o que melhora muito a nossa produtividade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tempo de Carregamento Inicial:&lt;/strong&gt; Para o usuário, um &lt;em&gt;bundle&lt;/em&gt; menor significa um download mais rápido. Se o seu YMS tem um pacote de dezenas de megabytes, o usuário vai ficar olhando para uma tela branca por muito tempo, especialmente em redes móveis ou conexões instáveis de armazéns logísticos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Tempo de Análise e Execução:&lt;/strong&gt; O navegador não apenas baixa o arquivo; ele precisa interpretar e executar todo o JavaScript. Um arquivo maior consome mais CPU e tempo, o que pode travar a interface e gerar uma experiência péssima.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Resumo da ópera:&lt;/strong&gt; O &lt;em&gt;bundle&lt;/em&gt; é o arquivo final que roda o seu sistema, e o tamanho dele dita a velocidade da aplicação. Otimizá-lo é uma prioridade absoluta em sistemas &lt;em&gt;Enterprise&lt;/em&gt;.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. A Analogia da Árvore: Entendendo o Tree-Shaking
&lt;/h3&gt;

&lt;p&gt;Imagine que o seu projeto é uma árvore frutífera. O tronco é o seu &lt;code&gt;main.ts&lt;/code&gt; e os galhos são os seus componentes, serviços e bibliotecas externas (como o PrimeNG ou o RxJS). As folhas são as funções e métodos escritos no código.&lt;/p&gt;

&lt;p&gt;Quando chega a hora de enviar esse projeto para produção (o momento do &lt;em&gt;build&lt;/em&gt;), o seu &lt;em&gt;Bundler&lt;/em&gt; balança essa árvore com força. O objetivo? Fazer com que todas as folhas mortas (código que você escreveu ou importou da biblioteca, mas nunca usou de fato na tela) caiam no chão e não sejam enviadas para o pacote final do usuário.&lt;/p&gt;

&lt;p&gt;Isso é o &lt;strong&gt;Tree-Shaking&lt;/strong&gt;: a eliminação de código morto (&lt;em&gt;dead-code elimination&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Como o Bundler sabe o que é código morto?&lt;/strong&gt;&lt;br&gt;
O &lt;em&gt;Tree-Shaking&lt;/em&gt; só é possível graças à estrutura estática dos módulos do JavaScript moderno (a famosa sintaxe de &lt;code&gt;import&lt;/code&gt; e &lt;code&gt;export&lt;/code&gt;). Como essa sintaxe não pode ser condicional (você não pode colocar um &lt;code&gt;import&lt;/code&gt; dentro de um &lt;code&gt;if&lt;/code&gt;), o &lt;em&gt;bundler&lt;/em&gt; consegue ler todos os seus arquivos antes de executá-los e montar um &lt;strong&gt;Grafo de Dependências&lt;/strong&gt; perfeito (um mapa exato de quem chama quem).&lt;/p&gt;

&lt;p&gt;Se você importa uma biblioteca inteira de utilitários, mas só usa a função &lt;code&gt;ordenar()&lt;/code&gt;, o &lt;em&gt;bundler&lt;/em&gt; rastreia isso. As outras 50 funções da biblioteca são marcadas como "código morto" e podadas da árvore.&lt;/p&gt;


&lt;h3&gt;
  
  
  4. O Problema: Por que o NgModule era o inimigo do Tree-Shaking?
&lt;/h3&gt;

&lt;p&gt;Aqui entra o pulo do gato e o motivo pelo qual nosso &lt;em&gt;build&lt;/em&gt; antigo batia a assustadora casa dos 40MB.&lt;/p&gt;

&lt;p&gt;Os Módulos do Angular agrupavam as coisas. Pense no famoso &lt;code&gt;SharedModule&lt;/code&gt;. Nós costumávamos colocar absolutamente tudo lá dentro: botões, diretivas, &lt;em&gt;pipes&lt;/em&gt; de formatação de data, dezenas de componentes de modal do PrimeNG, etc.&lt;/p&gt;

&lt;p&gt;Quando você importava o &lt;code&gt;SharedModule&lt;/code&gt; no seu &lt;code&gt;DashboardModule&lt;/code&gt;, o &lt;em&gt;bundler&lt;/em&gt; olhava para aquilo e pensava: &lt;em&gt;"Opa, ele importou o módulo inteiro. Como o Angular injeta isso de forma dinâmica em tempo de execução, eu não tenho certeza de quais partes desse SharedModule o Dashboard realmente vai usar. Na dúvida, vou empacotar TUDO para não quebrar a aplicação em produção."&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O resultado?&lt;/strong&gt; Se o seu Dashboard precisasse de apenas um botão, ele acabava carregando o peso de todos os modais, tabelas e &lt;em&gt;pipes&lt;/em&gt; de outras partes do sistema. A árvore não balançava direito. Estávamos enviando código morto para o navegador o tempo todo.&lt;/p&gt;


&lt;h3&gt;
  
  
  5. A Solução: A Transparência dos Standalone Components
&lt;/h3&gt;

&lt;p&gt;É por isso que os componentes &lt;em&gt;Standalone&lt;/em&gt; são uma revolução de performance, e não apenas de sintaxe. Ao remover o Módulo genérico da jogada, o contrato de dependência fica explícito diretamente no componente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;selector&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;app-dashboard&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;standalone&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// O bundler vê EXATAMENTE o que está sendo usado&lt;/span&gt;
  &lt;span class="na"&gt;imports&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;ButtonModule&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;DatePipe&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt; 
  &lt;span class="na"&gt;template&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`&amp;lt;button&amp;gt;Clique aqui: {{ dataAtual | date }}&amp;lt;/button&amp;gt;`&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;DashboardComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, o &lt;em&gt;bundler&lt;/em&gt; consegue montar um mapa preciso. Ele sabe que o &lt;code&gt;DashboardComponent&lt;/code&gt; só usa o botão e o &lt;em&gt;pipe&lt;/em&gt; de data. Todo o resto do PrimeNG ou de componentes compartilhados que não estão nesse &lt;em&gt;array&lt;/em&gt; de &lt;code&gt;imports&lt;/code&gt; é sumariamente descartado no processo de &lt;em&gt;build&lt;/em&gt;. A tesoura finalmente funciona!&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Migrar um projeto maduro e complexo como o nosso YMS para componentes &lt;em&gt;Standalone&lt;/em&gt; dá um trabalho considerável, mas o pagamento vem na balança: &lt;strong&gt;25MB a menos&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O JavaScript que o navegador do usuário baixa fica estritamente limitado ao que a tela atual precisa. &lt;em&gt;Menos código = carregamento mais rápido = operadores logísticos muito mais felizes.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E você, já chegou a analisar o tamanho do &lt;em&gt;bundle&lt;/em&gt; do seu projeto com ferramentas como o &lt;code&gt;source-map-explorer&lt;/code&gt; antes e depois do Standalone? Compartilha os resultados aí nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Desconstruindo o Build: Chunks, Raio-X e a Anatomia do Navegador</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:36 +0000</pubDate>
      <link>https://dev.to/erickg123/desconstruindo-o-build-chunks-raio-x-e-a-anatomia-do-navegador-5d68</link>
      <guid>https://dev.to/erickg123/desconstruindo-o-build-chunks-raio-x-e-a-anatomia-do-navegador-5d68</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;No nosso último artigo sobre a desconstrução do &lt;em&gt;build&lt;/em&gt;, mostrei como reduzimos o pacote do nosso YMS de 40MB para 15MB através de &lt;em&gt;Standalone Components&lt;/em&gt; e &lt;em&gt;Tree-Shaking&lt;/em&gt;. Mas, como bons engenheiros, não paramos por aí. 15MB ainda é muita coisa.&lt;/p&gt;

&lt;p&gt;Sempre que rodamos o comando &lt;code&gt;ng build&lt;/code&gt;, o terminal nos joga uma sopa de letrinhas com centenas de arquivos (&lt;em&gt;chunks&lt;/em&gt;) e tamanhos variados. Mas o que exatamente o Angular está gerando? Como o navegador "mastiga" essa pasta de &lt;em&gt;build&lt;/em&gt;? E, mais importante, como descobrimos o que está escondido dentro desses megabytes?&lt;/p&gt;

&lt;p&gt;Hoje, vamos abrir a caixa preta da compilação, entender a matemática da performance e fazer um Raio-X da nossa aplicação.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Como o navegador entende a sua pasta de Build?
&lt;/h3&gt;

&lt;p&gt;Quando você programa em Angular, você escreve TypeScript, usa SCSS e cria templates dinâmicos. Mas o navegador (Chrome, Edge, Safari) é "burro" para isso. Ele só entende o tripé sagrado da web: &lt;strong&gt;HTML, CSS e JavaScript puro&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O papel do seu &lt;em&gt;Bundler&lt;/em&gt; (no Angular 21, o Esbuild) é traduzir a sua engenharia complexa para esse formato básico. O resultado cai na pasta &lt;code&gt;dist/&lt;/code&gt;. Mas como o navegador lê isso?&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Porta de Entrada:&lt;/strong&gt; O navegador baixa o &lt;code&gt;index.html&lt;/code&gt;. Ele é um arquivo minúsculo que não tem quase nada na tela, mas contém as tags &lt;code&gt;&amp;lt;link&amp;gt;&lt;/code&gt; para o seu CSS e &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; para o seu JavaScript.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O Download e o Bloqueio:&lt;/strong&gt; O navegador começa a baixar o seu arquivo principal (&lt;code&gt;main.js&lt;/code&gt;). É aqui que a mágica (ou a tragédia) acontece. Diferente de uma imagem de 2MB que apenas aparece na tela, um arquivo JavaScript de 2MB precisa ser &lt;strong&gt;Baixado, Interpretado (Parsed), Compilado e Executado&lt;/strong&gt; pela &lt;em&gt;Main Thread&lt;/em&gt; (a linha de execução principal) do navegador.&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A Tela Branca:&lt;/strong&gt; Enquanto o navegador está executando esse JavaScript pesado, ele "trava". Nenhuma interface é desenhada e nenhum clique funciona. É o famoso gargalo de &lt;strong&gt;TTI&lt;/strong&gt; (&lt;em&gt;Time to Interactive&lt;/em&gt;). É por isso que arquivos grandes são mortais. O peso do JS custa caro na rede (download) e caríssimo na CPU do celular ou do computador do usuário (execução).&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. Lendo o Terminal: O que são os "Chunks"?
&lt;/h3&gt;

&lt;p&gt;Sabendo que arquivos gigantes travam o navegador, o Angular usa a tática de "dividir para conquistar". Quando rodamos o &lt;em&gt;build&lt;/em&gt; do nosso YMS, recebemos o seguinte log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Initial chunk files                 | Names       | Raw size
styles.css                          | styles      | 1.10 MB 
main.js                             | main        | 19.33 kB 
chunk-DXO7V6OT.js                   | -           | 26.94 kB 
                                    | Initial total | 1.18 MB

Lazy chunk files                    | Names                       | Raw size
chunk-QPFHIJ3Z.js                   | -                           | 513.35 kB 
editar.component-US2MQII7.js        | editar-component            | 342.09 kB 
painel.component-CX2TJGIN.js        | painel-component            | 281.48 kB 
...and 390 more lazy chunks files. Use "--verbose" to show all the files.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Para um desenvolvedor desavisado, ver "390 arquivos" gerados pode parecer um erro. Na verdade, é a prova de uma arquitetura de sucesso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O que é um Chunk?&lt;/strong&gt; É um fragmento isolado do seu sistema. O código alfanumérico no nome (&lt;code&gt;DXO7V6OT&lt;/code&gt;) serve para o &lt;em&gt;Cache Busting&lt;/em&gt;: se você alterar apenas esse arquivo no futuro, o nome muda, forçando o navegador a baixar a nova versão e reaproveitar o resto que está intocado no cache.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Initial Chunk Files (O Kit de Sobrevivência):&lt;/strong&gt; Essa é a métrica mais importante do seu Front-end. O nosso &lt;em&gt;Initial total&lt;/em&gt; deu &lt;strong&gt;1.18 MB&lt;/strong&gt;. Esse é o pacote absoluto que o navegador precisa baixar e executar para exibir a primeira tela (como o Login). Manter isso baixo é o que garante que o usuário não fique olhando para uma tela branca.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Lazy Chunk Files (A Sobremesa sob Demanda):&lt;/strong&gt; O Angular pegou nossa tela gigantesca de &lt;code&gt;painel.component&lt;/code&gt;, isolou as dependências dela e gerou um arquivo separado de 281 kB. O navegador &lt;strong&gt;nunca&lt;/strong&gt; fará o download desses 281 kB a menos que o usuário clique no botão para acessar o painel. Dividimos 15MB em fatias cirúrgicas de carregamento!&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  3. Qual é o "Tamanho Ideal" e os Performance Budgets?
&lt;/h3&gt;

&lt;p&gt;Com base em tudo isso, definimos limites estritos (&lt;em&gt;Performance Budgets&lt;/em&gt;). No Angular, você pode configurar isso no &lt;code&gt;angular.json&lt;/code&gt; para que o &lt;em&gt;build&lt;/em&gt; "quebre" (falhe no CI/CD) se você passar do limite.&lt;/p&gt;

&lt;p&gt;O nosso alvo corporativo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O Initial Bundle&lt;/strong&gt; deve ficar abaixo de 2MB (descompactado). Isso garante que, mesmo em um armazém logístico com internet 3G oscilante, a tela de login apareça em menos de 3 segundos.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Os Lazy Chunks&lt;/strong&gt; devem ter no máximo 500KB. Se um componente Lazy passa disso, significa que a tela está fazendo coisas demais e precisa ser quebrada em sub-rotas ou blocos &lt;code&gt;@defer&lt;/code&gt; no HTML.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  4. O Raio-X do Bundle: Achando a "Gordura"
&lt;/h3&gt;

&lt;p&gt;Tínhamos os limites definidos, tínhamos 15MB totais divididos em 390 &lt;em&gt;chunks&lt;/em&gt;, mas queríamos saber: o que exatamente tem dentro desses &lt;em&gt;chunks&lt;/em&gt; mais pesados?&lt;/p&gt;

&lt;p&gt;Na era do Angular 16 (Webpack), usávamos a biblioteca &lt;code&gt;source-map-explorer&lt;/code&gt;. Mas com o Esbuild (Angular 17+), a compilação é tão agressiva que as ferramentas antigas quebram.&lt;/p&gt;

&lt;p&gt;A solução oficial agora é gerar o relatório nativo do compilador:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;ng build &lt;span class="nt"&gt;--configuration&lt;/span&gt; production &lt;span class="nt"&gt;--stats-json&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Depois, basta jogar esse arquivo &lt;code&gt;stats.json&lt;/code&gt; no site oficial do &lt;strong&gt;Esbuild Bundle Analyzer&lt;/strong&gt; (&lt;code&gt;esbuild.github.io/analyze&lt;/code&gt;). O resultado é um mapa visual interativo que mostra cada &lt;em&gt;byte&lt;/em&gt; do sistema. Ao rodar essa auditoria no YMS, encontramos três "vazamentos" clássicos de sistemas corporativos que estavam devorando nossos megabytes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;A Guerra dos Gráficos:&lt;/strong&gt; Estávamos empacotando TRÊS bibliotecas de gráficos simultaneamente em telas diferentes: ECharts (~1MB), ApexCharts (~1MB) e Chart.js (~190KB). Padronizar a empresa para usar apenas uma delas limparia 1.2MB numa tacada só.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;O Mistério do Service Gigante:&lt;/strong&gt; Achamos um serviço (&lt;code&gt;modelo-carroceria.service.ts&lt;/code&gt;) pesando inacreditáveis 500KB. Serviços normais têm 2KB! O motivo? Um JSON estático gigantesco (uma base de dados de caminhões) estava "chumbado" direto no código TypeScript, em vez de vir via API ou de um arquivo JSON estático na pasta &lt;code&gt;assets&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Geradores de PDF Duplicados:&lt;/strong&gt; O sistema importava a biblioteca &lt;code&gt;jspdf&lt;/code&gt; isoladamente, mas também importava um componente pronto de terceiros que já trazia o &lt;code&gt;jspdf&lt;/code&gt; embutido. O compilador não conseguiu unificar os dois, cobrando o peso em dobro.&lt;/li&gt;
&lt;/ol&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Saber codificar telas bonitas é o básico do desenvolvimento web. Mas entender a anatomia do navegador, dominar a geração de &lt;em&gt;chunks&lt;/em&gt; e saber medir o impacto de cada importação usando o &lt;em&gt;Esbuild Analyzer&lt;/em&gt; é o que separa "fazer código" de &lt;strong&gt;Engenharia de Software&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você já abriu a caixa preta do &lt;em&gt;build&lt;/em&gt; no seu projeto Angular mais recente? Tomou algum susto com o tamanho de alguma biblioteca escondida? Compartilhem as experiências nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 9) - UX Corporativa: Dark Mode, Grids Dinâmicos e PrimeNG na prática</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:30 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-9-ux-corporativa-dark-mode-grids-2bj7</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-9-ux-corporativa-dark-mode-grids-2bj7</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Chegamos ao nono e &lt;strong&gt;último artigo&lt;/strong&gt; da nossa série documentando a evolução estrutural de um YMS (&lt;em&gt;Yard Management System&lt;/em&gt;) gigante, saindo do Angular 16 direto para o 21. Já refatoramos o núcleo, as rotas, os &lt;em&gt;Signals&lt;/em&gt;, a estrutura de pastas e a internacionalização. &lt;/p&gt;

&lt;p&gt;Mas, para o usuário final, a arquitetura invisível do código não importa. O que importa é a tela. E hoje, os usuários de sistemas corporativos B2B (Backoffice, ERPs, YMS) não aceitam mais interfaces cinzas com cara de Windows 95. Eles exigem a mesma fluidez, UX e beleza dos aplicativos que usam no celular.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. A Evolução do PrimeNG e o Padrão Ouro dos Grids
&lt;/h3&gt;

&lt;p&gt;Nossa interface sempre foi alicerçada no &lt;strong&gt;PrimeNG&lt;/strong&gt;. O pulo de 5 versões do Angular exigiu adequações estruturais pesadas na forma como lidávamos com os estilos. A biblioteca evoluiu muito para adotar um sistema de design baseado em &lt;em&gt;tokens&lt;/em&gt; (&lt;em&gt;CSS Variables&lt;/em&gt;) e uma integração profunda com &lt;em&gt;Utility Classes&lt;/em&gt; (o PrimeFlex).&lt;/p&gt;

&lt;p&gt;Sistemas logísticos respiram dados. Tabelas (&lt;code&gt;&amp;lt;p-table&amp;gt;&lt;/code&gt;) não são apenas para visualização; elas são a principal ferramenta de trabalho do operador. &lt;/p&gt;

&lt;p&gt;Implementamos recursos modernos que mudaram completamente a percepção de performance e usabilidade do usuário:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Filtros e Ordenação no lado do Servidor:&lt;/strong&gt; Absolutamente essencial quando você tem milhões de registros na base de dados e não pode travar o navegador tentando filtrar isso no Front-end.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Scroll Virtual (Lazy Loading UI):&lt;/strong&gt; Substituindo a paginação tradicional por um &lt;em&gt;scroll&lt;/em&gt; infinito suave. O Angular destrói as linhas HTML que sobem pela tela e recria as que aparecem embaixo. Isso consome recursos de renderização da CPU apenas para as linhas que estão visíveis.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Salvamento de Estado (Stateful Grids):&lt;/strong&gt; O usuário reordena as colunas, ajusta as larguras, sai da tela e, ao voltar no dia seguinte, a tabela "lembra" exatamente da preferência dele usando o &lt;em&gt;Local Storage&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  2. A Inevitável Chegada do Dark Mode
&lt;/h3&gt;

&lt;p&gt;O &lt;em&gt;Dark Mode&lt;/em&gt; (Modo Escuro) não é mais um "frufru" visual. Para operadores logísticos que passam 10 horas por dia olhando para painéis de controle e gráficos de pátio em salas escuras de monitoramento, é uma questão de saúde visual e ergonomia.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A Mágica dos Tokens:&lt;/strong&gt; Com a arquitetura de tokens CSS das versões modernas do Angular e do PrimeNG, a alternância de temas parou de exigir a recarga inteira da página ou a inserção manual de dezenas de classes no HTML com JavaScript. Agora, mudar para o tema escuro é apenas uma substituição de variáveis nativas CSS (como &lt;code&gt;--surface-a&lt;/code&gt; ou &lt;code&gt;--text-color&lt;/code&gt;) na raiz do documento (&lt;code&gt;:root&lt;/code&gt;). A transição é instantânea e extremamente leve para o navegador.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Conclusão: O Veredito da Jornada
&lt;/h3&gt;

&lt;p&gt;Pular 5 versões de um ecossistema complexo exige sangue frio, testes extensivos e muita leitura de &lt;em&gt;changelogs&lt;/em&gt;. Mas o resultado final faz cada erro de compilação no terminal valer a pena:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Um código absurdamente mais limpo (Adeus, &lt;code&gt;app.module&lt;/code&gt; e &lt;code&gt;ngOnDestroy&lt;/code&gt;!).&lt;/li&gt;
&lt;li&gt;Uma compilação instantânea no ambiente de desenvolvimento (graças ao novo &lt;em&gt;bundler&lt;/em&gt; com &lt;em&gt;Vite&lt;/em&gt; e &lt;em&gt;esbuild&lt;/em&gt;).&lt;/li&gt;
&lt;li&gt;Uma aplicação rápida como um raio no navegador do usuário (com &lt;em&gt;Signals&lt;/em&gt; e &lt;em&gt;Zoneless&lt;/em&gt;).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Manter sistemas atualizados não é apenas perseguir a novidade tecnológica pelo &lt;em&gt;hype&lt;/em&gt;. É garantir &lt;strong&gt;agilidade e segurança&lt;/strong&gt; para continuar entregando valor ao negócio nos próximos 5 anos, sem que o código vire um legado intocável que ninguém na equipe tem coragem de mexer.&lt;/p&gt;

&lt;p&gt;Espero que essa série de 9 artigos tenha ajudado a desmistificar alguns conceitos modernos do Angular e inspirado você a encarar a modernização das suas bases de código por aí.&lt;/p&gt;

&lt;p&gt;Um grande abraço e até a próxima refatoração! 🚀&lt;/p&gt;

&lt;p&gt;Quais foram os maiores desafios de UI/UX que vocês já enfrentaram em sistemas corporativos internos? Deixem nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 8) - i18n Enterprise e por que escolhemos o Transloco</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:27 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-8-i18n-enterprise-e-a-batalha-das-5733</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-8-i18n-enterprise-e-a-batalha-das-5733</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Nesta jornada modernizando o nosso YMS, já passamos por performance, estrutura de pastas e padrões de código. Mas quando falamos de sistemas &lt;em&gt;Enterprise&lt;/em&gt;, um requisito não-funcional frequentemente assombra as equipes de Front-end: a Internacionalização (i18n).&lt;/p&gt;

&lt;p&gt;Muitos tutoriais ensinam a traduzir um botão de "Salvar" para "Save". Mas na trincheira de um sistema logístico real e de grande porte, as coisas são muito mais complexas. Não se trata apenas de traduzir palavras, mas de definir &lt;em&gt;como&lt;/em&gt; essa tradução será processada na arquitetura da aplicação.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O Desafio Numérico (Muito além do texto)
&lt;/h3&gt;

&lt;p&gt;Antes de falar de bibliotecas de tradução, precisamos lembrar que i18n afeta a matemática da tela. O peso de um caminhão no Brasil é &lt;code&gt;45.500,00 kg&lt;/code&gt;. Nos EUA, precisa ser renderizado obrigatoriamente como &lt;code&gt;45,500.00 kg&lt;/code&gt;. Uma vírgula no lugar errado em um sistema logístico gera multas milionárias nas rodovias.&lt;/p&gt;

&lt;p&gt;Felizmente, aproveitando os &lt;em&gt;Pipes&lt;/em&gt; nativos (&lt;code&gt;DecimalPipe&lt;/code&gt; e &lt;code&gt;DatePipe&lt;/code&gt;) combinados com a injeção do &lt;code&gt;LOCALE_ID&lt;/code&gt; correto na inicialização da aplicação, o Angular resolve isso sozinho:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Peso Lido: {{ pesoTotalCapturado | number:'1.2-2' }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;Data: {{ momentoPesagem | date:'short' }}&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. O Dilema Arquitetural: Runtime vs. Build-time
&lt;/h3&gt;

&lt;p&gt;Quando fomos refatorar a tradução dos textos e &lt;em&gt;labels&lt;/em&gt; do sistema, esbarramos na grande dúvida: Abraçar o nativo &lt;code&gt;@angular/localize&lt;/code&gt; ou utilizar bibliotecas de terceiros?&lt;/p&gt;

&lt;p&gt;Para entender a nossa decisão, precisamos separar as abordagens em duas categorias:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A. Tradução em Tempo de Build (AOT) - &lt;code&gt;@angular/localize&lt;/code&gt;&lt;/strong&gt;&lt;br&gt;
A solução nativa do Angular é fantástica para a performance da tela, pois ela embute os textos direto no HTML. Mas ela faz isso gerando &lt;strong&gt;uma versão inteira do sistema para cada idioma&lt;/strong&gt; durante o &lt;code&gt;ng build&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;O Problema no YMS:&lt;/strong&gt; Se temos 3 idiomas (PT, EN, ES), o nosso tempo de &lt;em&gt;build&lt;/em&gt; no CI/CD triplica. Para um sistema gigante, gerar e hospedar múltiplas pastas de &lt;em&gt;build&lt;/em&gt; (uma para cada língua) começou a travar a nossa esteira de &lt;em&gt;deploy&lt;/em&gt;. Além disso, a troca de idioma exigia o recarregamento total da página.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;B. Tradução em Tempo de Execução (Runtime) - `@jsverse/transloco&lt;/strong&gt;`&lt;br&gt;
Foi aqui que a biblioteca &lt;strong&gt;Transloco&lt;/strong&gt; brilhou para nós. Ela carrega arquivos JSON com as traduções &lt;em&gt;enquanto&lt;/em&gt; o usuário navega.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;A Vitória da Manutenção:&lt;/strong&gt; Com o Transloco, nós fazemos &lt;strong&gt;apenas um build&lt;/strong&gt;. A grande sacada arquitetural dessa biblioteca são os &lt;strong&gt;Escopos (Lazy Load Scopes)&lt;/strong&gt;. Se o usuário acessa o módulo de Balança, o Transloco não baixa o dicionário do sistema inteiro; ele baixa apenas um micro-JSON de 2KB exclusivo daquela tela. O impacto na performance de rede é mínimo, a troca de idioma é em tempo real, e a nossa esteira de CI/CD agradece.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  3. Na Prática: Escrevendo código com o Transloco
&lt;/h3&gt;

&lt;p&gt;O Transloco nos oferece uma Developer Experience (DX) incrível, permitindo usar &lt;em&gt;Pipes&lt;/em&gt; ou diretivas estruturais, mantendo o HTML limpo e otimizado.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No HTML:&lt;/strong&gt;&lt;br&gt;
Em vez de usar &lt;em&gt;Pipes&lt;/em&gt; isolados para cada palavra (o que força o Angular a criar múltiplas inscrições por baixo dos panos), usamos a diretiva estrutural &lt;code&gt;*transloco&lt;/code&gt;. Ela injeta a função de tradução apenas naquele bloco:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;ng-container&lt;/span&gt; &lt;span class="na"&gt;*transloco=&lt;/span&gt;&lt;span class="s"&gt;"let t; read: 'balanca'"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;button&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"btn-primary"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    {{ t('btnConfirmarPesagem') }}
  &lt;span class="nt"&gt;&amp;lt;/button&amp;gt;&lt;/span&gt;

  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
    {{ t('msgFila', { qtdCaminhoes: 5 }) }}
  &lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ng-container&amp;gt;&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No TypeScript:&lt;/strong&gt;&lt;br&gt;
Para casos onde o texto precisa nascer dentro do código (como notificações de &lt;em&gt;Toast&lt;/em&gt; dinâmicas ou mensagens de validação vindas da API), injetamos o &lt;code&gt;TranslocoService&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;inject&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;MessageService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;primeng/api&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;TranslocoService&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@jsverse/transloco&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;OperacaoComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;messageService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MessageService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;translocoService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;TranslocoService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;finalizarOperacao&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Buscando a tradução em tempo real no TypeScript&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;msgSucesso&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;translocoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;translate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;operacao.toastSucesso&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;messageService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;add&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;severity&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;success&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;detail&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;msgSucesso&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;O nativo &lt;code&gt;@angular/localize&lt;/code&gt; é o rei da performance absoluta de renderização. Porém, para o nosso cenário corporativo, o &lt;strong&gt;Transloco&lt;/strong&gt; entregou o equilíbrio perfeito: resolveu o gargalo do nosso tempo de &lt;em&gt;build&lt;/em&gt; no CI/CD, evitou a complexidade de gerenciar múltiplos &lt;em&gt;deploys&lt;/em&gt; e manteve a performance da aplicação alta graças ao carregamento sob demanda (Lazy Loading) dos dicionários.&lt;/p&gt;

&lt;p&gt;No nosso &lt;strong&gt;nono e último artigo&lt;/strong&gt; da série, vamos fechar com chave de ouro falando sobre &lt;strong&gt;UX Corporativa&lt;/strong&gt;: como implementamos o tão pedido &lt;em&gt;Dark Mode&lt;/em&gt; e dominamos as customizações de Grids pesadas do &lt;em&gt;PrimeNG&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;E vocês, preferem o modelo em tempo de execução (&lt;code&gt;Transloco&lt;/code&gt;/&lt;code&gt;ngx-translate&lt;/code&gt;) ou já adotaram o empacotamento em tempo de &lt;em&gt;build&lt;/em&gt; do Angular? Conta aí nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>code</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 7) - Clean Architecture: A nova estrutura de pastas por domínios</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:25 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-7-clean-architecture-a-nova-estrutura-de-17dh</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-7-clean-architecture-a-nova-estrutura-de-17dh</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Nas últimas 6 partes dessa série, mergulhamos fundo no código: &lt;em&gt;Standalone Components&lt;/em&gt;, Rotas, &lt;em&gt;Signals&lt;/em&gt; e &lt;em&gt;Zoneless&lt;/em&gt;. Mas refatorar a arquitetura técnica sem arrumar a "casa" (a estrutura de pastas) é colocar motor de Ferrari em chassi de fusca.&lt;/p&gt;

&lt;p&gt;Um projeto de 5 anos geralmente sofre do mesmo mal genérico de organização, e hoje vou mostrar como aplicamos conceitos de &lt;strong&gt;Clean Architecture&lt;/strong&gt; e &lt;strong&gt;Domain-Driven Design (DDD)&lt;/strong&gt; no Front-end para salvar a manutenção do nosso YMS (&lt;em&gt;Yard Management System&lt;/em&gt;).&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O Erro Clássico: Organização por Tipo Técnico
&lt;/h3&gt;

&lt;p&gt;Lá no Angular 14/16, a literatura (e as ferramentas de CLI) nos ensinava a agrupar arquivos pelo que eles &lt;em&gt;eram&lt;/em&gt;, e não pelo que eles &lt;em&gt;faziam&lt;/em&gt;. A estrutura clássica de um sistema parecia assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/app/
 ├── components/ (misturava botões com painéis de negócio)
 ├── models/     (centenas de interfaces jogadas aqui)
 ├── services/   (tudo que era API ficava aqui)
 └── views/      (as páginas em si)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O Pesadelo Cognitivo:&lt;/strong&gt; Para alterar a tela de "Agendamento", o desenvolvedor precisava abrir a pasta de &lt;code&gt;views&lt;/code&gt; para achar o HTML, depois pular para a pasta de &lt;code&gt;models&lt;/code&gt; para entender a interface, e depois caçar a chamada de API na pasta de &lt;code&gt;services&lt;/code&gt;. O código que mudava junto morava em bairros completamente diferentes do projeto.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. A Virada: Estrutura Orientada a Domínios (Features)
&lt;/h3&gt;

&lt;p&gt;Na migração para o Angular 21, pivotamos a arquitetura para &lt;strong&gt;domínios de negócio&lt;/strong&gt;. A regra de ouro virou: &lt;em&gt;se o código muda junto, ele deve morar junto.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Nossa nova arquitetura isola responsabilidades. O módulo (agora &lt;em&gt;Standalone&lt;/em&gt;) de &lt;code&gt;balanca&lt;/code&gt; não faz a menor ideia do que acontece dentro de &lt;code&gt;agendamento&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src/app/
 ├── core/       (Interceptors, Auth, Guards - estritamente técnico e Singleton)
 ├── shared/     (Botões, Pipes, componentes UI "burros" e reaproveitáveis)
 └── features/   (Os Domínios do Negócio)
      ├── agendamento/
      │    ├── models/
      │    ├── services/
      │    └── components/
      ├── balanca/
      │    ├── models/
      │    ├── services/
      │    └── components/
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. Por que isso muda o jogo?
&lt;/h3&gt;

&lt;p&gt;Organizar arquivos pode parecer preciosismo estético, mas em bases de código maduras e sistemas &lt;em&gt;Enterprise&lt;/em&gt;, é a linha tênue entre entregar uma &lt;em&gt;feature&lt;/em&gt; em 2 horas ou em 2 dias.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Onboarding rápido:&lt;/strong&gt; Um desenvolvedor júnior entra no time hoje para arrumar um &lt;em&gt;bug&lt;/em&gt; na tela da Balança. Ele abre a pasta &lt;code&gt;features/balanca&lt;/code&gt; e absolutamente tudo que ele precisa para entender aquele contexto está lá dentro.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Escalabilidade e Desacoplamento:&lt;/strong&gt; Se o negócio crescer absurdamente, nós podemos extrair a pasta &lt;code&gt;balanca&lt;/code&gt; inteira e transformá-la em uma biblioteca independente (Angular Workspace/Nx) ou até mesmo em um &lt;strong&gt;Micro-frontend&lt;/strong&gt; sem esforço, pois ela não compartilha "lixo" com outros domínios.&lt;/li&gt;
&lt;/ul&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Ter um código moderno usando &lt;em&gt;Signals&lt;/em&gt; e rodando sem o &lt;code&gt;zone.js&lt;/code&gt; é maravilhoso, mas é a arquitetura de pastas que dita a velocidade e a sanidade mental do time no longo prazo.&lt;/p&gt;

&lt;p&gt;No próximo post (&lt;strong&gt;Parte 8&lt;/strong&gt;), vamos abordar um desafio &lt;em&gt;Enterprise&lt;/em&gt; raiz que costuma dar muita dor de cabeça em sistemas legados: a &lt;strong&gt;Internacionalização de dados e traduções dinâmicas&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E como está a pasta &lt;code&gt;src/app&lt;/code&gt; dos projetos de vocês hoje? Mais parecida com o primeiro modelo (técnico) ou com o segundo modelo (orientado a domínio)? Comentem aí! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 6) - Zoneless Angular: O fim do zone.js e a verdadeira performance</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:23 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-6-zoneless-angular-o-fim-do-zonejs-e-a-2g3o</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-6-zoneless-angular-o-fim-do-zonejs-e-a-2g3o</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Se você acompanhou o artigo anterior sobre a introdução dos Signals no nosso projeto corporativo, deve ter notado que a reatividade do Angular ficou mais "esperta". Mas para entender o ganho absurdo de performance que tivemos pulando para o Angular 21, precisamos falar do elefante na sala: o &lt;code&gt;zone.js&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O que era o zone.js e por que ele virou um problema?
&lt;/h3&gt;

&lt;p&gt;Desde o Angular 2, o framework usava uma biblioteca chamada &lt;code&gt;zone.js&lt;/code&gt; para saber quando atualizar a tela. O &lt;code&gt;zone.js&lt;/code&gt; atua como um "espião". Ele intercepta absolutamente tudo o que acontece no navegador do usuário: cliques de botão, &lt;code&gt;setTimeout&lt;/code&gt;, chamadas HTTP (&lt;code&gt;fetch&lt;/code&gt;/&lt;code&gt;XHR&lt;/code&gt;).&lt;/p&gt;

&lt;p&gt;Sempre que um desses eventos terminava, o &lt;code&gt;zone.js&lt;/code&gt; gritava para o Angular: &lt;em&gt;"Ei! Algo aconteceu. Verifique a árvore de componentes inteira para ver se alguma variável mudou!"&lt;/em&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;O Gargalo de Performance:&lt;/strong&gt; Em um sistema pequeno, varrer a tela inteira é imperceptível. Mas em um YMS (sistema de gestão de pátios) com 5 anos de idade, exibindo grids de milhares de linhas e componentes pesados do PrimeNG, essa verificação constante (&lt;em&gt;Change Detection Cycle&lt;/em&gt;) custava muito caro à CPU. Um simples &lt;code&gt;setInterval&lt;/code&gt; rodando nos bastidores podia causar pequenos engasgos na interface inteira.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. O Futuro Estável: Zoneless Angular
&lt;/h3&gt;

&lt;p&gt;Com a chegada dos Signals, o Angular agora sabe exatamente &lt;strong&gt;qual&lt;/strong&gt; variável mudou e &lt;strong&gt;qual&lt;/strong&gt; pedaço mínimo do HTML precisa ser redesenhado. Ele não precisa mais do espião (&lt;code&gt;zone.js&lt;/code&gt;) gritando para verificar o sistema inteiro.&lt;/p&gt;

&lt;p&gt;No Angular 21, essa abordagem atingiu a maturidade. A API deixou de ser experimental e se tornou totalmente estável. Ativar a aplicação sem o Zone agora é o padrão recomendado e incrivelmente simples. Mudamos apenas o nosso arquivo de inicialização (&lt;code&gt;main.ts&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// main.ts&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;bootstrapApplication&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/platform-browser&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;provideZonelessChangeDetection&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@angular/core&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nf"&gt;bootstrapApplication&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AppComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;providers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
    &lt;span class="nf"&gt;provideZonelessChangeDetection&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="c1"&gt;// A mágica oficial e estável acontece aqui!&lt;/span&gt;
    &lt;span class="c1"&gt;// ... outros providers de rotas e HTTP&lt;/span&gt;
  &lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  3. O Impacto no Projeto
&lt;/h3&gt;

&lt;p&gt;Desligar o &lt;code&gt;zone.js&lt;/code&gt; reduziu imediatamente o peso inicial do nosso pacote JavaScript (são cerca de 100KB a menos para o navegador baixar). Mas o principal benefício foi sentido na UX (Experiência do Usuário). &lt;/p&gt;

&lt;p&gt;A interação com tabelas de dados dinâmicos, modais e filtros complexos passou a rodar cravada em 60 &lt;em&gt;frames&lt;/em&gt; por segundo, sem que a &lt;em&gt;Main Thread&lt;/em&gt; do navegador fosse bloqueada por dezenas de verificações desnecessárias a cada clique.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Atenção na Migração:&lt;/strong&gt; Migrar um sistema legado para &lt;em&gt;Zoneless&lt;/em&gt; exige cuidado. Você precisa garantir que o seu estado local já está usando Signals ou que você está chamando o &lt;code&gt;ChangeDetectorRef.markForCheck()&lt;/code&gt; corretamente caso ainda dependa de bibliotecas de terceiros assíncronas que não foram atualizadas para Signals. &lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Remover o &lt;code&gt;zone.js&lt;/code&gt; foi como tirar os "pesos de treinamento" das pernas do nosso Angular. O retorno em fluidez de tela e velocidade de carregamento é imediato e brutal.&lt;/p&gt;

&lt;p&gt;No próximo post (&lt;strong&gt;Parte 7&lt;/strong&gt;), vamos sair do nível do código e ir para o nível de arquitetura de pastas. Vou mostrar como organizamos um sistema gigantesco e escalável usando princípios de &lt;strong&gt;Clean Architecture&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Você já ativou o &lt;code&gt;provideZonelessChangeDetection()&lt;/code&gt; nas suas aplicações mais recentes? Deu tudo certo de primeira ou alguma biblioteca antiga quebrou a renderização da tela? Conta aí nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 5) - Reatividade Limpa: Deixando o ngOnDestroy no passado com Signals</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:21 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-5-reatividade-limpa-deixando-o-1jlp</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-5-reatividade-limpa-deixando-o-1jlp</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Na nossa jornada modernizando um sistema corporativo de 5 anos (do Angular 16 para o 21), já limpamos o &lt;code&gt;app.module.ts&lt;/code&gt;, modernizamos as rotas, abraçamos o &lt;code&gt;inject()&lt;/code&gt; e enxugamos o HTML. Mas existe um fantasma que assombra projetos legados: os vazamentos de memória (&lt;em&gt;memory leaks&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Em sistemas pesados com dezenas de formulários e grids, assinar eventos do RxJS (&lt;code&gt;subscribe&lt;/code&gt;) sem limpá-los no &lt;code&gt;ngOnDestroy&lt;/code&gt; é o caminho mais rápido para travar o navegador do usuário. Hoje, vamos ver como os &lt;strong&gt;Signals&lt;/strong&gt; mudaram o jogo da reatividade, especialmente lidando com Formulários Reativos.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O Fantasma do RxJS em Formulários
&lt;/h3&gt;

&lt;p&gt;Sistemas &lt;em&gt;Enterprise&lt;/em&gt; têm formulários gigantescos. Imagine uma tela de cadastro com dezenas de campos, onde a mudança de uma opção (como selecionar "Pessoa Jurídica") dispara validações ou desabilita outras partes da tela.&lt;/p&gt;

&lt;p&gt;No Angular 16, ouvíamos essas mudanças assim:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Antes (Poluição visual e risco de vazamento):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CadastroComponent&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;OnInit&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;OnDestroy&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;destroy$&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Subject&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="nl"&gt;formulario&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormGroup&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nf"&gt;ngOnInit&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Ouve as mudanças do formulário&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formulario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tipoEntidade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)?.&lt;/span&gt;&lt;span class="nx"&gt;valueChanges&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;pipe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;takeUntil&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destroy$&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="c1"&gt;// O boilerplate de sempre...&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;subscribe&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atualizarRegrasDeTela&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;ngOnDestroy&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destroy$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;destroy$&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;complete&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A Bomba-Relógio:&lt;/strong&gt; Multiplique esse &lt;em&gt;boilerplate&lt;/em&gt; por 50 telas. É código repetitivo, propenso a falhas (quem nunca esqueceu um &lt;code&gt;takeUntil&lt;/code&gt; ou esqueceu de implementar o &lt;code&gt;ngOnDestroy&lt;/code&gt;?) e difícil de ler. Um único &lt;code&gt;subscribe&lt;/code&gt; esquecido aberto fica rodando na memória RAM do navegador para sempre, mesmo após o usuário trocar de tela.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  2. A Revolução dos Signals nos Formulários
&lt;/h3&gt;

&lt;p&gt;Os Signals (&lt;code&gt;signal()&lt;/code&gt;, &lt;code&gt;computed()&lt;/code&gt;, &lt;code&gt;effect()&lt;/code&gt;) introduziram uma reatividade síncrona, granular e livre de inscrições manuais. O Angular 21 permite transformar &lt;em&gt;Observables&lt;/em&gt; (como o &lt;code&gt;valueChanges&lt;/code&gt; do seu form) diretamente em Signals usando a função &lt;code&gt;toSignal&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Olha como o mesmo código fica agora, sem implementar interfaces de ciclo de vida e sem o famigerado &lt;code&gt;ngOnDestroy&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Depois (Reativo, Limpo e Seguro):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CadastroComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FormBuilder&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nx"&gt;formulario&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;group&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;tipoEntidade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="c1"&gt;// Transforma o Observable em um Signal reativo!&lt;/span&gt;
  &lt;span class="nx"&gt;tipoEntidadeSignal&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;toSignal&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;formulario&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;tipoEntidade&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;valueChanges&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Reage automaticamente às mudanças. O Angular destrói isso sozinho!&lt;/span&gt;
    &lt;span class="nf"&gt;effect&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;tipoEntidadeSignal&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="kc"&gt;undefined&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;atualizarRegrasDeTela&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;valor&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A Mágica por baixo dos panos:&lt;/strong&gt; O &lt;code&gt;toSignal&lt;/code&gt; automaticamente se inscreve no &lt;em&gt;Observable&lt;/em&gt; e, o mais importante, &lt;strong&gt;cancela a inscrição sozinho&lt;/strong&gt; quando o componente é destruído. O &lt;code&gt;effect&lt;/code&gt; rastreia suas dependências e só executa quando o valor realmente muda. Adeus, &lt;em&gt;memory leaks&lt;/em&gt;!&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Nós não abandonamos o RxJS. Ele continua sendo o rei absoluto para chamadas HTTP e fluxos assíncronos complexos baseados em eventos no tempo. Mas para gerenciamento de estado local da tela e formulários, os Signals removeram toneladas de código inútil do nosso projeto. O código ficou previsível, fácil de testar e livre de vazamentos de memória.&lt;/p&gt;

&lt;p&gt;No próximo artigo (&lt;strong&gt;Parte 6&lt;/strong&gt;), vamos falar sobre o impacto direto dessa reatividade síncrona: a possibilidade de finalmente desligarmos o motor antigo do Angular que causava tantos gargalos de performance, o &lt;code&gt;zone.js&lt;/code&gt;. Vamos falar sobre o &lt;strong&gt;Zoneless Angular&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Você já começou a refatorar seus formulários velhos para usar Signals e &lt;code&gt;toSignal&lt;/code&gt;? Conta aí a sua experiência! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 4) - Templates Modernos: O Adeus ao *ngIf e *ngFor e a mágica do @defer</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:12 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-4-templates-modernos-o-adeus-ao-ngif-e-cnc</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-4-templates-modernos-o-adeus-ao-ngif-e-cnc</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;No artigo anterior desta nossa jornada de migração de um sistema YMS (do Angular 16 para o 21), exploramos como a função &lt;code&gt;inject()&lt;/code&gt; limpou as nossas classes TypeScript e resolveu o "inferno" dos construtores. Mas hoje, vamos fechar os arquivos &lt;code&gt;.ts&lt;/code&gt; e olhar para os nossos templates HTML.&lt;/p&gt;

&lt;p&gt;O Angular passou por uma mudança drástica na forma como renderizamos o HTML. É hora de dar o adeus definitivo às velhas diretivas estruturais (&lt;code&gt;*ngIf&lt;/code&gt;, &lt;code&gt;*ngFor&lt;/code&gt;, &lt;code&gt;*ngSwitch&lt;/code&gt;) e abraçar a nova sintaxe de &lt;em&gt;Control Flow&lt;/em&gt; e o poderoso bloco &lt;code&gt;@defer&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O Adeus ao CommonModule e à sintaxe pesada
&lt;/h3&gt;

&lt;p&gt;Durante anos, para fazer um simples &lt;em&gt;if/else&lt;/em&gt; no Angular, precisávamos importar o &lt;code&gt;CommonModule&lt;/code&gt; (ou as diretivas de forma isolada nos componentes &lt;em&gt;Standalone&lt;/em&gt;) e lidar com a criação de &lt;code&gt;&amp;lt;ng-template&amp;gt;&lt;/code&gt; para blocos &lt;em&gt;else&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Em uma tela de listagem de motoristas, o código clássico era assim:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Antes (Angular 16):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;*ngIf=&lt;/span&gt;&lt;span class="s"&gt;"motoristas.length &amp;gt; 0; else semMotoristas"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;*ngFor=&lt;/span&gt;&lt;span class="s"&gt;"let motorista of motoristas; trackBy: trackPorId"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
      {{ motorista.nome }}
    &lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="nt"&gt;&amp;lt;ng-template&lt;/span&gt; &lt;span class="na"&gt;#semMotoristas&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Nenhum motorista encontrado na fila.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ng-template&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  2. O Novo Control Flow: Limpo, Nativo e Direto
&lt;/h3&gt;

&lt;p&gt;A partir do Angular 17, o framework introduziu uma nova sintaxe de bloco embutida diretamente no compilador. Não precisamos importar mais nada para fazer verificações lógicas. O código aproxima-se muito da fluidez de motores de template de outras linguagens (como o Razor ou o Blade).&lt;/p&gt;

&lt;p&gt;Olhem como o mesmo cenário acima fica agora, no Angular 21:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Depois (Angular 21):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@if (motoristas().length &amp;gt; 0) {
  &lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
    @for (motorista of motoristas(); track motorista.id) {
      &lt;span class="nt"&gt;&amp;lt;li&amp;gt;&lt;/span&gt;{{ motorista.nome }}&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    }
  &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
} @else {
  &lt;span class="nt"&gt;&amp;lt;p&amp;gt;&lt;/span&gt;Nenhum motorista encontrado na fila.&lt;span class="nt"&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;As grandes vitórias aqui:&lt;/strong&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Menos Imports:&lt;/strong&gt; O &lt;code&gt;@if&lt;/code&gt; e o &lt;code&gt;@for&lt;/code&gt; são nativos, reduzindo o &lt;em&gt;boilerplate&lt;/em&gt; do componente.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Track Obrigatório:&lt;/strong&gt; O &lt;code&gt;@for&lt;/code&gt; obriga a utilização da cláusula &lt;code&gt;track&lt;/code&gt;. Isto previne um dos erros de performance mais comuns em projetos legados: renderizar listas gigantes de grids dinâmicas sem identificar os itens de forma unívoca, o que causava re-renderizações desnecessárias.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Leitura Fluida:&lt;/strong&gt; Acabaram os &lt;code&gt;&amp;lt;ng-template&amp;gt;&lt;/code&gt; perdidos no final do arquivo apenas para gerenciar estados de &lt;em&gt;else&lt;/em&gt; ou &lt;em&gt;loading&lt;/em&gt;.&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;




&lt;h3&gt;
  
  
  3. A Verdadeira Mágica em Sistemas Enterprise: O &lt;code&gt;@defer&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Se o &lt;em&gt;Control Flow&lt;/em&gt; melhora a &lt;em&gt;Developer Experience&lt;/em&gt; (DX), o bloco &lt;code&gt;@defer&lt;/code&gt; é um divisor de águas absoluto para a &lt;em&gt;User Experience&lt;/em&gt; (UX) e &lt;em&gt;Web Performance&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Num sistema logístico complexo, temos telas que carregam gráficos pesados de dashboards, modais com mapas de pátios e componentes complexos do PrimeNG que só são usados se o usuário interagir com eles. Antigamente, dividir o carregamento destes componentes exigia código complexo e &lt;em&gt;Lazy Loading&lt;/em&gt; manual.&lt;/p&gt;

&lt;p&gt;Agora, o Angular faz isso diretamente no HTML de forma declarativa.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Exemplo Prático:&lt;/strong&gt;&lt;br&gt;
Imaginem um componente muito pesado de "Mapa de Pátio Logístico" que só deve ser carregado pelo navegador do usuário quando ele fizer &lt;em&gt;scroll&lt;/em&gt; para baixo na página e o componente entrar na área visível (&lt;em&gt;viewport&lt;/em&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;@defer (on viewport) {
  &lt;span class="nt"&gt;&amp;lt;app-mapa-patio-pesado&lt;/span&gt; &lt;span class="na"&gt;[dados]=&lt;/span&gt;&lt;span class="s"&gt;"dadosPatio"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/app-mapa-patio-pesado&amp;gt;&lt;/span&gt;
} @placeholder {
  &lt;span class="nt"&gt;&amp;lt;p-skeleton&lt;/span&gt; &lt;span class="na"&gt;width=&lt;/span&gt;&lt;span class="s"&gt;"100%"&lt;/span&gt; &lt;span class="na"&gt;height=&lt;/span&gt;&lt;span class="s"&gt;"400px"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&amp;lt;/p-skeleton&amp;gt;&lt;/span&gt;
} @loading {
  &lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"spinner-logistico"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Carregando o mapa...&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O Esbuild/Vite (o nosso novo &lt;em&gt;bundler&lt;/em&gt;) entende este &lt;code&gt;@defer&lt;/code&gt; durante o &lt;em&gt;build&lt;/em&gt;, corta o componente &lt;code&gt;app-mapa-patio-pesado&lt;/code&gt; e coloca-o num arquivo &lt;code&gt;.js&lt;/code&gt; separado. Este pedaço de código só trafega na rede quando o usuário precisa realmente dele. Reduzimos dezenas de megabytes no carregamento inicial da aplicação com algumas linhas de HTML!&lt;/p&gt;




&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Atualizar o HTML de um projeto com 5 anos de idade assusta, mas felizmente a equipe do Angular disponibilizou esquemas de migração automatizados (&lt;code&gt;ng generate @angular/core:control-flow&lt;/code&gt;) que fazem o trabalho pesado por nós.&lt;/p&gt;

&lt;p&gt;Os novos templates deixaram as nossas &lt;em&gt;views&lt;/em&gt; mais legíveis e deram-nos um controle de &lt;em&gt;Lazy Loading&lt;/em&gt; granular sem paralelo.&lt;/p&gt;

&lt;p&gt;No próximo artigo (&lt;strong&gt;Parte 5&lt;/strong&gt;), vamos unir o HTML limpo com um estado TypeScript impecável. Vamos falar de reatividade, do adeus ao velho &lt;code&gt;ngOnDestroy&lt;/code&gt; e mergulhar fundo no uso de &lt;strong&gt;Signals&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Já utilizaram o comando de migração automática de HTML nos projetos de vocês? Como foi a experiência de refatorar os antigos &lt;code&gt;*ngIf&lt;/code&gt; e &lt;code&gt;*ngFor&lt;/code&gt;? Compartilhem nos comentários! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 3) - A Revolução Silenciosa da Função inject()</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:40:03 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-3-a-revolucao-silenciosa-da-funcao-inject-2c0e</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-3-a-revolucao-silenciosa-da-funcao-inject-2c0e</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;Na segunda parte da nossa série sobre a modernização de um sistema corporativo (saindo do Angular 16 e indo direto para o 21), vimos como o roteamento ficou muito mais limpo com o fim das antigas classes &lt;em&gt;Guards&lt;/em&gt;. Mas eu deixei um gancho no ar: essa limpeza nas rotas só foi possível graças a uma pequena função que mudou para sempre a forma como escrevemos Angular.&lt;/p&gt;

&lt;p&gt;Hoje vamos falar da verdadeira revolução silenciosa do framework: a função &lt;code&gt;inject()&lt;/code&gt;.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. O Pesadelo do Construtor em Sistemas Corporativos
&lt;/h3&gt;

&lt;p&gt;Quem trabalha com aplicações &lt;em&gt;Enterprise&lt;/em&gt; sabe que uma única tela muitas vezes precisa se comunicar com diversas partes do sistema.&lt;/p&gt;

&lt;p&gt;Imagine um cenário clássico que todo desenvolvedor já enfrentou: uma tela complexa de Cadastro de Usuários. Para essa tela funcionar, você precisa buscar dados do usuário, validar o CEP em uma API externa, checar permissões, montar o formulário e gerenciar alertas na tela.&lt;/p&gt;

&lt;p&gt;No Angular 16, a única forma de trazer essas dependências para dentro do componente era através do &lt;code&gt;constructor&lt;/code&gt;. O resultado era um bloco de código gigantesco, onde a injeção de dependência engolia a lógica de negócio:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Antes (Poluição visual no Angular 16):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CadastroUsuarioComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;usuarioService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UsuarioService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;viaCepService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;ViaCepService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;permissoesService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PermissoesService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Router&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Metade do arquivo do componente era apenas &lt;em&gt;boilerplate&lt;/em&gt; (código repetitivo) para injetar dependências. Mas o problema real nem era a estética. O verdadeiro inferno começava quando precisávamos usar herança.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. O Fim do "Inferno do super()"
&lt;/h3&gt;

&lt;p&gt;Em arquiteturas limpas, é extremamente comum criarmos classes base para reaproveitar lógica. Um exemplo perfeito é um &lt;code&gt;BaseFormComponent&lt;/code&gt; que concentra a lógica de exibição de &lt;em&gt;toasts&lt;/em&gt; de erro, &lt;em&gt;spinners&lt;/em&gt; de &lt;em&gt;loading&lt;/em&gt; e validações genéricas.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;A dor da herança antes do &lt;code&gt;inject()&lt;/code&gt;:&lt;/strong&gt;&lt;br&gt;
Se o seu &lt;code&gt;BaseFormComponent&lt;/code&gt; precisasse injetar o &lt;code&gt;MessageService&lt;/code&gt; e o &lt;code&gt;LoadingService&lt;/code&gt;, todos os componentes filhos que estendessem essa classe precisavam injetar esses serviços em seus próprios construtores, apenas para passá-los para cima através da chamada do &lt;code&gt;super()&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// O componente filho precisava resolver dependências que não eram dele!&lt;/span&gt;
&lt;span class="nf"&gt;constructor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;usuarioService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;UsuarioService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fb&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;FormBuilder&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="c1"&gt;// O componente filho nem usa esses dois, mas precisa injetar para o pai!&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;messageService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;MessageService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; 
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;loadingService&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;LoadingService&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;super&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;messageService&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;loadingService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; 
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se um dia você precisasse adicionar mais um serviço genérico na classe base, você quebrava a aplicação inteira. Era necessário abrir e refatorar o construtor de dezenas (ou centenas) de telas filhas.&lt;/p&gt;




&lt;h3&gt;
  
  
  3. A Chegada da Injeção Baseada em Propriedades
&lt;/h3&gt;

&lt;p&gt;Com a maturidade da função &lt;code&gt;inject()&lt;/code&gt;, a injeção de dependências deixou de ser uma exclusividade do construtor e passou a ser declarada diretamente na inicialização das propriedades da classe.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Depois (Limpo e escalável no Angular 21):&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;@&lt;/span&gt;&lt;span class="nd"&gt;Component&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;CadastroUsuarioComponent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;BaseFormComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="c1"&gt;// A injeção agora vai direto na propriedade&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;usuarioService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;UsuarioService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;viaCepService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;ViaCepService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;private&lt;/span&gt; &lt;span class="nx"&gt;fb&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;FormBuilder&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="c1"&gt;// O constructor sumiu! &lt;/span&gt;
  &lt;span class="c1"&gt;// O BaseFormComponent se vira sozinho para buscar suas próprias dependências.&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Nessa nova abordagem, a classe base (&lt;code&gt;BaseFormComponent&lt;/code&gt;) usa o &lt;code&gt;inject()&lt;/code&gt; internamente para pegar seus próprios serviços de alerta e &lt;em&gt;loading&lt;/em&gt;. O componente filho não precisa mais saber (nem repassar) o que o pai está consumindo. O acoplamento despenca, e a refatoração vira uma tarefa segura e simples.&lt;/p&gt;




&lt;h3&gt;
  
  
  4. Fora das Classes: Interceptors Funcionais
&lt;/h3&gt;

&lt;p&gt;Além de salvar a nossa sanidade na hora de estender classes, o &lt;code&gt;inject()&lt;/code&gt; abriu as portas para o Angular ser muito mais funcional.&lt;/p&gt;

&lt;p&gt;Assim como as rotas, os velhos &lt;code&gt;HttpInterceptors&lt;/code&gt; (que interceptam requisições de API e também eram classes verbosas) viraram funções puras. Em qualquer sistema corporativo, injetar o &lt;em&gt;Bearer Token&lt;/em&gt; de autenticação em todas as chamadas HTTP é regra. Olha como esse código ficou absurdamente simples e direto agora:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authInterceptor&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;HttpInterceptorFn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;next&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;authService&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;AuthService&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Injeção fora de uma classe!&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;token&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;authService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getToken&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;requestModificada&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;clone&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
    &lt;span class="na"&gt;setHeaders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;Authorization&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`Bearer &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;token&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;});&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;next&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;requestModificada&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h3&gt;
  
  
  Conclusão
&lt;/h3&gt;

&lt;p&gt;Adotar o &lt;code&gt;inject()&lt;/code&gt; em todo o projeto reduz drasticamente a quantidade de linhas de código, melhora a legibilidade e blinda o seu sistema contra refatorações dolorosas em classes base. É uma mudança de paradigma que separa os projetos legados engessados dos códigos modernos e fluidos.&lt;/p&gt;

&lt;p&gt;E por falar em reduzir código, no nosso próximo artigo da série (&lt;strong&gt;Parte 4&lt;/strong&gt;), vamos sair do TypeScript e olhar para o HTML. Vamos dar o adeus definitivo ao &lt;code&gt;*ngIf&lt;/code&gt; e ao &lt;code&gt;*ngFor&lt;/code&gt;, e entender como o novo &lt;em&gt;Control Flow&lt;/em&gt; e a mágica do &lt;code&gt;@defer&lt;/code&gt; otimizam a renderização de telas pesadas.&lt;/p&gt;

&lt;p&gt;Como está a adoção do &lt;code&gt;inject()&lt;/code&gt; nos projetos de vocês? Ainda preferem o bom e velho construtor ou já abraçaram as propriedades dinâmicas? Comentem aí! 👇&lt;/p&gt;

</description>
      <category>angular</category>
      <category>typescript</category>
      <category>frontend</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
