<?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>Forem: Gustavo Machado</title>
    <description>The latest articles on Forem by Gustavo Machado (@devgustavus).</description>
    <link>https://forem.com/devgustavus</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%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png</url>
      <title>Forem: Gustavo Machado</title>
      <link>https://forem.com/devgustavus</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/devgustavus"/>
    <language>en</language>
    <item>
      <title>🚀 Dica rápida para Angular!
Aprenda a restaurar sufixos automaticamente nos arquivos e deixe seu projeto mais organizado, padronizado e profissional. 💡

Simples de configurar e faz toda diferença no dia a dia!</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Wed, 25 Mar 2026 22:59:33 +0000</pubDate>
      <link>https://forem.com/devgustavus/dica-rapida-para-angular-aprenda-a-restaurar-sufixos-automaticamente-nos-arquivos-e-deixe-seu-5595</link>
      <guid>https://forem.com/devgustavus/dica-rapida-para-angular-aprenda-a-restaurar-sufixos-automaticamente-nos-arquivos-e-deixe-seu-5595</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f" class="crayons-story__hidden-navigation-link"&gt;Restaurando sufixos nos arquivos do Angular.&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devgustavus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus profile" class="crayons-avatar__image" width="229" height="229"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devgustavus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gustavo Machado
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gustavo Machado
                
              
              &lt;div id="story-author-preview-content-3255305" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devgustavus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" class="crayons-avatar__image" alt="" width="229" height="229"&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gustavo Machado&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Mar 25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f" id="article-link-3255305"&gt;
          Restaurando sufixos nos arquivos do Angular.
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/architecture"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;architecture&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/webdev"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;webdev&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/exploding-head-daceb38d627e6ae9b730f36a1e390fca556a4289d5a41abb2c35068ad3e2c4b5.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="24" height="24"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            2 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>angular</category>
      <category>frontend</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Restaurando sufixos nos arquivos do Angular(21).</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Wed, 25 Mar 2026 22:54:58 +0000</pubDate>
      <link>https://forem.com/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f</link>
      <guid>https://forem.com/devgustavus/restaurando-sufixos-nos-arquivos-do-angular-3o2f</guid>
      <description>&lt;h2&gt;
  
  
  Do que se trata os sufixos no Angular?
&lt;/h2&gt;

&lt;p&gt;Os sufixos nos arquivos do Angular (como .component, .service, .module) são convenções de nomenclatura recomendadas pelo &lt;a href="https://angular.dev/style-guide" rel="noopener noreferrer"&gt;Guia de Estilo oficial&lt;/a&gt; para identificar rapidamente a responsabilidade e o tipo de cada arquivo.&lt;/p&gt;

&lt;p&gt;Eles funcionam como metadados visuais, permitindo que você diferencie arquivos com o mesmo nome base e facilitando a busca rápida em IDEs.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como configurar?
&lt;/h2&gt;

&lt;p&gt;Simplesmente vamos copiar este código e colar dentro do campo &lt;code&gt;"schematics": {},&lt;/code&gt; no arquivo &lt;code&gt;angular.json&lt;/code&gt; para que a aplicação gere arquivos com sufixos através de comandos como &lt;code&gt;"ng g c exemplo"&lt;/code&gt;. Copie o código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="nl"&gt;"@schematics/angular:component"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"component"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:directive"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"directive"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:service"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"service"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:guard"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"typeSeparator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:interceptor"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"typeSeparator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:module"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"typeSeparator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:pipe"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"typeSeparator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"@schematics/angular:resolver"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;"typeSeparator"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"."&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Antes:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh74pcd0r1qd8xkktnzv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjh74pcd0r1qd8xkktnzv.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Depois:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzeyj9sdn1unt5w1klsl.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbzeyj9sdn1unt5w1klsl.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;⚠️ A partir dessa alteração sua aplicação já está pronta!&lt;/p&gt;




&lt;h2&gt;
  
  
  Quais/como os arquivos são afetados?
&lt;/h2&gt;

&lt;p&gt;Após as alterações os arquivos irão carregar consigo um &lt;strong&gt;sufixo&lt;/strong&gt; do qual &lt;strong&gt;define e descreve sua devida função&lt;/strong&gt;. Dentro do escopo dos arquivos alterados serão:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;component&lt;/li&gt;
&lt;li&gt;directive&lt;/li&gt;
&lt;li&gt;service&lt;/li&gt;
&lt;li&gt;guard&lt;/li&gt;
&lt;li&gt;interceptor&lt;/li&gt;
&lt;li&gt;module&lt;/li&gt;
&lt;li&gt;pipe&lt;/li&gt;
&lt;li&gt;resolver&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Com sufixos:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpbcvlj8ze0fob1z25vd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxpbcvlj8ze0fob1z25vd.png" alt=" " width="242" height="256"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Sem sufixos:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmr1vqgt9qxr8uozv1ao.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxmr1vqgt9qxr8uozv1ao.png" alt=" " width="241" height="254"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-p/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>architecture</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Publiquei um artigo mostrando como estou iniciando meus projetos com Angular 21 e configurando tudo desde o começo com boas práticas.</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Mon, 09 Feb 2026 14:33:00 +0000</pubDate>
      <link>https://forem.com/devgustavus/publiquei-um-artigo-mostrando-como-estou-iniciando-meus-projetos-com-angular-21-e-configurando-tudo-l88</link>
      <guid>https://forem.com/devgustavus/publiquei-um-artigo-mostrando-como-estou-iniciando-meus-projetos-com-angular-21-e-configurando-tudo-l88</guid>
      <description>&lt;div class="ltag__link"&gt;
  &lt;a href="/devgustavus" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/devgustavus/configuracao-do-angular-21-vitest-eslint-prettier-e-husky-5728" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Configuração do Angular 21 (Vitest, ESLint, Prettier e Husky)&lt;/h2&gt;
      &lt;h3&gt;Gustavo Machado ・ Feb 9&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#angular&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#frontend&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tooling&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#tutorial&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


</description>
      <category>angular</category>
      <category>frontend</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Configuração do Angular 21 (Vitest, ESLint, Prettier e Husky)</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Mon, 09 Feb 2026 14:11:26 +0000</pubDate>
      <link>https://forem.com/devgustavus/configuracao-do-angular-21-vitest-eslint-prettier-e-husky-5728</link>
      <guid>https://forem.com/devgustavus/configuracao-do-angular-21-vitest-eslint-prettier-e-husky-5728</guid>
      <description>&lt;h2&gt;
  
  
  O que são cada item e para que serve?
&lt;/h2&gt;

&lt;p&gt;Confira a definição e função básica de cada item presente neste artigo, que compõe a arquitetura de um projeto Frontend.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feehikx7a5syka1pguw09.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feehikx7a5syka1pguw09.png" alt=" " width="800" height="533"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Vitest
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Um framework de &lt;strong&gt;testes unitários&lt;/strong&gt; e de &lt;strong&gt;integração&lt;/strong&gt; focado em projetos que utilizam Vite. Ele foi criado para ser rápido, simples e totalmente integrado ao ecossistema moderno de Frontend.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  ESLint
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uma ferramenta de &lt;strong&gt;análise estática de código&lt;/strong&gt; (linter) para JavaScript e TypeScript. Analisa automaticamente o código-fonte em busca de erros, padrões problemáticos e inconsistências de estilo antes mesmo da aplicação rodar.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Prettier
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Um formatador de código automático e opinativo para diversas linguagens, como JavaScript, TypeScript, HTML, CSS, JSON, entre outras.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Husky
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Uma ferramenta que permite configurar Git Hooks de forma simples dentro do seu projeto.&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Inicializando um novo projeto Angular 21
&lt;/h2&gt;

&lt;p&gt;Primeiramente vamos criar e configurar um novo projeto na versão 21 do Angular, pois antes da versão 21 do Angular, &lt;strong&gt;muita coisa mudou&lt;/strong&gt;. Por exemplo:&lt;/p&gt;

&lt;h5&gt;
  
  
  Principais:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Zoneless como padrão&lt;/li&gt;
&lt;li&gt;Reactividade e Signals mais maduros&lt;/li&gt;
&lt;li&gt;Vitest substitui Karma/Jasmine&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Outras:
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Melhorias de performance e build&lt;/li&gt;
&lt;li&gt;HttpClient incluído automaticamente&lt;/li&gt;
&lt;li&gt;Suporte a AI no CLI&lt;/li&gt;
&lt;li&gt;Angular Aria (preview)&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  1) Inicializando o projeto e escolhendo Sistema de Estilização
&lt;/h3&gt;

