<?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.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>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>
    <item>
      <title>Migrando um YMS de 5 anos: Do Angular 16 ao 21 (Parte 2) - Roteamento Moderno e o Fim das Classes Guards</title>
      <dc:creator>Erick Gabriel dos Santos Alves</dc:creator>
      <pubDate>Thu, 04 Jun 2026 01:39:58 +0000</pubDate>
      <link>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-2-roteamento-moderno-e-o-fim-das-classes-1j9b</link>
      <guid>https://dev.to/erickg123/migrando-um-yms-de-5-anos-do-angular-16-ao-21-parte-2-roteamento-moderno-e-o-fim-das-classes-1j9b</guid>
      <description>&lt;p&gt;Fala, comunidade dev! 👋&lt;/p&gt;

&lt;p&gt;No primeiro artigo da nossa série sobre a evolução arquitetural de um YMS (do Angular 16 para a versão 21), mostrei como deletamos o &lt;code&gt;app.module.ts&lt;/code&gt; e abraçamos os &lt;em&gt;Standalone Components&lt;/em&gt;. Se você perdeu, recomendo dar uma olhada lá antes de seguir.&lt;/p&gt;

&lt;p&gt;Mas depois de remover o módulo principal, uma dúvida natural surge: como fica o roteamento? Afinal, a navegação de um sistema corporativo gigantesco costuma ser um emaranhado complexo de rotas protegidas e carregamento sob demanda (&lt;em&gt;Lazy Loading&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Neste artigo, vou detalhar como o roteamento no Angular deixou de ser verboso para se tornar uma das APIs mais elegantes do ecossistema Front-end.&lt;/p&gt;




&lt;h3&gt;
  
  
  1. Lazy Loading sem Módulos: Mais direto e eficiente
&lt;/h3&gt;

&lt;p&gt;No passado, para não carregar o YMS inteiro no primeiro clique do usuário, nós usávamos o &lt;em&gt;Lazy Loading&lt;/em&gt; apontando para Módulos. O código era mais ou menos assim:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Antes (Baseado em Módulos):&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&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="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;balanca&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./balanca/balanca.module&lt;/span&gt;&lt;span class="dl"&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;m&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;BalancaModule&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 que nossos componentes são independentes e gerenciam suas próprias dependências, não precisamos mais do intermediário (o módulo). O Angular introduziu o &lt;code&gt;loadComponent&lt;/code&gt; para rotas simples e modernizou o &lt;code&gt;loadChildren&lt;/code&gt; para carregar um arquivo de rotas filhas diretas.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Depois (Standalone):&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="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;routes&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="c1"&gt;// Carregando um único componente preguiçosamente&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&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&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadComponent&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="k"&gt;import&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/dashboard.component&lt;/span&gt;&lt;span class="dl"&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;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;DashboardComponent&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="c1"&gt;// Carregando um grupo de rotas preguiçosamente&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;balanca&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadChildren&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./balanca/balanca.routes&lt;/span&gt;&lt;span class="dl"&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="nx"&gt;BALANCA_ROUTES&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;A mudança parece sutil, mas arquiteturalmente é brilhante. Você carrega apenas a árvore de componentes que a tela exige, potencializando o &lt;em&gt;Tree-Shaking&lt;/em&gt; que discutimos no artigo anterior.&lt;/p&gt;




&lt;h3&gt;
  
  
  2. O Fim das Classes Guards: A verdadeira revolução silenciosa
&lt;/h3&gt;

&lt;p&gt;Se o &lt;em&gt;Lazy Loading&lt;/em&gt; ficou mais limpo, a segurança de rotas sofreu uma transformação radical. Em um YMS, temos dezenas de bloqueios: verificar se o usuário está logado, se ele tem permissão de "Operador de Balança" ou se a Ordem de Pesagem está no status correto para ser acessada.&lt;/p&gt;

&lt;p&gt;Até o Angular 14/15, nós éramos obrigados a criar Classes &lt;em&gt;Guards&lt;/em&gt;. Isso gerava um &lt;em&gt;boilerplate&lt;/em&gt; imenso:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Criar uma classe.&lt;/li&gt;
&lt;li&gt;Usar o decorator &lt;code&gt;@Injectable()&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Implementar a interface &lt;code&gt;CanActivate&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Injetar serviços no &lt;code&gt;constructor&lt;/code&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;O Antes (Verboso e pesado):&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;Injectable&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;providedIn&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;root&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;AuthGuard&lt;/span&gt; &lt;span class="k"&gt;implements&lt;/span&gt; &lt;span class="nx"&gt;CanActivate&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;authService&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;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="nf"&gt;canActivate&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nx"&gt;boolean&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="k"&gt;this&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="nf"&gt;isLoggedIn&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="kc"&gt;true&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;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;navigate&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;]);&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&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;No Angular 21, as classes &lt;em&gt;Guards&lt;/em&gt; foram totalmente substituídas por &lt;strong&gt;Functional Guards&lt;/strong&gt;. &lt;/p&gt;

&lt;p&gt;Uma Guard agora é apenas uma função pura. Para acessar serviços dentro dessa função, o Angular nos deu a mágica função &lt;code&gt;inject()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Depois (Limpo e Direto):&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;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="kd"&gt;const&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;span class="k"&gt;return&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;isLoggedIn&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createUrlTree&lt;/span&gt;&lt;span class="p"&gt;([&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/login&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;h3&gt;
  
  
  3. O Impacto no Arquivo de Rotas
&lt;/h3&gt;

&lt;p&gt;Quando você junta o novo &lt;em&gt;Lazy Loading&lt;/em&gt; com as &lt;em&gt;Functional Guards&lt;/em&gt;, o seu arquivo de definição de rotas deixa de ser uma lista de declarações de classes complexas e passa a ser altamente declarativo e compositivo.&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;APP_ROUTES&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Routes&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="na"&gt;path&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;balanca/ordem-pesagem&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;loadComponent&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="k"&gt;import&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;./ordem-pesagem.component&lt;/span&gt;&lt;span class="dl"&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;c&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;OrdemPesagemComponent&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
    &lt;span class="na"&gt;canActivate&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&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;operadorBalancaGuard&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;// Funções puras, encadeadas!&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;A migração das rotas no nosso sistema exigiu refatorar dezenas de arquivos de &lt;em&gt;Guards&lt;/em&gt;. Porém, ao transformar dezenas de linhas de classes verbosas em simples &lt;em&gt;arrow functions&lt;/em&gt;, a base de código ficou infinitamente mais leve de ler, de dar manutenção e, principalmente, de escrever testes unitários (já que não precisamos mais instanciar classes gigantescas nos testes).&lt;/p&gt;

&lt;p&gt;Essa limpeza extrema nas &lt;em&gt;Guards&lt;/em&gt; só foi possível graças à introdução da função &lt;code&gt;inject()&lt;/code&gt;. E é exatamente ela que vai ser a estrela do nosso próximo artigo, onde vamos explorar como o &lt;code&gt;inject()&lt;/code&gt; mudou a forma como compartilhamos lógica e injeção de dependências em toda a aplicação.&lt;/p&gt;

&lt;p&gt;Você já migrou suas antigas classes Guards para funções? Sentiu diferença na facilidade de manutenção? Deixe seu relato nos comentários! 👇&lt;/p&gt;

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