&lt;p&gt;Vamos inicializar o projeto com o nome da sua escolha e escolher o sistema de estilização da sua preferência. Recomendo usar o Tailwind CSS.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng new meu-projeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;⚠️ Neste artigo escolheremos a opção: Tailwind CSS&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3egh2prdw8684a1i8x9l.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3egh2prdw8684a1i8x9l.png" alt=" " width="771" height="235"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  2) Escolhendo tipos de renderização (SPA, SSR e SSG)
&lt;/h3&gt;

&lt;p&gt;Agora escolheremos o tipo de renderização, você pode escolher qual for melhor para você a partir de seus objetivos. Por exemplo:&lt;/p&gt;

&lt;h4&gt;
  
  
  SPA
&lt;/h4&gt;

&lt;h5&gt;
  
  
  ✅ Quando usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Aplicações autenticadas&lt;/li&gt;
&lt;li&gt;Dashboards e painéis administrativos&lt;/li&gt;
&lt;li&gt;Sistemas internos (ERP, CRM)&lt;/li&gt;
&lt;li&gt;Aplicações altamente interativas&lt;/li&gt;
&lt;li&gt;Projetos onde SEO não é prioridade&lt;/li&gt;
&lt;li&gt;Quando se deseja deploy simples e estático&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  ❌ Quando não usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Sites que dependem fortemente de SEO&lt;/li&gt;
&lt;li&gt;Landing pages focadas em ranqueamento&lt;/li&gt;
&lt;li&gt;E-commerces públicos&lt;/li&gt;
&lt;li&gt;Projetos que exigem melhor performance no primeiro carregamento&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SSR
&lt;/h4&gt;

&lt;h5&gt;
  
  
  ✅ Quando usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;E-commerces&lt;/li&gt;
&lt;li&gt;Portais de conteúdo dinâmico&lt;/li&gt;
&lt;li&gt;Aplicações públicas com dados que mudam com frequência&lt;/li&gt;
&lt;li&gt;Projetos que exigem SEO avançado&lt;/li&gt;
&lt;li&gt;Quando é necessário conteúdo atualizado em tempo real por requisição&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  ❌ Quando não usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Sistemas internos autenticados&lt;/li&gt;
&lt;li&gt;Aplicações totalmente estáticas&lt;/li&gt;
&lt;li&gt;Projetos simples onde infraestrutura Node seria excesso&lt;/li&gt;
&lt;li&gt;Quando se deseja hospedagem puramente estática (sem servidor)&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  SSG
&lt;/h4&gt;

&lt;h5&gt;
  
  
  ✅ Quando usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Portfólios&lt;/li&gt;
&lt;li&gt;Blogs&lt;/li&gt;
&lt;li&gt;Landing pages&lt;/li&gt;
&lt;li&gt;Sites institucionais&lt;/li&gt;
&lt;li&gt;Documentações&lt;/li&gt;
&lt;li&gt;Conteúdo que muda com pouca frequência&lt;/li&gt;
&lt;li&gt;Projetos que precisam de SEO e alta performance&lt;/li&gt;
&lt;li&gt;Quando se deseja deploy simples via CDN&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  ❌ Quando não usar
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Conteúdo altamente dinâmico que muda a cada requisição&lt;/li&gt;
&lt;li&gt;Sistemas com dados personalizados por usuário&lt;/li&gt;
&lt;li&gt;Aplicações que dependem de atualização em tempo real&lt;/li&gt;
&lt;li&gt;Projetos com grande volume de rotas dinâmicas imprevisíveis&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Neste artigo escolheremos a opção: n (SPA)&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnt0gwxmdy3tueyjarfr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsnt0gwxmdy3tueyjarfr.png" alt=" " width="800" height="78"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Escolhendo a otimização da IA
&lt;/h3&gt;

&lt;p&gt;Essa etapa é só pra configurar guidelines automáticas de boas práticas do Angular dentro da ferramenta de IA que você usa no editor.&lt;/p&gt;

&lt;p&gt;Não muda nada no funcionamento do projeto.&lt;br&gt;
É só integração com assistente de código.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Neste artigo escolheremos a opção: GitHub Copilot&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feonb3na0mdsc8np9eh6m.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Feonb3na0mdsc8np9eh6m.png" alt=" " width="800" height="187"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Projeto criado!&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  Configurando Vitest
&lt;/h2&gt;

&lt;p&gt;Com o projeto criado, vamos configurar o &lt;strong&gt;Vitest&lt;/strong&gt; para contemplar maior desempenho em seus testes.&lt;/p&gt;
&lt;h3&gt;
  
  
  1) Instalar pacote de cobertura de testes
&lt;/h3&gt;

&lt;p&gt;Por mais que o Vitest já vem instalado como padrão no Angular 21, ele ainda precisa de alguns ajustes para contemplar 100% da sua potencialidade.&lt;/p&gt;

&lt;p&gt;Contudo, vamos instalar o &lt;strong&gt;pacote de cobertura de testes do Vitest&lt;/strong&gt;, assim poderemos visualizar melhor nossos testes unitários.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install -D @vitest/coverage-v8
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Configurar o script de teste com cobertura no Package.json
&lt;/h3&gt;

&lt;p&gt;Agora iremos apenas configurar o script para rodar o teste unitário com cobertura no nosso projeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"test:coverage": "ng test --coverage",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ficará assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v2qj04brn75cb02uf1z.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9v2qj04brn75cb02uf1z.png" alt=" " width="735" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3) Testando o sistema de testes
&lt;/h3&gt;

&lt;p&gt;Para último passo, vamos testar se tudo está funcionando.&lt;/p&gt;

&lt;p&gt;Execute o seguinte comando no CMD:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run test:coverage
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlbt2yvm2rcgcjg1f9sq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Frlbt2yvm2rcgcjg1f9sq.png" alt=" " width="664" height="685"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vá até a pasta "coverage" e acesse o index.html para ver a cobertura atual:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3hzqhlexq9xe4zpgs6y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fz3hzqhlexq9xe4zpgs6y.png" alt=" " width="274" height="280"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8c8sjtwa7hnkxqb2jx3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fw8c8sjtwa7hnkxqb2jx3.png" alt=" " width="800" height="119"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Vitest pronto!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Configurando o ESLint e o Prettier
&lt;/h2&gt;

&lt;p&gt;Partiremos para a configuração do Eslint e o Prettier no projeto. Esta etapa será conjunta, pois ambas as ferramentas deverão se integrar em conjunto.&lt;/p&gt;

&lt;h3&gt;
  
  
  1) Adicionar e Configurar o ESLint
&lt;/h3&gt;

&lt;p&gt;Começamos instalando o ESLint no projeto Angular. Isso irá criar um arquivo eslint.config.js no seu diretório raiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng add @angular-eslint/schematics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2) Adicionar e configurar o Prettier
&lt;/h3&gt;

&lt;p&gt;Agora, vamos instalar o Prettier junto com as recomendadas integrações com o ESLint.&lt;/p&gt;

&lt;p&gt;Instale o prettier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também instale o pretty-quick:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev pretty-quick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;code&gt;pretty-quick&lt;/code&gt; é bem útil porque ele roda só nos arquivos staged, e não no projeto inteiro.&lt;/p&gt;

&lt;p&gt;Depois instale os plugins para compatibilidade com o ESLint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev eslint-config-prettier eslint-plugin-prettier

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

&lt;/div&gt;



&lt;p&gt;Crie um arquivo chamado &lt;code&gt;.prettierrc&lt;/code&gt; no diretório raiz do seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "singleQuote": true,
  "trailingComma": "all",
  "semi": true,
  "bracketSpacing": true,
  "arrowParens": "always",
  "endOfLine": "auto",
  "htmlWhitespaceSensitivity": "ignore",
  "embeddedLanguageFormatting": "auto"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo chamado &lt;code&gt;.prettierignore&lt;/code&gt; para que o prettier os ignore e não os formate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package.json
package-lock.json
dist
node_modules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3) Configuração da integração do ESLint
&lt;/h3&gt;

&lt;p&gt;Copie e cole o seguinte código no arquivo &lt;code&gt;eslint.config.js&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;// @ts-nocheck
const eslint = require("@eslint/js");
const tseslint = require("typescript-eslint");
const angular = require("angular-eslint");
const prettierPlugin = require("eslint-plugin-prettier");
const prettierConfig = require("eslint-config-prettier");

module.exports = tseslint.config(
  {
    files: ["**/*.ts"],
    extends: [
      eslint.configs.recommended,
      ...tseslint.configs.recommended,
      ...tseslint.configs.stylistic,
      ...angular.configs.tsRecommended,
      prettierConfig,
    ],
    plugins: {
      prettier: prettierPlugin,
    },
    processor: angular.processInlineTemplates,
    rules: {
      "@angular-eslint/directive-selector": [
        "error",
        {
          type: "attribute",
          prefix: "app",
          style: "camelCase",
        },
      ],
      "@angular-eslint/component-selector": [
        "error",
        {
          type: "element",
          prefix: "app",
          style: "kebab-case",
        },
      ],
      "prettier/prettier": [
        "error",
        {
          endOfLine: "auto",
        },
      ],
      "@typescript-eslint/no-explicit-any": "error", // Forbid usage of 'any'
    },
  },
  {
    files: ["**/*.html"],
    extends: [
      ...angular.configs.templateRecommended,
      ...angular.configs.templateAccessibility,
    ],
    rules: {},
  },
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4) Configuração de scripts no &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nesta etapas vamos automatizar alguns comandos da aplicação para serem executadas através de scripts no &lt;code&gt;package.json&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;"lint": "ng lint",
"pretty-quick": "pretty-quick --staged",
"lint:fix": "ng lint --fix",
"format": "prettier --write .",
"format:staged": "pretty-quick --staged",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Remova as configurações do &lt;code&gt;Prettier&lt;/code&gt; no &lt;code&gt;package.json&lt;/code&gt;, que foram previamente adicionadas pelo próprio Angular como padrão:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtewgeyss68kfkmxq7pi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqtewgeyss68kfkmxq7pi.png" alt=" " width="340" height="288"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora tente rodar o comando do &lt;code&gt;lint&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;npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso erros de formatação aparecer do &lt;code&gt;Prettier&lt;/code&gt;, rode o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Prettier e Eslint prontos!&lt;/strong&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  Instalando e configurando o husky
&lt;/h2&gt;

&lt;p&gt;No passo 5, vamos instalar e configurar o husky para podermos executar as ferramentas anteriores ao fazer &lt;code&gt;commits&lt;/code&gt; e &lt;code&gt;pushes&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;npx husky-init &amp;amp;&amp;amp; npm install

#ou

npx husky-init; npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria um arquivo &lt;code&gt;.husky&lt;/code&gt; e um arquivo de hook (gancho) para &lt;code&gt;pre-commit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora edite o arquivo de &lt;code&gt;pre-commit&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;#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run format:staged
npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além do &lt;code&gt;pre-commit&lt;/code&gt;, adicionaremos também um &lt;code&gt;pre-push&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;npx husky add .husky/pre-push "npm run test"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O arquivo irá ter as seguintes configurações (este arquivo executará testes unitários nos pushes do GIT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Husky pronto!&lt;/strong&gt;&lt;/p&gt;




&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-pontes/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>frontend</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Olá a todos! Acabei de publicar um artigo pra galera que tem um HD como backup de dados pessoais e etc.
Sempre é bom estar verificando a saúde do seu HD para não ter surpresas! 😁👍

Se possível dá uma força curtindo o post. Valeu galera!</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Fri, 26 Dec 2025 03:04:24 +0000</pubDate>
      <link>https://forem.com/devgustavus/ola-a-todos-acabei-de-publicar-um-artigo-pra-galera-que-tem-um-hd-como-backup-de-dados-pessoais-e-2ci3</link>
      <guid>https://forem.com/devgustavus/ola-a-todos-acabei-de-publicar-um-artigo-pra-galera-que-tem-um-hd-como-backup-de-dados-pessoais-e-2ci3</guid>
      <description>&lt;p&gt;

&lt;/p&gt;
&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c" class="crayons-story__hidden-navigation-link"&gt;Você deve testar a Saúde do seu HD!&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devgustavus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devgustavus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gustavo Machado
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gustavo Machado
                
              
              &lt;div id="story-author-preview-content-3127498" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devgustavus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gustavo Machado&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Dec 26 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c" id="article-link-3127498"&gt;
          Você deve testar a Saúde do seu HD!
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/hardware"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;hardware&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/harddisk"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;harddisk&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/resources"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;resources&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            5 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;




</description>
      <category>hardware</category>
      <category>harddisk</category>
      <category>tutorial</category>
      <category>resources</category>
    </item>
    <item>
      <title>Você deve testar a Saúde do seu HD!</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Fri, 26 Dec 2025 03:00:54 +0000</pubDate>
      <link>https://forem.com/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c</link>
      <guid>https://forem.com/devgustavus/voce-deve-testar-a-saude-do-seu-hd-5d3c</guid>
      <description>&lt;p&gt;Ao comprar qualquer dispositivo de armazenamento permanente — como HDs, SSDs (NVMe ou SATA) ou unidades externas — é altamente recomendável realizar uma &lt;strong&gt;verificação de saúde&lt;/strong&gt; antes de colocá-lo em uso contínuo. Esse processo ajuda a &lt;strong&gt;identificar possíveis falhas&lt;/strong&gt; de fabricação, &lt;strong&gt;evitar perda de dados&lt;/strong&gt; e, se necessário, acionar a garantia do fabricante.&lt;/p&gt;

&lt;p&gt;Ao longo deste artigo, veremos passo a passo como realizar essa verificação na prática. Utilizaremos um &lt;strong&gt;HD externo&lt;/strong&gt; como exemplo, mas as mesmas técnicas e ferramentas podem ser aplicadas a outros tipos de dispositivos de armazenamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;⚠️ Neste artigo, vamos analisar e testar na pratica um HD externo do modelo: &lt;u&gt;HD Externo 1TB 1000GB USB Type C 3.1 Slim Vault Exbom HDE-S1TA&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65610d9rixfgwjtg12hr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F65610d9rixfgwjtg12hr.png" alt=" " width="420" height="420"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Sumário
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;🔍 Verificação básica (sem instalar nada)&lt;/li&gt;
&lt;li&gt;🧠 Verificar a saúde do HD (SMART)&lt;/li&gt;
&lt;li&gt;🧪 Teste de superfície (lento, porém completo)&lt;/li&gt;
&lt;li&gt;🤖 Considerações Finais do ChatGPT&lt;/li&gt;
&lt;li&gt;💡 Boas Práticas &amp;amp; Dicas&lt;/li&gt;
&lt;/ol&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  1) 🔍 Verificação básica (sem instalar nada)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Checar erros pelo próprio Windows.
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Conecte o HD externo&lt;/li&gt;
&lt;li&gt;Abra Explorador de Arquivos&lt;/li&gt;
&lt;li&gt;Clique com o botão direito no HD → Propriedades&lt;/li&gt;
&lt;li&gt;Aba Ferramentas → Verificar&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;👉 Isso procura erros no sistema de arquivos (não testa o disco fisicamente a fundo).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31zznjdf2oklapwvp3wq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F31zznjdf2oklapwvp3wq.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS:&lt;/strong&gt; Na maioria das vezes, quando seu HD for novo, o Windows não encontrará nenhum erro de imediato. &lt;u&gt;Mesmo assim, continue com a verificação!&lt;/u&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fco6td2rpsxmvamqtqljb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fco6td2rpsxmvamqtqljb.png" alt=" " width="541" height="244"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  2) 🧠 Verificar a saúde do HD (SMART)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Checar erros por software (CrystalDiskInfo).
&lt;/h3&gt;

&lt;p&gt;HDs e SSDs possuem dados internos chamados SMART, que indicam:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;setores defeituosos&lt;/li&gt;
&lt;li&gt;erros de leitura&lt;/li&gt;
&lt;li&gt;desgaste&lt;/li&gt;
&lt;li&gt;risco de falha&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;🔧 CrystalDiskInfo (RECOMENDADO)&lt;/p&gt;

&lt;p&gt;🔹 Gratuito | Leve | Muito usado&lt;/p&gt;

&lt;p&gt;📥 Site:&lt;br&gt;
&lt;a href="https://crystalmark.info/en/software/crystaldiskinfo/" rel="noopener noreferrer"&gt;https://crystalmark.info/en/software/crystaldiskinfo/&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 O que observar:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Status:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;🟢 Good / Bom → saudável&lt;/li&gt;
&lt;li&gt;🟡 Caution / Atenção → possível problema&lt;/li&gt;
&lt;li&gt;🔴 Bad → risco alto&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  3 Principais indicadores de saúde:
&lt;/h4&gt;

&lt;p&gt;1️⃣ Reallocated Sectors Count (Setores realocados)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;📊 Como interpretar:&lt;/li&gt;
&lt;li&gt;0 → ✅ Perfeito&lt;/li&gt;
&lt;li&gt;1 a poucos setores → ⚠️ Alerta (não é normal em HD novo)&lt;/li&gt;
&lt;li&gt;Número aumentando → 🚨 HD se degradando&lt;/li&gt;
&lt;li&gt;Muitos setores → 💀 Falha iminente&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;2️⃣ Current Pending Sector (Setores pendentes)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;São setores que o HD tentou ler, falhou e deixou “em espera” para decidir se são realmente defeituosos&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;➡️ É um sinal pior que Reallocated, porque o erro é atual.&lt;/li&gt;
&lt;li&gt;📊 Como interpretar:&lt;/li&gt;
&lt;li&gt;0 → ✅ OK&lt;/li&gt;
&lt;li&gt;Qualquer valor &amp;gt; 0 → 🚨 Problema ativo&lt;/li&gt;
&lt;li&gt;Se aumentar → ⚠️ Degradação acelerada&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;3️⃣ Uncorrectable Errors (Erros irrecuperáveis)&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;São erros em que o HD tentou corrigir falhou e perdeu dados&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;➡️ Esse é um dos indicadores mais graves.&lt;/li&gt;
&lt;li&gt;📊 Como interpretar:&lt;/li&gt;
&lt;li&gt;0 → ✅ Ideal&lt;/li&gt;
&lt;li&gt;Qualquer valor &amp;gt; 0 → 🚨 Perda de dados já aconteceu&lt;/li&gt;
&lt;li&gt;Valor crescendo → 💀 Falha iminente&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💻 Meu HD:
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatnawk70c7drz0ea804h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fatnawk70c7drz0ea804h.png" alt=" " width="671" height="691"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  🔍 Análise dos indicadores críticos (os mais importantes):
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🔹 Reallocated Sectors Count&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valor bruto: 000000000000 → 0 setores&lt;/li&gt;
&lt;li&gt;✅ Perfeito&lt;/li&gt;
&lt;li&gt;Nenhum setor defeituoso precisou ser substituído.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔹 Current Pending Sector&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valor bruto: 000000000000 → 0 setores pendentes&lt;/li&gt;
&lt;li&gt;✅ Perfeito&lt;/li&gt;
&lt;li&gt;Não há erros de leitura em andamento.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;🔹 Uncorrectable Errors&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Valor bruto: 000000000000 → 0 erros&lt;/li&gt;
&lt;li&gt;✅ Perfeito&lt;/li&gt;
&lt;li&gt;Nenhuma perda de dados registrada.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Se aparecer qualquer valor diferente de zero nesses itens → sinal de alerta.&lt;/p&gt;




&lt;h2&gt;
  
  
  3) 🧪 Teste de superfície (lento, porém completo)
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Esse teste lê todo o disco procurando setores defeituosos.
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;🔧 HD Tune&lt;/p&gt;

&lt;p&gt;🔹 Versão Gratuita &amp;amp; Versão PRO | Muito usado&lt;/p&gt;

&lt;p&gt;📥 Site:&lt;br&gt;
&lt;a href="https://www.hdtune.com/download.html" rel="noopener noreferrer"&gt;https://www.hdtune.com/download.html&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS:&lt;/strong&gt; A versão PRO possui alguns dias de teste grátis, contudo você pode baixar para testar seu armazenamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  📌 O que observar:
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h4&gt;
  
  
  Passos:
&lt;/h4&gt;

&lt;ul&gt;
&lt;li&gt;Conecte seu HD na sua máquina

&lt;ul&gt;
&lt;li&gt;Se for externo, sempre utilize as entradas USB da placa mãe&lt;/li&gt;
&lt;li&gt;Caso o HD externo tiver suporte para USB 3.0, faça o teste por ela&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Instale e execute o software HD Tune&lt;/li&gt;

&lt;li&gt;Verifique as informações do seu armazenamento:&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70d4gdkio5ab01zvdakh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F70d4gdkio5ab01zvdakh.png" alt=" " width="800" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique o Benchmark do seu HD:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy3trdbb1r9o1f35j268.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqy3trdbb1r9o1f35j268.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Verifique a Saúde do seu HD:&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44p93n0irriwvhnavgpo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F44p93n0irriwvhnavgpo.png" alt=" " width="800" height="326"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Realize o "Error Scan" no seu HD:

&lt;ul&gt;
&lt;li&gt;Caso queira uma verificação mais rápida (superficial), habilite o "Quick Scan"&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmces1cn3r3h0a6nxmtc6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fmces1cn3r3h0a6nxmtc6.png" alt=" " width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  📖 Resultados:
&lt;/h4&gt;

&lt;p&gt;&lt;strong&gt;🔍 INFO (informações gerais)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Capacidade: 1 TB → OK&lt;/li&gt;
&lt;li&gt;Interface: SATA 3 (6.0 Gb/s) via USB → OK&lt;/li&gt;
&lt;li&gt;SMART: suportado → OK&lt;/li&gt;
&lt;li&gt;Sistema de arquivos: exFAT → normal para HD externo&lt;/li&gt;
&lt;li&gt;Alignment: 2 MB → ✔️ alinhamento correto&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Nada fora do padrão aqui.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;❤️ HEALTH (Saúde / SMART) - Indicadores críticos:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Reallocated Sector Count: 0 ✅&lt;/li&gt;
&lt;li&gt;Current Pending Sector: 0 ✅&lt;/li&gt;
&lt;li&gt;Uncorrectable Errors: 0 ✅&lt;/li&gt;
&lt;li&gt;Interface CRC Errors: 0 ✅
Outros pontos:&lt;/li&gt;
&lt;li&gt;Power-On Hours: 1 hora → praticamente novo&lt;/li&gt;
&lt;li&gt;Start/Stop Count: 14 → normal&lt;/li&gt;
&lt;li&gt;G-Sense Error Rate: 0 → nunca sofreu impacto&lt;/li&gt;
&lt;li&gt;Temperatura: 39 °C → excelente&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;🟢 TODOS os atributos estão “OK”&lt;br&gt;
👉 Nenhum sinal de desgaste, defeito ou erro oculto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;📊 BENCHMARK (Desempenho) - Resultados:&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Velocidade média: ~40,6 MB/s&lt;/li&gt;
&lt;li&gt;Máxima: ~41,6 MB/s&lt;/li&gt;
&lt;li&gt;Mínima: ~32,9 MB/s&lt;/li&gt;
&lt;li&gt;Access Time: 16,3 ms&lt;/li&gt;
&lt;li&gt;Burst Rate: ~40,7 MB/s
Interpretação (importante) - Esse HD é:&lt;/li&gt;
&lt;li&gt;5400 RPM&lt;/li&gt;
&lt;li&gt;USB&lt;/li&gt;
&lt;li&gt;Provavelmente SMR&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;➡️ Esses valores são NORMAIS e esperados para esse tipo de HD externo.&lt;/p&gt;

&lt;p&gt;📌 As pequenas quedas no gráfico (os “dentinhos”) são:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;reposicionamento do braço mecânico&lt;/li&gt;
&lt;li&gt;cache sendo esvaziado&lt;/li&gt;
&lt;li&gt;absolutamente normais&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Não são setores defeituosos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;🧪 ERROR SCAN (Teste de superfície)&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🟢 100% VERDE&lt;/li&gt;
&lt;li&gt;Blocos danificados: 0.0%&lt;/li&gt;
&lt;li&gt;Nenhum setor defeituoso encontrado&lt;/li&gt;
&lt;li&gt;Leitura limpa em toda a área testada&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;👉 Esse é o teste físico mais importante — passou com louvor.&lt;/p&gt;




&lt;h2&gt;
  
  
  4) 🤖 Considerações Finais do ChatGPT
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  Ao incluir todos estes dados e parametros para o ChatGPT analisar, ele deu um veredito...
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  ✅ CONCLUSÃO FINAL (bem direta)
&lt;/h3&gt;

&lt;h4&gt;
  
  
  🟢 SEU HD ESTÁ IMPECÁVEL
&lt;/h4&gt;

&lt;p&gt;✔️ Nenhum setor defeituoso&lt;br&gt;
✔️ Nenhum erro SMART&lt;br&gt;
✔️ Nenhuma perda de dados&lt;br&gt;
✔️ Desempenho dentro do esperado&lt;br&gt;
✔️ HD novo e saudável&lt;/p&gt;




&lt;h2&gt;
  
  
  5) 💡 Boas Práticas &amp;amp; Dicas
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  🚨 Sinais físicos de problema (mesmo se software disser OK)
&lt;/h3&gt;

&lt;p&gt;Fique atento se o HD:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;faz cliques (“tec tec”)&lt;/li&gt;
&lt;li&gt;demora muito para abrir pastas&lt;/li&gt;
&lt;li&gt;desconecta sozinho&lt;/li&gt;
&lt;li&gt;trava o sistema ao copiar arquivos&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;⚠️ Esses sinais não são normais, mesmo que SMART diga “Bom”.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OBS:&lt;/strong&gt; O HD pode fazer cliques (“tec tec”), caso o suprimento de energia for pouca. Geralmente as USBs que não são diretas da "Placa Mãe" do PC, costumam ter baixo desempenho de energia.&lt;/p&gt;

&lt;h3&gt;
  
  
  🟢 Boas Práticas:
&lt;/h3&gt;

&lt;p&gt;Utilize seu HD da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ejeta corretamente:

&lt;ul&gt;
&lt;li&gt;Nunca retire o cabo de energia antes de ejetar&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;evita impactos:

&lt;ul&gt;
&lt;li&gt;O HD possui um disco giratório sensível&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;controla temperatura&lt;/li&gt;

&lt;li&gt;faz backup:

&lt;ul&gt;
&lt;li&gt;Um único HD nunca é confiável, portanto faça redundância&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;monitora SMART&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;👉 Seu HD pode durar 5–10 anos facilmente.&lt;/p&gt;




&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-pontes/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>hardware</category>
      <category>harddisk</category>
      <category>tutorial</category>
      <category>resources</category>
    </item>
    <item>
      <title>Olá a todos! Fiz um artigo passo a passo para configurar ferramentas de arquitetura para o angular 20, como o prettier, ESlint e o husky!</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Tue, 26 Aug 2025 01:47:41 +0000</pubDate>
      <link>https://forem.com/devgustavus/ola-a-todos-fiz-um-artigo-passo-a-passo-para-configurar-ferramentas-de-arquitetura-para-o-angular-260d</link>
      <guid>https://forem.com/devgustavus/ola-a-todos-fiz-um-artigo-passo-a-passo-para-configurar-ferramentas-de-arquitetura-para-o-angular-260d</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35" class="crayons-story__hidden-navigation-link"&gt;Configurando ESLint + Prettier + Husky no Angular(20)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devgustavus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devgustavus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gustavo Machado
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gustavo Machado
                
              
              &lt;div id="story-author-preview-content-2785176" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devgustavus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gustavo Machado&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Aug 26 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35" id="article-link-2785176"&gt;
          Configurando ESLint + Prettier + Husky no Angular(20)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/codequality"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;codequality&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tooling"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tooling&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/tutorial"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;tutorial&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;2&lt;span class="hidden s:inline"&gt; reactions&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              3&lt;span class="hidden s:inline"&gt; comments&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>angular</category>
      <category>typescript</category>
      <category>linting</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Configurando ESLint + Prettier + Husky no Angular(20)</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Tue, 26 Aug 2025 01:44:51 +0000</pubDate>
      <link>https://forem.com/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35</link>
      <guid>https://forem.com/devgustavus/configurando-eslint-prettier-husky-no-angular20-2j35</guid>
      <description>&lt;h2&gt;
  
  
  O que são cada item e para que serve?
&lt;/h2&gt;

&lt;p&gt;Confira a definição e função básica de cada item presente neste artigo, que compõe a arquitetura de um projeto Frontend.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. ESLint
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmwffr1jbbtp9jb9qi3h.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvmwffr1jbbtp9jb9qi3h.png" alt=" " width="800" height="218"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Definição
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;É um linter (ou seja, um analisador de código) que percorre o código procurando por problemas.&lt;/li&gt;
&lt;li&gt;Baseia-se em regras configuráveis, que podem ser habilitadas ou desativadas conforme a necessidade do projeto.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Função
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Garantir qualidade do código&lt;/li&gt;
&lt;li&gt;Manter consistência&lt;/li&gt;
&lt;li&gt;Prevenir bugs&lt;/li&gt;
&lt;li&gt;Melhorar a manutenção&lt;/li&gt;
&lt;li&gt;Integração com o fluxo de trabalho&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2. Prettier
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5t1wm3vy1tscad3la8r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs5t1wm3vy1tscad3la8r.png" alt=" " width="640" height="269"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Definição
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;O Prettier é um formatador de código opinativo.&lt;/li&gt;
&lt;li&gt;Ele não analisa regras de qualidade ou possíveis bugs como o ESLint.&lt;/li&gt;
&lt;li&gt;O foco dele é padronizar a formatação do código automaticamente, sem precisar discutir estilo no time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Função
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Formatação consistente

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;em&gt;Decide automaticamente coisas como:&lt;/em&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Tamanho da indentação (2 ou 4 espaços)&lt;/li&gt;
&lt;li&gt;Uso de ponto e vírgula no final de linhas&lt;/li&gt;
&lt;li&gt;Aspas simples ou duplas&lt;/li&gt;
&lt;li&gt;Quebra de linha em funções longas&lt;/li&gt;
&lt;li&gt;Espaços em branco e vírgulas finais&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Economizar tempo&lt;/li&gt;

&lt;li&gt;Integração automática&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  3. Husky
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36fne56l00ydfkmwso4k.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F36fne56l00ydfkmwso4k.png" alt=" " width="650" height="300"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h5&gt;
  
  
  Definição
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;O Husky é uma ferramenta que permite configurar Git hooks facilmente.&lt;/li&gt;
&lt;li&gt;Git hooks são scripts que o Git executa automaticamente em momentos específicos, como antes de um commit (pre-commit) ou antes de um push (pre-push).&lt;/li&gt;
&lt;/ul&gt;

&lt;h5&gt;
  
  
  Função
&lt;/h5&gt;

&lt;ul&gt;
&lt;li&gt;Garantir qualidade no commit

&lt;ul&gt;
&lt;li&gt;Rodar o ESLint e o Prettier antes de permitir o commit.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Rodar testes automaticamente

&lt;ul&gt;
&lt;li&gt;Impedir que alguém faça commit/push se os testes quebraram.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;Aplicar verificações personalizadas

&lt;ul&gt;
&lt;li&gt;Conferir mensagens de commit.&lt;/li&gt;
&lt;li&gt;Rodar ferramentas de segurança ou de build.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  Passos para instalação das ferramentas no Angular:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Adicionar e Configurar o ESLint&lt;/li&gt;
&lt;li&gt;Adicionar e configurar o Prettier&lt;/li&gt;
&lt;li&gt;Configuração da integração do ESLint&lt;/li&gt;
&lt;li&gt;Configuração de scripts no &lt;code&gt;package.json&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Instalar e configurar o husky&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Adicionar e Configurar o ESLint
&lt;/h3&gt;

&lt;p&gt;Começamos instalando o ESLint no projeto Angular. Isso irá criar um arquivo &lt;code&gt;eslint.config.js&lt;/code&gt; no seu diretório raiz.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;ng add @angular-eslint/schematics
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Adicionar e configurar o Prettier
&lt;/h3&gt;

&lt;p&gt;Agora, vamos instalar o Prettier junto com as recomendadas integrações com o ESLint.&lt;/p&gt;

&lt;p&gt;Instale o prettier:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Também instale o &lt;code&gt;pretty-quick&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;npm install --save-dev pretty-quick
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;👉 &lt;code&gt;pretty-quick&lt;/code&gt; é bem útil porque ele roda só nos arquivos staged, e não no projeto inteiro.&lt;/p&gt;

&lt;p&gt;Depois instale os plugins para compatibilidade com o ESLint:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev eslint-config-prettier eslint-plugin-prettier
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo chamado &lt;code&gt;.prettierrc&lt;/code&gt; no diretório raiz do seu projeto:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "printWidth": 100,
  "tabWidth": 2,
  "useTabs": false,
  "singleQuote": true,
  "trailingComma": "all",
  "semi": true,
  "bracketSpacing": true,
  "arrowParens": "always",
  "endOfLine": "auto",
  "htmlWhitespaceSensitivity": "ignore",
  "embeddedLanguageFormatting": "auto"
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Crie um arquivo chamado &lt;code&gt;.prettierignore&lt;/code&gt; para que o prettier os ignore e não os formate:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;package.json
package-lock.json
dist
node_modules
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  3. Configuração da integração do ESLint
&lt;/h3&gt;

&lt;p&gt;Copie e cole o seguinte código no arquivo &lt;code&gt;eslint.config.js&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;// @ts-nocheck
const eslint = require("@eslint/js");
const tseslint = require("typescript-eslint");
const angular = require("angular-eslint");
const prettierPlugin = require("eslint-plugin-prettier");
const prettierConfig = require("eslint-config-prettier");

module.exports = tseslint.config(
  {
    files: ["**/*.ts"],
    extends: [
      eslint.configs.recommended,
      ...tseslint.configs.recommended,
      ...tseslint.configs.stylistic,
      ...angular.configs.tsRecommended,
      prettierConfig,
    ],
    plugins: {
      prettier: prettierPlugin,
    },
    processor: angular.processInlineTemplates,
    rules: {
      "@angular-eslint/directive-selector": [
        "error",
        {
          type: "attribute",
          prefix: "app",
          style: "camelCase",
        },
      ],
      "@angular-eslint/component-selector": [
        "error",
        {
          type: "element",
          prefix: "app",
          style: "kebab-case",
        },
      ],
      "prettier/prettier": [
        "error",
        {
          endOfLine: "auto",
        },
      ],
      "@typescript-eslint/no-explicit-any": "error", // Forbid usage of 'any'
    },
  },
  {
    files: ["**/*.html"],
    extends: [
      ...angular.configs.templateRecommended,
      ...angular.configs.templateAccessibility,
    ],
    rules: {},
  },
);
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  4. Configuração de scripts no &lt;code&gt;package.json&lt;/code&gt;
&lt;/h3&gt;

&lt;p&gt;Nesta etapas vamos automatizar alguns comandos da aplicação para serem executadas através de scripts no &lt;code&gt;package.json&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;"lint": "ng lint",
"pretty-quick": "pretty-quick --staged",
"lint:fix": "ng lint --fix",
"format": "prettier --write .",
"format:staged": "pretty-quick --staged",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora tente rodar o comando do &lt;code&gt;lint&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;npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso erros de formatação aparecer do &lt;code&gt;Prettier&lt;/code&gt;, rode o comando:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run format
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Instalar e configurar o husky
&lt;/h3&gt;

&lt;p&gt;No passo 5, vamos instalar e configurar o husky para podermos executar as ferramentas anteriores ao fazer &lt;code&gt;commits&lt;/code&gt; e &lt;code&gt;pushes&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;npx husky-init &amp;amp;&amp;amp; npm install

#ou

npx husky-init; npm install
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Isso cria um arquivo &lt;code&gt;.husky&lt;/code&gt; e um arquivo de hook (gancho) para &lt;code&gt;pre-commit&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Agora edite o arquivo de &lt;code&gt;pre-commit&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;#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run format:staged
npm run lint
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Além do &lt;code&gt;pre-commit&lt;/code&gt;, adicionaremos também um &lt;code&gt;pre-push&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;npx husky add .husky/pre-push "npm run test"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O arquivo irá ter as seguintes configurações (este arquivo executará testes unitários nos pushes do GIT):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#!/usr/bin/env sh
. "$(dirname -- "$0")/_/husky.sh"

npm run test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-pontes/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>angular</category>
      <category>codequality</category>
      <category>tooling</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Olá, pessoal! Espero que este passo a passo para configurar o Jest no angular ajudem vocês. Caso algo estiver incoerente, peço que me avisem se possível. Muito obrigado e espero que gostem!</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Wed, 30 Jul 2025 02:11:43 +0000</pubDate>
      <link>https://forem.com/devgustavus/ola-pessoal-espero-que-este-passo-a-passo-para-configurar-o-jest-no-angular-ajudem-voces-caso-5366</link>
      <guid>https://forem.com/devgustavus/ola-pessoal-espero-que-este-passo-a-passo-para-configurar-o-jest-no-angular-ajudem-voces-caso-5366</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devgustavus/instalando-jest-no-angular20-3dc5" class="crayons-story__hidden-navigation-link"&gt;Instalando Jest no Angular(20)&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devgustavus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devgustavus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gustavo Machado
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gustavo Machado
                
              
              &lt;div id="story-author-preview-content-2740663" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devgustavus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gustavo Machado&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devgustavus/instalando-jest-no-angular20-3dc5" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Jul 30 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devgustavus/instalando-jest-no-angular20-3dc5" id="article-link-2740663"&gt;
          Instalando Jest no Angular(20)
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/development"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;development&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/angular"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;angular&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/unittest"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;unittest&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/frontend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;frontend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devgustavus/instalando-jest-no-angular20-3dc5" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/sparkle-heart-5f9bee3767e18deb1bb725290cb151c25234768a0e9a2bd39370c382d02920cf.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devgustavus/instalando-jest-no-angular20-3dc5#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              1&lt;span class="hidden s:inline"&gt; comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            3 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>development</category>
      <category>angular</category>
      <category>unittest</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Instalando Jest no Angular(20)</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Wed, 30 Jul 2025 02:09:21 +0000</pubDate>
      <link>https://forem.com/devgustavus/instalando-jest-no-angular20-3dc5</link>
      <guid>https://forem.com/devgustavus/instalando-jest-no-angular20-3dc5</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Jest e para que serve?
&lt;/h2&gt;

&lt;p&gt;O Jest é um framework de testes em JavaScript criado pelo Facebook, amplamente utilizado em projetos com React, mas que também pode ser facilmente integrado a aplicações Angular, Node.js, Vue, entre outras.&lt;/p&gt;

&lt;p&gt;Sua principal função é permitir a criação, execução e validação de testes automatizados, especialmente os testes unitários e testes de snapshot, de forma rápida e confiável.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zaey0n1897a6eai0yv6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F4zaey0n1897a6eai0yv6.png" alt=" " width="600" height="315"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Site oficial:
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://jestjs.io" rel="noopener noreferrer"&gt;https://jestjs.io&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Passos para configuração do Jest no Angular:
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Desinstalar o Karma e Jasmine do projeto;&lt;/li&gt;
&lt;li&gt;Configure scripts de execução de testes no package.json;&lt;/li&gt;
&lt;li&gt;Remover o objeto de teste do angular.json;&lt;/li&gt;
&lt;li&gt;Instalar o pacote do Jest;&lt;/li&gt;
&lt;li&gt;Configurar o jest no projeto;&lt;/li&gt;
&lt;li&gt;Criar/configurar arquivo setup.jest.ts;&lt;/li&gt;
&lt;li&gt;Atualizar o arquivo tsconfig.spec.json;&lt;/li&gt;
&lt;li&gt;Ative o esModuleInterop;&lt;/li&gt;
&lt;li&gt;Execute o jest/testes unitários.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  1. Desinstalar o Karma e Jasmine do projeto:
&lt;/h3&gt;

&lt;p&gt;Primeiro devemos desinstalar o Karma e Jasmine do projeto. O Karma e Jasmine são ferramentas de testes que já vem configurados inicialmente nos projetos angular, sendo o Jasmine um framework e o Karma um "Test Runner".&lt;/p&gt;

&lt;p&gt;Execute o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm remove @types/jasmine jasmine-core karma karma-chrome-launcher karma-coverage karma-jasmine karma-jasmine-html-reporter
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  2. Configure scripts de execução de testes no package.json:
&lt;/h3&gt;

&lt;p&gt;Agora devemos configurar o package.json para reconhecer e executar comandos básicos e essenciais de teste do Jest.&lt;/p&gt;

&lt;p&gt;Copie e cole os seguintes scripts no package.json:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"test": "jest",
"test:watch": "jest --watch",
"test:coverage": "jest --coverage",
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsn7l062jnpgu5pj7dpfq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fsn7l062jnpgu5pj7dpfq.png" alt=" " width="800" height="283"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Remover o objeto de teste do angular.json:
&lt;/h3&gt;

&lt;p&gt;Neste passo, vamos remover o objeto de teste do angular.json, cujo o mesmo faz parte da configuração do Karma e Jasmine, do qual foram removidos.&lt;/p&gt;

&lt;p&gt;Remova as seguintes linhas em vermelho:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fot19k8ei51w5a2ppe81w.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fot19k8ei51w5a2ppe81w.png" alt=" " width="714" height="917"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Instalar o pacote do Jest:
&lt;/h3&gt;

&lt;p&gt;Finalmente instalaremos a dependência do Jest no projeto.&lt;/p&gt;

&lt;p&gt;Execute o seguinte comando no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm install --save-dev @types/jest jest-preset-angular
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  5. Configurar o jest no projeto:
&lt;/h3&gt;

&lt;p&gt;Agora vamos configurar o jest no Angular, seja através do arquivo jest.config.js ou dentro do package.json.&lt;/p&gt;

&lt;h4&gt;
  
  
  jest.config.js:
&lt;/h4&gt;

&lt;p&gt;Copie e cole dentro do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;module.exports = {
  preset: 'jest-preset-angular',
  setupFilesAfterEnv: ['&amp;lt;rootDir&amp;gt;/src/setup.jest.ts'],
};
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7huhdoh8sbickg8zrtp6.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7huhdoh8sbickg8zrtp6.png" alt=" " width="759" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;OU&lt;/p&gt;

&lt;h4&gt;
  
  
  Dentro do package.json:
&lt;/h4&gt;

&lt;p&gt;Copie e cole dentro do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;"jest": {
    "preset": "jest-preset-angular",
    "setupFilesAfterEnv": [
      "&amp;lt;rootDir&amp;gt;/src/setup.jest.ts"
    ],
    "testPathIgnorePatterns": [
      "&amp;lt;rootDir&amp;gt;/node_modules/",
      "&amp;lt;rootDir&amp;gt;/dist/"
    ],
    "globals": {
      "ts-jest": {
        "tsConfig": "&amp;lt;rootDir&amp;gt;/tsconfig.spec.json",
        "stringifyContentPathRegex": "\\.html$"
      }
    }
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdtizdrxkumjijnwv7xb.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxdtizdrxkumjijnwv7xb.png" alt=" " width="498" height="920"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  6. Criar/configurar arquivo setup.jest.ts:
&lt;/h3&gt;

&lt;p&gt;Após configurar o jest, vamos criar um arquivo typescript para importar o modulo do jest no mesmo.&lt;br&gt;
Primeiramente crie um arquivo chamado &lt;strong&gt;setup.jest.ts&lt;/strong&gt; dentro da pasta &lt;strong&gt;src&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Copie e cole dentro do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { setupZoneTestEnv } from 'jest-preset-angular/setup-env/zone/index.mjs';

setupZoneTestEnv();
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyrzf2emd16ho7sow5ep.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdyrzf2emd16ho7sow5ep.png" alt=" " width="730" height="149"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Atualizar o arquivo tsconfig.spec.json:
&lt;/h3&gt;

&lt;p&gt;No passo 7, vamos ter que configurar o arquivo tsconfig.spec.json para o jest e referenciar o setup.jest.ts que acabamos de criar.&lt;/p&gt;

&lt;p&gt;Faça as seguintes alterações dentro do arquivo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "types": ["jest", "node"],
  },
  "files": ["src/setup.jest.ts"],
  "include": ["src/**/*.spec.ts", "src/**/*.ts"]
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i9y3hlzmcy2ndxagndd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2i9y3hlzmcy2ndxagndd.png" alt=" " width="800" height="212"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  8. Ative o esModuleInterop:
&lt;/h3&gt;

&lt;p&gt;Caso você não ativar o &lt;strong&gt;esModuleInterop&lt;/strong&gt;, provavelmente aparecerá um aviso no terminal ao rodar os testes, contudo é importante para evitar erros de importação.&lt;/p&gt;

&lt;p&gt;Abra o seu tsconfig.json e adicione ou modifique esta configuração:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;{
  "compilerOptions": {
    "esModuleInterop": true,
  }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fia787u6472vbeopx322r.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fia787u6472vbeopx322r.png" alt=" " width="800" height="423"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  9. Execute o jest/testes unitários:
&lt;/h3&gt;

&lt;p&gt;Agora vamos executar os testes unitários através do jest e verificar se está tudo ok.&lt;/p&gt;

&lt;p&gt;Execute no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;npm run test
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63c2gt3b0ki6sjuy7655.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F63c2gt3b0ki6sjuy7655.png" alt=" " width="426" height="225"&gt;&lt;/a&gt;&lt;/p&gt;




&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-pontes/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>development</category>
      <category>angular</category>
      <category>unittest</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Olá, pessoal! Fiz um artigo mirando no dev iniciante em backend Java. Caso puderem dar uma olhada.</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Tue, 22 Apr 2025 06:30:16 +0000</pubDate>
      <link>https://forem.com/devgustavus/ola-pessoal-fiz-um-artigo-mirando-no-dev-iniciante-em-backend-java-caso-puderem-dar-uma-olhada-2peg</link>
      <guid>https://forem.com/devgustavus/ola-pessoal-fiz-um-artigo-mirando-no-dev-iniciante-em-backend-java-caso-puderem-dar-uma-olhada-2peg</guid>
      <description>&lt;div class="ltag__link--embedded"&gt;
  &lt;div class="crayons-story "&gt;
  &lt;a href="https://dev.to/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j" class="crayons-story__hidden-navigation-link"&gt;Como instalar e configurar da maneira certa um projeto Java SpringBoot + Maven?&lt;/a&gt;


  &lt;div class="crayons-story__body crayons-story__body-full_post"&gt;
    &lt;div class="crayons-story__top"&gt;
      &lt;div class="crayons-story__meta"&gt;
        &lt;div class="crayons-story__author-pic"&gt;

          &lt;a href="/devgustavus" class="crayons-avatar  crayons-avatar--l  "&gt;
            &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" alt="devgustavus profile" class="crayons-avatar__image"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
        &lt;div&gt;
          &lt;div&gt;
            &lt;a href="/devgustavus" class="crayons-story__secondary fw-medium m:hidden"&gt;
              Gustavo Machado
            &lt;/a&gt;
            &lt;div class="profile-preview-card relative mb-4 s:mb-0 fw-medium hidden m:inline-block"&gt;
              
                Gustavo Machado
                
              
              &lt;div id="story-author-preview-content-2399612" class="profile-preview-card__content crayons-dropdown branded-7 p-4 pt-0"&gt;
                &lt;div class="gap-4 grid"&gt;
                  &lt;div class="-mt-4"&gt;
                    &lt;a href="/devgustavus" class="flex"&gt;
                      &lt;span class="crayons-avatar crayons-avatar--xl mr-2 shrink-0"&gt;
                        &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1459777%2F0721a93a-e034-47bb-a550-579e53b40396.png" class="crayons-avatar__image" alt=""&gt;
                      &lt;/span&gt;
                      &lt;span class="crayons-link crayons-subtitle-2 mt-5"&gt;Gustavo Machado&lt;/span&gt;
                    &lt;/a&gt;
                  &lt;/div&gt;
                  &lt;div class="print-hidden"&gt;
                    
                      Follow
                    
                  &lt;/div&gt;
                  &lt;div class="author-preview-metadata-container"&gt;&lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
            &lt;/div&gt;

          &lt;/div&gt;
          &lt;a href="https://dev.to/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j" class="crayons-story__tertiary fs-xs"&gt;&lt;time&gt;Apr 22 '25&lt;/time&gt;&lt;span class="time-ago-indicator-initial-placeholder"&gt;&lt;/span&gt;&lt;/a&gt;
        &lt;/div&gt;
      &lt;/div&gt;

    &lt;/div&gt;

    &lt;div class="crayons-story__indention"&gt;
      &lt;h2 class="crayons-story__title crayons-story__title-full_post"&gt;
        &lt;a href="https://dev.to/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j" id="article-link-2399612"&gt;
          Como instalar e configurar da maneira certa um projeto Java SpringBoot + Maven?
        &lt;/a&gt;
      &lt;/h2&gt;
        &lt;div class="crayons-story__tags"&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/java"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;java&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/springboot"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;springboot&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/programming"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;programming&lt;/a&gt;
            &lt;a class="crayons-tag  crayons-tag--monochrome " href="/t/backend"&gt;&lt;span class="crayons-tag__prefix"&gt;#&lt;/span&gt;backend&lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="crayons-story__bottom"&gt;
        &lt;div class="crayons-story__details"&gt;
          &lt;a href="https://dev.to/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left"&gt;
            &lt;div class="multiple_reactions_aggregate"&gt;
              &lt;span class="multiple_reactions_icons_container"&gt;
                  &lt;span class="crayons_icon_container"&gt;
                    &lt;img src="https://assets.dev.to/assets/fire-f60e7a582391810302117f987b22a8ef04a2fe0df7e3258a5f49332df1cec71e.svg" width="18" height="18"&gt;
                  &lt;/span&gt;
              &lt;/span&gt;
              &lt;span class="aggregate_reactions_counter"&gt;1&lt;span class="hidden s:inline"&gt; reaction&lt;/span&gt;&lt;/span&gt;
            &lt;/div&gt;
          &lt;/a&gt;
            &lt;a href="https://dev.to/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j#comments" class="crayons-btn crayons-btn--s crayons-btn--ghost crayons-btn--icon-left flex items-center"&gt;
              Comments


              &lt;span class="hidden s:inline"&gt;Add Comment&lt;/span&gt;
            &lt;/a&gt;
        &lt;/div&gt;
        &lt;div class="crayons-story__save"&gt;
          &lt;small class="crayons-story__tertiary fs-xs mr-2"&gt;
            4 min read
          &lt;/small&gt;
            
              &lt;span class="bm-initial"&gt;
                

              &lt;/span&gt;
              &lt;span class="bm-success"&gt;
                

              &lt;/span&gt;
            
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;/div&gt;


</description>
      <category>java</category>
      <category>springboot</category>
      <category>programming</category>
      <category>backend</category>
    </item>
    <item>
      <title>Como instalar e configurar da maneira certa um projeto Java SpringBoot + Maven?</title>
      <dc:creator>Gustavo Machado</dc:creator>
      <pubDate>Tue, 22 Apr 2025 06:26:14 +0000</pubDate>
      <link>https://forem.com/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j</link>
      <guid>https://forem.com/devgustavus/como-instalar-e-configurar-da-maneira-certa-um-projeto-java-springboot-maven-3j3j</guid>
      <description>&lt;h2&gt;
  
  
  Como configurar um projeto em Java SpringBoot?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgx8z8owlh1dant88vtz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdgx8z8owlh1dant88vtz.png" alt="Java Springboot Banner"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Olá a todos! Este é um artigo dedicado as configurações iniciais para um projeto backend feito com java SpringBoot. Iremos desde a instalação até a configuração básica das dependências do projeto.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação do Java
&lt;/h3&gt;

&lt;p&gt;Para começar, vamos instalar o JDK do Java, ou seja, o seu "kit de desenvolvimento". Assim poderemos executar e desenvolver projetos cujo a linguagem é baseada no Java.&lt;/p&gt;

&lt;p&gt;Vamos seguir os seguintes passos:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Download do instalador de uma versão do Java (preferível que seja LTS);&lt;/li&gt;
&lt;li&gt;Instalação do Java (siga as recomendações do instalador);&lt;/li&gt;
&lt;li&gt;Configurações das Variáveis de ambiente.&lt;/li&gt;
&lt;/ol&gt;

&lt;h4&gt;
  
  
  1. Download
&lt;/h4&gt;

&lt;p&gt;Clique no Link para baixar a última versão LTS (Long Time Support) para Windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://www.oracle.com/br/java/technologies/downloads/#jdk21-windows" rel="noopener noreferrer"&gt;JDK 21 - LTS&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flg5yrfak1gv3kzw9cdg4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flg5yrfak1gv3kzw9cdg4.png" alt="Download instructions"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Instalação
&lt;/h4&gt;

&lt;p&gt;Siga as opções pre-configuradas do instalador! A menos que queira personalizar...&lt;/p&gt;

&lt;p&gt;Confirme a instalação do Java no PC, através do comando:&lt;br&gt;
&lt;code&gt;java --version&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F019r13zbut6xsse31v5o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F019r13zbut6xsse31v5o.png" alt="cmd command"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Variáveis de ambiente
&lt;/h4&gt;

&lt;p&gt;Agora vamos configurar as variaveis de ambiente, cujo a função é:&lt;br&gt;
Permitir que o &lt;strong&gt;sistema operacional saiba onde encontrar os arquivos executáveis do Java&lt;/strong&gt;, como o javac (compilador) e o java (interpretador), a partir de qualquer diretório no terminal.&lt;/p&gt;

&lt;p&gt;Siga os seguintes passos:&lt;/p&gt;

&lt;p&gt;1) Acesse as Variáveis de Ambiente no Menu do Windows.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ahvs5oyfal450ps4e6v.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F5ahvs5oyfal450ps4e6v.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) Crie uma nova variável de ambiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecbnlowpho82w2g3g5lz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fecbnlowpho82w2g3g5lz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dentro do campo "Valor da variável" copie o caminho da pasta onde o seu JDK está instalado!&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F999cq8d49olm4yqd9pgt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F999cq8d49olm4yqd9pgt.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;3) Aponte a nova variável no "path".&lt;/p&gt;

&lt;p&gt;Edite a variável de ambiente "path" e lá crie um novo caminho com o valor: &lt;strong&gt;%JAVA_HOME%\bin&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzu2sfq3c8shn8iwmhxa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fzzu2sfq3c8shn8iwmhxa.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Instalação do Maven
&lt;/h3&gt;

&lt;p&gt;Agora vamos iniciar a instalação do nosso "Gerenciador de dependências/pacotes" no qual vai automatizar a instalação e administração das bibliotecas e dependências usadas no projeto java. É como se fosse um NPM, porém do java:&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Download
&lt;/h4&gt;

&lt;p&gt;Clique no Link para baixar a última versão do maven em "zip".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://maven.apache.org/download.cgi" rel="noopener noreferrer"&gt;Apache Maven&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p258tv4rzi2dvhxy322.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2p258tv4rzi2dvhxy322.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  2. Instale o WinRar
&lt;/h4&gt;

&lt;p&gt;Precisamos agora de um software para descompactar a pasta zip do Maven.&lt;/p&gt;

&lt;p&gt;Faça o download:&lt;br&gt;
&lt;a href="https://www.win-rar.com/download.html?&amp;amp;L=9" rel="noopener noreferrer"&gt;WinRar&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;
  
  
  3. Descompacte o zip do maven
&lt;/h4&gt;

&lt;p&gt;Descompacte a pasta zipada do maven no mesmo diretório em que está localizada a pasta do java (apenas para fim de organização).&lt;br&gt;
Exemplo: C:\Program Files&lt;/p&gt;
&lt;h4&gt;
  
  
  4. Configure as variáveis de ambientes para o maven
&lt;/h4&gt;

&lt;p&gt;1) Crie uma nova variável global chamada "MAVEN_HOME".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v688rmsviuexqv49kwz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6v688rmsviuexqv49kwz.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;2) Na variável de ambiente "path", aponte para a pasta "bin" do maven.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf0iiay70i43jiu3pnoe.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgf0iiay70i43jiu3pnoe.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Configuração do Spring Boot
&lt;/h3&gt;

&lt;p&gt;Finalmente vamos aos passos iniciais para começar um projeto Java Spring Boot. Aqui está o "spring initializr", que é basicamente um &lt;strong&gt;"iniciador de projeto Java Spring" de maneira mais fácil e versátil&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Farei um outro artigo explicando mais detalhadamente&lt;/strong&gt; cada ponto deste recurso, mas mostrarei agora um "&lt;strong&gt;overview&lt;/strong&gt;" da ferramenta, para deixar as coisas mais claras.&lt;/p&gt;

&lt;p&gt;Link do spring initializr:&lt;br&gt;
&lt;a href="https://start.spring.io" rel="noopener noreferrer"&gt;spring initializr&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Acompanhe agora a interface do "" e suas funcionalidades:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6scj17uskgempqzmjrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fd6scj17uskgempqzmjrd.png" alt=" "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Gerenciador de bibliotecas;&lt;/li&gt;
&lt;li&gt;Linguagem de tecnologia;&lt;/li&gt;
&lt;li&gt;Versão do Spring Boot (já vem com versão default);&lt;/li&gt;
&lt;li&gt;Metadados do projeto (nome, descrição, autoria/grupo e etc.);&lt;/li&gt;
&lt;li&gt;Como o seu projeto é "embalado" para distribuição;&lt;/li&gt;
&lt;li&gt;Versão do Java (JDK);&lt;/li&gt;
&lt;li&gt;Configuração de dependências (bibliotecas e recursos prontos).&lt;/li&gt;
&lt;/ol&gt;


&lt;h3&gt;
  
  
  Créditos
&lt;/h3&gt;

&lt;p&gt;Desta maneira você poderá começar um projeto com Java Spring Boot na sua máquina!&lt;br&gt;
Caso queira acompanhar estes passos por videoaula, disponibilizarei alguns links de vídeos do qual aprendi e extraí os dados para este artigo.&lt;/p&gt;
&lt;h4&gt;
  
  
  Videoaulas - Canal "Curso De Tecnologia"
&lt;/h4&gt;
&lt;h5&gt;
  
  
  Parte do Java + Maven:
&lt;/h5&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/m60Qe5dLQKI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/WvihAA-OAZI"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;

&lt;h5&gt;
  
  
  Parte do Spring Boot:
&lt;/h5&gt;

&lt;p&gt;  &lt;iframe src="https://www.youtube.com/embed/hH7BxfHgGis"&gt;
  &lt;/iframe&gt;
&lt;/p&gt;




&lt;p&gt;Desde já agradeço a todos e espero que tenham gostado!&lt;/p&gt;

&lt;p&gt;Att.&lt;br&gt;
Gustavo Machado Pontes&lt;/p&gt;

&lt;p&gt;&lt;a href="https://linktr.ee/DevGustavus" rel="noopener noreferrer"&gt;linktr&lt;/a&gt; &lt;a href="https://www.linkedin.com/in/gustavo-machado-pontes/" rel="noopener noreferrer"&gt;linkedin&lt;/a&gt; &lt;a href="https://github.com/DevGustavus" rel="noopener noreferrer"&gt;github&lt;/a&gt; &lt;a href="https://www.instagram.com/devgustavus/" rel="noopener noreferrer"&gt;instagram&lt;/a&gt; &lt;a href="https://twitter.com/Gustavo72166607" rel="noopener noreferrer"&gt;twitter&lt;/a&gt;&lt;/p&gt;

</description>
      <category>java</category>
      <category>springboot</category>
      <category>programming</category>
      <category>backend</category>
    </item>
  </channel>
</rss>
