<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ Carlos Silva. - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ Carlos Silva. - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Mon, 25 May 2026 04:46:48 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/carlos-silva/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Hooks do ciclo de vida do Angular: ngOnChanges, ngOnInit e muito mais ]]>
                </title>
                <description>
                    <![CDATA[ Por que precisamos de hooks do ciclo de vida? Os frameworks modernos de front-end movem a aplicação de um estado para outro. Os dados alimentam essas atualizações. Essas tecnologias interagem com os dados que, por sua vez, fazem a transição do estado. A cada mudança de estado, há muitos momentos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/hooks-do-ciclo-de-vida-do-angular-ngonchanges-ngoninit-e-muito-mais/</link>
                <guid isPermaLink="false">648f1ed33f8119067d31ef85</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Wed, 05 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/5f9c9d66740569d1a4ca378c.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/angular-lifecycle-hooks/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Angular Lifecycle Hooks: ngOnChanges, ngOnInit, and more</a>
      </p><h3 id="por-que-precisamos-de-hooks-do-ciclo-de-vida"><strong>Por que precisamos de <em>hooks </em>do ciclo de vida?</strong></h3><p>Os <em>frameworks</em> modernos de <em>front-end</em> movem a aplicação de um estado para outro. Os dados alimentam essas atualizações. Essas tecnologias interagem com os dados que, por sua vez, fazem a transição do estado. A cada mudança de estado, há muitos momentos específicos em que determinados ativos ficam disponíveis.</p><p>Em um momento, o modelo pode estar pronto. Em outro, os dados terão terminado de ser carregados. A programação de cada exemplo requer um meio de detecção. Os <em>hooks </em>de ciclo de vida atendem a essa necessidade. Os <em>frameworks</em> modernos de <em>front-end</em> vêm com uma variedade de <em>hooks</em> de ciclo de vida. O Angular não é uma exceção.</p><h2 id="hooks-de-ciclo-de-vida-explicados"><strong><em>Hooks </em>de ciclo de vida explicados</strong></h2><p>Os <em>hooks </em>de ciclo de vida são métodos programados para serem executados em determinado momento. Eles diferem em quando e por que são executados. A detecção de alterações aciona esses métodos. Eles são executados de acordo com as condições do ciclo atual. O Angular executa a detecção de alterações constantemente em seus dados. Os <em>hooks </em>de ciclo de vida ajudam a gerenciar seus efeitos.</p><p>Um aspecto importante desses <em>hooks </em>é sua ordem de execução. Ela nunca muda. Eles são executados com base em uma série previsível de eventos de carregamento produzidos a partir de um ciclo de detecção. Isso os torna previsíveis.</p><p>Alguns ativos só estão disponíveis após a execução de um determinado <em>hook</em>. Obviamente, um <em>hook </em>só é executado sob determinadas condições definidas no ciclo de detecção de alterações atual.</p><p>Este artigo apresenta os <em>hooks </em>de ciclo de vida na ordem de sua execução (se todos forem executados). Certas condições merecem a ativação de um <em>hook</em>. Há alguns que são executados apenas uma vez, após a inicialização do componente.</p><p>Todos os métodos do ciclo de vida estão disponíveis em <code>@angular/core</code>. Embora não seja obrigatório, o Angular <a href="https://angular.io/guide/lifecycle-hooks#interfaces-are-optional-technically">recomenda a implementação de todos os <em>hooks</em></a><em> </em>(texto em inglês). Essa prática resulta em mensagens de erro mais relacionadas ao componente.</p><h2 id="ordem-de-execu-o-dos-hooks-de-ciclo-de-vida"><strong>Ordem de execução dos <em>hooks </em>de ciclo de vida</strong></h2><h3 id="ngonchanges"><strong>ngOnChanges</strong></h3><p>O <code>ngOnChanges</code> é acionado após a modificação dos membros da classe vinculada <code>@Input</code>. Os dados vinculados pelo decorador <code>@Input()</code> são provenientes de uma fonte externa. Quando a fonte externa altera esses dados de maneira detectável, eles passam novamente pela propriedade <code>@Input</code>.</p><p>Com essa atualização, o <code>ngOnChanges</code> é acionado imediatamente. Ele também é acionado na inicialização dos dados de entrada. O <em>hook </em>recebe um parâmetro opcional do tipo <code>SimpleChanges</code>. Esse valor contém informações sobre as propriedades de limite de entrada alteradas.</p><pre><code class="language-typescript">import { Component, Input, OnChanges } from '@angular/core';

@Component({
  selector: 'app-child',
  template: `
  &lt;h3&gt;Child Component&lt;/h3&gt;
  &lt;p&gt;TICKS: {{ lifecycleTicks }}&lt;/p&gt;
  &lt;p&gt;DATA: {{ data }}&lt;/p&gt;
  `
})
export class ChildComponent implements OnChanges {
  @Input() data: string;
  lifecycleTicks: number = 0;

  ngOnChanges() {
    this.lifecycleTicks++;
  }
}

@Component({
  selector: 'app-parent',
  template: `
  &lt;h1&gt;ngOnChanges Example&lt;/h1&gt;
  &lt;app-child [data]="arbitraryData"&gt;&lt;/app-child&gt;
  `
})
export class ParentComponent {
  arbitraryData: string = 'initial';

  constructor() {
    setTimeout(() =&gt; {
      this.arbitraryData = 'final';
    }, 5000);
  }
}</code></pre><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> o <code>ParentComponent</code> (componente pai) vincula os dados de entrada ao <code>ChildComponent</code> (componente filho). O componente recebe esses dados por meio de sua propriedade <code>@Input</code> e <code>ngOnChanges</code> é acionado. Após cinco segundos, a chamada de retorno <code>setTimeout</code> é acionada. O <code>ParentComponent</code> altera a fonte de dados da propriedade do limite de entrada do <code>ChildComponent</code>. Os novos dados fluem pela propriedade de entrada. O <code>ngOnChanges</code> é acionado mais uma vez.</p><h3 id="ngoninit"><strong>ngOnInit</strong></h3><p>O <code>ngOnInit</code> é acionado uma vez na inicialização das propriedades vinculadas à entrada (<code>@Input</code>) de um componente. O próximo exemplo será semelhante ao anterior. O <em>hook</em> não é acionado quando o <code>ChildComponent</code> recebe os dados de entrada. Em vez disso, ele é acionado logo após os dados serem renderizados no modelo <code>ChildComponent</code>.</p><pre><code class="language-typescript">import { Component, Input, OnInit } from '@angular/core';

@Component({
  selector: 'app-child',
  template: `
  &lt;h3&gt;Child Component&lt;/h3&gt;
  &lt;p&gt;TICKS: {{ lifecycleTicks }}&lt;/p&gt;
  &lt;p&gt;DATA: {{ data }}&lt;/p&gt;
  `
})
export class ChildComponent implements OnInit {
  @Input() data: string;
  lifecycleTicks: number = 0;

  ngOnInit() {
    this.lifecycleTicks++;
  }
}

@Component({
  selector: 'app-parent',
  template: `
  &lt;h1&gt;ngOnInit Example&lt;/h1&gt;
  &lt;app-child [data]="arbitraryData"&gt;&lt;/app-child&gt;
  `
})
export class ParentComponent {
  arbitraryData: string = 'initial';

  constructor() {
    setTimeout(() =&gt; {
      this.arbitraryData = 'final';
    }, 5000);
  }
}</code></pre><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> o <code>ParentComponent</code> vincula os dados de entrada ao <code>ChildComponent</code>. O ChildComponent recebe esses dados por meio de sua propriedade <code>@Input</code>. Os dados são renderizados para o modelo e o <code>ngOnInit</code> é acionado. Após cinco segundos, a chamada de retorno <code>setTimeout</code> é acionada. O ParentComponent muda a fonte de dados da propriedade vinculada à entrada de ChildComponent e ngOnInit <strong>NÃO É ACIONADO</strong>.</p><p><code>ngOnInit</code> é um <em>hook </em>de uso único. A inicialização é sua única preocupação.</p><h3 id="ngdocheck"><strong>ngDoCheck</strong></h3><p>O <code>ngDoCheck</code> é acionado a cada ciclo de detecção de alterações. O Angular executa a detecção de alterações com frequência. O desempenho de qualquer ação fará com que ele entre em ciclo e <code>ngDoCheck</code> é acionado com esses ciclos. Use-o com cautela. Ele pode criar problemas de desempenho quando implementado incorretamente.</p><p><code>ngDoCheck</code> permite que os desenvolvedores verifiquem seus dados manualmente. Eles podem acionar uma nova data de aplicação condicionalmente. Em conjunto com <code>ChangeDetectorRef</code>, os desenvolvedores podem criar suas próprias verificações para detecção de alterações.</p><pre><code class="language-typescript">import { Component, DoCheck, ChangeDetectorRef } from '@angular/core';

@Component({
  selector: 'app-example',
  template: `
  &lt;h1&gt;ngDoCheck Example&lt;/h1&gt;
  &lt;p&gt;DATA: {{ data[data.length - 1] }}&lt;/p&gt;
  `
})
export class ExampleComponent implements DoCheck {
  lifecycleTicks: number = 0;
  oldTheData: string;
  data: string[] = ['initial'];

  constructor(private changeDetector: ChangeDetectorRef) {
    this.changeDetector.detach(); // lets the class perform its own change detection

    setTimeout(() =&gt; {
      this.oldTheData = 'final'; // intentional error
      this.data.push('intermediate');
    }, 3000);

    setTimeout(() =&gt; {
      this.data.push('final');
      this.changeDetector.markForCheck();
    }, 6000);
  }

  ngDoCheck() {
    console.log(++this.lifecycleTicks);

    if (this.data[this.data.length - 1] !== this.oldTheData) {
      this.changeDetector.detectChanges();
    }
  }
}</code></pre><p>Preste atenção no console e contrate-o com o que aparece na tela. Os dados progridem até "intermediário" antes de congelar. Três rodadas de detecção de mudanças ocorrem durante esse período, conforme indicado no console. Mais uma rodada de detecção de alterações ocorre quando 'final' é empurrado para o final de <code>this.data</code>. Em seguida, ocorre uma última rodada de detecção de mudanças. A avaliação da instrução <code>if</code> determina que não são necessárias atualizações na exibição.</p><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> a classe é exemplificada após duas rodadas de detecção de alterações. O construtor da classe inicia o <code>setTimeout</code> duas vezes. Após três segundos, o primeiro <code>setTimeout</code> aciona a detecção de alterações e o <code>ngDoCheck</code> marca a tela para uma atualização. Três segundos depois, o segundo <code>setTimeout</code> aciona a detecção de alterações. Não são necessárias atualizações de visualização de acordo com a avaliação de <code>ngDoCheck</code>.</p><h3 id="aviso">Aviso</h3><p>Antes de continuar, aprenda a diferença entre o DOM de conteúdo e o DOM de visualização (DOM significa Modelo de Objeto do Documento).</p><p>O DOM de conteúdo define o <code>innerHTML</code> dos elementos da diretiva. Por outro lado, o DOM de visualização é o modelo de um componente, excluindo qualquer modelo HTML agrupado em uma diretiva. Para entender melhor, consulte <a href="http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders">este artigo do blog</a> (texto em inglês) do autor Minko Gechev.</p><h3 id="ngaftercontentinit"><strong>ngAfterContentInit</strong></h3><p><code>ngAfterContentInit</code> é acionado depois que o DOM do conteúdo do componente é inicializado (carregado pela primeira vez). Esperar por pesquisas (do inglês, <em>queries</em>) de <code>@ContentChild(ren)</code> é o principal caso de uso do <em>hook</em>.</p><p>As pesquisas de <code>@ContentChild(ren)</code> produzem referências de elementos para o DOM de conteúdo. Desse modo, eles não ficam disponíveis até que o DOM do conteúdo seja carregado. Por isso, o <code>ngAfterContentInit</code> e seu equivalente <code>ngAfterContentChecked</code> são usados.</p><pre><code class="language-typescript">import { Component, ContentChild, AfterContentInit, ElementRef, Renderer2 } from '@angular/core';

@Component({
  selector: 'app-c',
  template: `
  &lt;p&gt;I am C.&lt;/p&gt;
  &lt;p&gt;Hello World!&lt;/p&gt;
  `
})
export class CComponent { }

@Component({
  selector: 'app-b',
  template: `
  &lt;p&gt;I am B.&lt;/p&gt;
  &lt;ng-content&gt;&lt;/ng-content&gt;
  `
})
export class BComponent implements AfterContentInit {
  @ContentChild("BHeader", { read: ElementRef }) hRef: ElementRef;
  @ContentChild(CComponent, { read: ElementRef }) cRef: ElementRef;

  constructor(private renderer: Renderer2) { }

  ngAfterContentInit() {
    this.renderer.setStyle(this.hRef.nativeElement, 'background-color', 'yellow')

    this.renderer.setStyle(this.cRef.nativeElement.children.item(0), 'background-color', 'pink');
    this.renderer.setStyle(this.cRef.nativeElement.children.item(1), 'background-color', 'red');
  }
}

@Component({
  selector: 'app-a',
  template: `
  &lt;h1&gt;ngAfterContentInit Example&lt;/h1&gt;
  &lt;p&gt;I am A.&lt;/p&gt;
  &lt;app-b&gt;
    &lt;h3 #BHeader&gt;BComponent Content DOM&lt;/h3&gt;
    &lt;app-c&gt;&lt;/app-c&gt;
  &lt;/app-b&gt;
  `
})
export class AComponent { }</code></pre><p>Os resultados da pesquisa de <code>@ContentChild</code> estão disponíveis em <code>ngAfterContentInit</code>. O <code>Renderer2</code> atualiza o DOM de conteúdo do <code>BComponent</code>, que contém uma tag <code>h3</code> e o <code>CComponent</code>. Esse é um exemplo comum de <a href="https://alligator.io/angular/content-projection-angular">projeção de conteúdo</a> (texto em inglês).</p><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> a renderização começa com o <code>AComponent</code>. Para concluir, o <code>AComponent</code> deve renderizar o <code>BComponent</code>. O <code>BComponent</code> projeta o conteúdo agrupado em seu elemento por meio do elemento <code>&lt;ng-content&gt;&lt;/ng-content&gt;</code>. O <code>CComponent</code> faz parte do conteúdo projetado. O conteúdo projetado termina de ser renderizado. O <code>ngAfterContentInit</code> é acionado. O <code>BComponent</code> termina a renderização. O <code>AComponent</code> termina a renderização. <code>ngAfterContentInit</code> não será acionado novamente.</p><h3 id="ngaftercontentchecked"><strong>ngAfterContentChecked</strong></h3><p>O <code>ngAfterContentChecked</code> é acionado após cada ciclo de detecção de alterações direcionado ao DOM de conteúdo. Isso permite que os desenvolvedores facilitem o modo como o DOM do conteúdo reage à detecção de alterações. O <code>ngAfterContentChecked</code> pode ser acionado com frequência e causar problemas de desempenho se for implementado incorretamente.</p><p>O <code>ngAfterContentChecked</code> também é acionado durante os estágios de inicialização de um componente. Ele vem logo após <code>ngAfterContentInit</code>.</p><pre><code class="language-typescript">import { Component, ContentChild, AfterContentChecked, ElementRef, Renderer2 } from '@angular/core';

@Component({
  selector: 'app-c',
  template: `
  &lt;p&gt;I am C.&lt;/p&gt;
  &lt;p&gt;Hello World!&lt;/p&gt;
  `
})
export class CComponent { }

@Component({
  selector: 'app-b',
  template: `
  &lt;p&gt;I am B.&lt;/p&gt;
  &lt;button (click)="$event"&gt;CLICK&lt;/button&gt;
  &lt;ng-content&gt;&lt;/ng-content&gt;
  `
})
export class BComponent implements AfterContentChecked {
  @ContentChild("BHeader", { read: ElementRef }) hRef: ElementRef;
  @ContentChild(CComponent, { read: ElementRef }) cRef: ElementRef;

  constructor(private renderer: Renderer2) { }

  randomRGB(): string {
    return `rgb(${Math.floor(Math.random() * 256)},
    ${Math.floor(Math.random() * 256)},
    ${Math.floor(Math.random() * 256)})`;
  }

  ngAfterContentChecked() {
    this.renderer.setStyle(this.hRef.nativeElement, 'background-color', this.randomRGB());
    this.renderer.setStyle(this.cRef.nativeElement.children.item(0), 'background-color', this.randomRGB());
    this.renderer.setStyle(this.cRef.nativeElement.children.item(1), 'background-color', this.randomRGB());
  }
}

@Component({
  selector: 'app-a',
  template: `
  &lt;h1&gt;ngAfterContentChecked Example&lt;/h1&gt;
  &lt;p&gt;I am A.&lt;/p&gt;
  &lt;app-b&gt;
    &lt;h3 #BHeader&gt;BComponent Content DOM&lt;/h3&gt;
    &lt;app-c&gt;&lt;/app-c&gt;
  &lt;/app-b&gt;
  `
})
export class AComponent { }</code></pre><p>Ele não difere muito do <code>ngAfterContentInit</code>. Um mero <code>&lt;button&gt;&lt;/button&gt;</code> foi adicionado ao <code>BComponent</code>. Clicar nele causa um loop de detecção de alterações. Isso ativa o gancho, conforme indicado pela aleatoriedade da <code>cor de fundo</code>.</p><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> a renderização começa com o <code>AComponent</code>. Para concluir, o <code>AComponent</code> deve renderizar o <code>BComponent</code>. O <code>BComponent</code> projeta o conteúdo agrupado em seu elemento por meio do elemento <code>&lt;ng-content&gt;&lt;/ng-content&gt;</code>. O <code>CComponent</code> faz parte do conteúdo projetado. O conteúdo projetado termina de ser renderizado. <code>ngAfterContentChecked</code> é acionado. O <code>BComponent</code> termina a renderização. <code>AComponent</code> termina a renderização. O <code>ngAfterContentChecked</code> pode ser acionado novamente por meio da detecção de alterações.</p><h3 id="ngafterviewinit"><strong>ngAfterViewInit</strong></h3><p>O <code>ngAfterViewInit</code> é acionado uma vez após a conclusão da inicialização do DOM de visualização. A visualização sempre é carregada logo após o conteúdo. <code>ngAfterViewInit</code> aguarda a resolução das pesquisas <code>@ViewChild(ren)</code>. Esses elementos são consultados na mesma visualização do componente.</p><p>No exemplo abaixo, o título <code>h3</code> de <code>BComponent</code> é pesquisado. <code>ngAfterViewInit</code> é executado assim que os resultados da pesquisa estão disponíveis.</p><pre><code class="language-typescript">import { Component, ViewChild, AfterViewInit, ElementRef, Renderer2 } from '@angular/core';

@Component({
  selector: 'app-c',
  template: `
  &lt;p&gt;I am C.&lt;/p&gt;
  &lt;p&gt;Hello World!&lt;/p&gt;
  `
})
export class CComponent { }

@Component({
  selector: 'app-b',
  template: `
  &lt;p #BStatement&gt;I am B.&lt;/p&gt;
  &lt;ng-content&gt;&lt;/ng-content&gt;
  `
})
export class BComponent implements AfterViewInit {
  @ViewChild("BStatement", { read: ElementRef }) pStmt: ElementRef;

  constructor(private renderer: Renderer2) { }

  ngAfterViewInit() {
    this.renderer.setStyle(this.pStmt.nativeElement, 'background-color', 'yellow');
  }
}

@Component({
  selector: 'app-a',
  template: `
  &lt;h1&gt;ngAfterViewInit Example&lt;/h1&gt;
  &lt;p&gt;I am A.&lt;/p&gt;
  &lt;app-b&gt;
    &lt;h3&gt;BComponent Content DOM&lt;/h3&gt;
    &lt;app-c&gt;&lt;/app-c&gt;
  &lt;/app-b&gt;
  `
})
export class AComponent { }</code></pre><p><code>Renderer2</code> altera a cor de fundo do título de <code>BComponent</code>. Isso indica que o elemento de visualização foi pesquisado com sucesso graças ao <code>ngAfterViewInit</code>.</p><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> a renderização começa com o <code>AComponent</code>. Para concluir, o <code>AComponent</code> deve renderizar o <code>BComponent</code>. O <code>BComponent</code> projeta o conteúdo agrupado em seu elemento por meio do elemento <code>&lt;ng-content&gt;&lt;/ng-content&gt;</code>. <code>CComponent</code> faz parte do conteúdo projetado. O <code>BComponent</code> termina a renderização. O <code>ngAfterViewInit</code> é acionado. <code>AComponent</code> termina a renderização. <code>ngAfterViewInit</code> não será acionado novamente.</p><h3 id="ngafterviewchecked"><strong>ngAfterViewChecked</strong></h3><p>O <code>ngAfterViewChecked</code> é acionado após qualquer ciclo de detecção de alterações que tenha como alvo a visualização do componente. O <em>hook </em><code>ngAfterViewChecked</code> permite que os desenvolvedores facilitem o modo como a detecção de alterações afeta o DOM de visualização.</p><pre><code class="language-typescript">import { Component, ViewChild, AfterViewChecked, ElementRef, Renderer2 } from '@angular/core';

@Component({
  selector: 'app-c',
  template: `
  &lt;p&gt;I am C.&lt;/p&gt;
  &lt;p&gt;Hello World!&lt;/p&gt;
  `
})
export class CComponent { }

@Component({
  selector: 'app-b',
  template: `
  &lt;p #BStatement&gt;I am B.&lt;/p&gt;
  &lt;button (click)="$event"&gt;CLICK&lt;/button&gt;
  &lt;ng-content&gt;&lt;/ng-content&gt;
  `
})
export class BComponent implements AfterViewChecked {
  @ViewChild("BStatement", { read: ElementRef }) pStmt: ElementRef;

  constructor(private renderer: Renderer2) { }

  randomRGB(): string {
    return `rgb(${Math.floor(Math.random() * 256)},
    ${Math.floor(Math.random() * 256)},
    ${Math.floor(Math.random() * 256)})`;
  }

  ngAfterViewChecked() {
    this.renderer.setStyle(this.pStmt.nativeElement, 'background-color', this.randomRGB());
  }
}

@Component({
  selector: 'app-a',
  template: `
  &lt;h1&gt;ngAfterViewChecked Example&lt;/h1&gt;
  &lt;p&gt;I am A.&lt;/p&gt;
  &lt;app-b&gt;
    &lt;h3&gt;BComponent Content DOM&lt;/h3&gt;
    &lt;app-c&gt;&lt;/app-c&gt;
  &lt;/app-b&gt;
  `
})
export class AComponent { }</code></pre><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> a renderização começa com o <code>AComponent</code>. Para concluir, o <code>AComponent</code> deve renderizar o <code>BComponent</code>. O <code>BComponent</code> projeta o conteúdo agrupado em seu elemento por meio do elemento <code>&lt;ng-content&gt;&lt;/ng-content&gt;</code>. <code>CComponent</code> faz parte do conteúdo projetado. O conteúdo projetado termina de ser renderizado. O <code>BComponent</code> termina a renderização. <code>ngAfterViewChecked</code> é acionado. O <code>AComponent</code> termina a renderização. O <code>ngAfterViewChecked</code> pode ser acionado novamente por meio da detecção de alterações.</p><p>Clicar no elemento <code>&lt;button&gt;&lt;/button&gt;</code> inicia uma rodada de detecção de alterações. O <code>ngAfterContentChecked</code> dispara e randomiza a <code>cor de fundo</code> dos elementos consultados a cada clique no botão.</p><h3 id="ngondestroy"><strong>ngOnDestroy</strong></h3><p><code>ngOnDestroy</code> é acionado quando um componente é removido da visualização e do DOM subsequente. Esse <em>hook</em> oferece uma chance de reparar quaisquer pontas soltas antes da exclusão de um componente.</p><pre><code class="language-typescript">import { Directive, Component, OnDestroy } from '@angular/core';

@Directive({
  selector: '[appDestroyListener]'
})
export class DestroyListenerDirective implements OnDestroy {
  ngOnDestroy() {
    console.log("Goodbye World!");
  }
}

@Component({
  selector: 'app-example',
  template: `
  &lt;h1&gt;ngOnDestroy Example&lt;/h1&gt;
  &lt;button (click)="toggleDestroy()"&gt;TOGGLE DESTROY&lt;/button&gt;
  &lt;p appDestroyListener *ngIf="destroy"&gt;I can be destroyed!&lt;/p&gt;
  `
})
export class ExampleComponent {
  destroy: boolean = true;

  toggleDestroy() {
    this.destroy = !this.destroy;
  }
}</code></pre><p><strong>Resumo<strong><strong><strong>:</strong></strong></strong></strong> o botão é clicado. O membro <code>destroy</code> de <code>ExampleComponent</code> alterna para <code>false</code>. A instrução estrutural <code>*ngIf</code> é avaliada como falsa. <code>ngOnDestroy</code> é acionado. O <code>*ngIf</code> remove o<em> </em><code>&lt;p&gt;&lt;/p&gt;</code> que servia como seu <em>host</em>. Esse processo se repete qualquer número de vezes que você clicar no botão para alternar <code>destroy</code> para <code>false</code>.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Lembre-se de que determinadas condições devem ser atendidas para cada <em>hook</em>. Eles sempre serão executados em ordem sequencial, independentemente. Isso torna os <em>hooks </em>previsíveis o suficiente para serem usados, mesmo que alguns não sejam executados.</p><p>Com os <em>hooks </em>de ciclo de vida, é fácil prever o momento de execução de uma classe. Eles permitem que os desenvolvedores acompanhem onde a detecção de alterações está ocorrendo e como a aplicação deve reagir. Eles ficam parados em códigos que exigem dependências baseadas em carregamentos disponíveis somente após algum tempo.</p><p>O ciclo de vida do componente caracteriza os <em>frameworks</em> modernos de <em>front-end</em>. O Angular organiza seu ciclo de vida fornecendo os <em>hooks </em>mencionados acima.</p><h2 id="recursos-em-ingl-s-">Recursos<strong> (em inglês)</strong></h2><ul><li><a href="https://angular.io/guide/lifecycle-hooks">Equipe do Angular. "Lifecycle Hooks". <em><em>Google</em></em>. Acessado em 2 Junho de 2018</a></li><li><a href="http://blog.mgechev.com/2016/01/23/angular2-viewchildren-contentchildren-difference-viewproviders">Gechev, Minko. "ViewChildren and ContentChildren in Angular". Acessado em 2 Junho de 2018</a></li></ul><h2 id="outras-fontes-em-ingl-s-"><strong>Outras fontes (em inglês)</strong></h2><ul><li><a href="https://angular.io/docs">Documentação do Angular</a></li><li><a href="https://github.com/angular/angular">Repositório do GitHub do Angular</a></li><li><a href="https://angular.io/guide/lifecycle-hooks"><em>Hooks </em>do ciclo de vida em detalhes</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como criar uma aplicação de questionário usando o React – com dicas e código inicial ]]>
                </title>
                <description>
                    <![CDATA[ Neste tutorial de React para iniciantes, vamos criar uma aplicação de questionário. Trabalharemos com objetos de state complexos, como lidar com diferentes hooks de state e produziremos algo com base neles. Dê uma olhada: Tente você mesmo Se você quiser tentar primeiro, aqui estão os cenários (você também pode obter ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-de-quetionario-usando-o-react-com-dicas-e-codigo-inicial/</link>
                <guid isPermaLink="false">648dd55bd1454605b613fdef</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Tue, 04 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Build-a-Temperature-control-App--1-.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-build-a-quiz-app-using-react/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Build a Quiz App Using React –with Tips and Starter Code</a>
      </p><p>Neste tutorial de React para iniciantes, vamos criar uma aplicação de questionário. Trabalharemos com objetos de <em>state</em> complexos, como lidar com diferentes <em>hooks</em> de <em>state</em> e produziremos algo com base neles.</p><p>Dê uma olhada:</p><h2 id="tente-voc-mesmo"><strong>Tente você mesmo</strong></h2><p>Se você quiser tentar primeiro, aqui estão os cenários (você também pode obter o código inicial abaixo):</p><ul><li>Quando o usuário clica em um botão, a próxima pergunta deve ser exibida</li><li>Se o usuário acertar a pergunta, a pontuação deverá ser aumentada</li><li>Quando o usuário chegar ao final do questionário, sua pontuação total deverá ser exibida</li></ul><h2 id="tutorial"><strong>Tutorial</strong></h2><p><a href="https://github.com/chrisblakely01/quiz-app/tree/master/starter">Faça o download do código inicial no GitHub aqui.</a></p><h2 id="vamos-l-"><strong>Vamos lá!</strong></h2><p>Se você abrir o código inicial e acessar <strong><strong>App.js</strong></strong>, verá que forneci uma lista de perguntas/respostas, armazenadas em um array chamado <strong><strong>questions</strong></strong>. Esse é o nosso questionário.</p><p>Nosso primeiro objetivo é pegar os dados das perguntas no array e exibi-los na tela.</p><p>Removeremos o texto inserido diretamente no código e usaremos os dados da primeira pergunta, por enquanto, só para começar. Vamos nos preocupar com a troca de perguntas mais tarde.</p><p>Em nosso JSX, remova o texto da pergunta inserido diretamente no código e digite <code>{questions[0]}</code> para obter o primeiro item (ou pergunta) em nosso array de perguntas.</p><pre><code class="language-jsx">&lt;div className='question-text'&gt;{questions[0]}&lt;/div&gt;
</code></pre><h2 id="renderiza-o-de-perguntas-e-respostas"><strong>Renderização de perguntas e respostas</strong></h2><p>A primeira pergunta é um tema. Portanto, podemos usar a "notação de ponto" para obter acesso às propriedades. Agora, usaremos apenas <code>{question[0].questionText}</code> para obter acesso ao texto da pergunta para esse objeto:</p><pre><code class="language-jsx">&lt;div className='question-text'&gt;{questions[0].questionText}&lt;/div&gt;
</code></pre><p>Salve e execute a aplicação. Observe como o texto é atualizado. Lembre-se de que estamos apenas pegando o texto da primeira pergunta do primeiro tema em nosso array de perguntas.</p><p>Adotaremos uma abordagem semelhante para as opções de resposta. Remova os botões inseridos diretamente no código e use a função <code>map()</code> para repetir as opções de resposta de uma determinada pergunta.</p><p>Lembre-se de que a função <code>map()</code> faz uma repetição sobre o array e nos fornece o item atual em que a repetição se encontra, por meio de uma variável.</p><p>Substitua a <code>div</code> com a classe "answer-section" pela seguinte:</p><pre><code class="language-jsx">&lt;div className='answer-section'&gt;
	{questions[0].answerOptions.map((answerOption, index) =&gt; (
		&lt;button&gt;{answerOption.answerText}&lt;/button&gt;
	))}
&lt;/div&gt;
</code></pre><p>Salve e execute a aplicação. Observe como quatro botões de resposta aparecem e o texto é renderizado dinamicamente.</p><p>Vamos recapitular:</p><ul><li>Estamos obtendo a primeira pergunta do array de perguntas: <code>questions[0]</code></li><li>A primeira pergunta é um tema que contém um array de <code>answerOptions</code>. Podemos chegar a esse array usando a notação de ponto: <code>questions[0].answerOptions</code></li><li>Como o <code>answerOptions</code> é um array, podemos mapeá-lo: <code>questions[0].answerOptions.map</code></li><li>Dentro da função <code>map()</code>, renderizamos um botão para cada <code>answerOption</code> e exibimos o texto</li></ul><h2 id="alterando-as-perguntas-usando-o-state"><strong>Alterando as perguntas usando o <em>state</em></strong></h2><p>Agora, vamos voltar ao nosso JSX. Observe como, se alterarmos <code>questions[0]</code> para <code>questions[1]</code> ou <code>questions[2]</code>, a interface do usuário será atualizada. Isso ocorre porque ele está obtendo os dados de diferentes perguntas em nosso array de perguntas, dependendo do índice.</p><p>O que queremos fazer é usar um tema de estado para manter a pergunta em que o usuário está no momento e atualizá-la quando um botão de resposta for clicado. Você pode ver isso ao executar o código no exemplo final.</p><p>Vá em frente e adicione um objeto de <em>state</em>, que conterá o <strong><strong>número da pergunta atual</strong></strong> em que o usuário está. Ele será inicializado em 0 para que o questionário pegue a primeira pergunta do array:</p><pre><code class="language-jsx">const [currentQuestion, setCurrentQuestion] = useState(0);
</code></pre><p>Agora, queremos substituir o "0" incorporado diretamente no código em nosso JSX por essa variável. Primeiro, para o texto da pergunta:</p><pre><code class="language-jsx">&lt;div className='question-text'&gt;{questions[currentQuestion].questionText}&lt;/div&gt;
</code></pre><p>Para a seção de perguntas, temos:</p><pre><code class="language-jsx">&lt;div className='answer-section'&gt;
	{questions[currentQuestion].answerOptions.map((answerOption, index) =&gt; (
		&lt;button&gt;{answerOption.answerText}&lt;/button&gt;
	))}
&lt;/div&gt;
</code></pre><p>Agora, se você inicializar a <strong><strong>currentQuestion</strong></strong> com algo diferente de 0, por exemplo, 1 ou 2, a interface do usuário será atualizada para mostrar a pergunta e as respostas dessa pergunta específica. Muito legal!</p><p>Vamos adicionar algum código para que, quando clicarmos em uma resposta, possamos incrementar o valor de <strong><strong>currentQuestion</strong></strong> para passarmos para a próxima pergunta.</p><p>Crie uma função chamada <strong><strong>handleAnswerButtonClick</strong></strong>. Ela será chamada quando o usuário clicar em uma resposta.</p><p>Vamos incrementar o valor da pergunta atual em um, salvá-lo em uma nova variável e definir essa nova variável no estado:</p><pre><code class="language-jsx">const handleAnswerButtonClick = (answerOption) =&gt; {
	const nextQuestion = currentQuestion + 1;
	setCurrentQuestion(nextQuestion);
};
</code></pre><p>Em seguida, adicione um evento <code>onClick</code> ao nosso botão, assim:</p><pre><code class="language-jsx">&lt;button onClick={() =&gt; handleAnswerButtonClick()}&gt;{answerOption.answerText}&lt;/button&gt;
</code></pre><p>Se testarmos isso, você verá que funciona, até chegarmos ao final:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/error.jpg" class="kg-image" alt="error" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/error.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/error.jpg 960w" sizes="(min-width: 720px) 720px" width="960" height="292" loading="lazy"></figure><p>Então, o que está acontecendo? Bem, em nossa função <strong><strong>handleAnswerButtonClick</strong></strong>, estamos incrementando o número e definindo-o como o <em>state</em>. Está certo.</p><p>Lembre-se, porém, de que usamos esse número para acessar um array, a fim de obter as opções de pergunta e resposta. Quando chegarmos a 5, ele causará um erro, pois não há um quinto elemento!</p><p>Vamos fazer uma verificação para garantir que não ultrapassemos o limite. Em nossa função handleAnswerButtonClick, vamos adicionar a seguinte condição:</p><pre><code class="language-jsx">if (nextQuestion &lt; questions.length) {
	setCurrentQuestion(nextQuestion);
} else {
	alert('you reached the end of the quiz');
}
</code></pre><p>Isso basicamente diz que, se o número da próxima pergunta for menor que o número total de perguntas, o <em>state</em> será atualizado para a próxima pergunta. Caso contrário, chegamos ao final do questionário e, portanto, um alerta é mostrado, por enquanto.</p><h2 id="exibi-o-da-tela-de-pontua-o"><strong>Exibição da tela de pontuação</strong></h2><p>Em vez de mostrar um alerta, o que queremos fazer é exibir a tela de "pontuação".</p><p>Se olharmos para o JSX, você perceberá que eu coloquei a marcação aqui para você. Só precisamos substituir "false" pela lógica.</p><p>Então, como podemos fazer isso? Bem, esse é o objeto perfeito para se colocar em um <em>state</em>!</p><p>Adicione outro objeto de <em>state</em> que armazenará se queremos mostrar a tela de pontuação ou não:</p><pre><code class="language-jsx">const [showScore, setShowScore] = useState(false);
</code></pre><p>E substitua <code>false</code> por <code>showScore</code> em nosso JSX:</p><pre><code class="language-jsx">&lt;div className='app'&gt;{showScore ? &lt;div className='score-section'&gt;// ... score section markup&lt;/div&gt; : &lt;&gt;// ... quiz question/answer markup&lt;/&gt;}&lt;/div&gt;
</code></pre><p>Nada mudará, mas, se alterarmos o valor do estado para "true", a <em>div</em> de pontuação será exibida. Isso ocorre porque tudo está envolvido em um condicional ternário, ou seja:</p><blockquote><em><em>“</em></em>Se showScore for verdadeiro, renderize a marcação da seção de pontuação; caso contrário, renderize a marcação da pergunta/resposta do teste.<em><em>”</em> </em></blockquote><p>Agora, queremos atualizar essa variável de <em>state</em> quando o usuário chegar ao final do questionário. Já escrevemos a lógica para isso em nossa função handleAnswerButtonClick.</p><p>Tudo o que precisamos fazer é substituir a lógica de alerta que atualiza a variável <strong><strong>showScore</strong></strong> para que seja verdadeira:</p><pre><code class="language-jsx">if (nextQuestion &lt; questions.length) {
	setCurrentQuestion(nextQuestion);
} else {
	setShowScore(true);
}
</code></pre><p>Se clicarmos nas respostas do questionário, ele mostrará a seção de pontuação quando chegarmos ao final. No momento, o texto e a pontuação mostrados são uma string inserida diretamente no código. Devemos, então, torná-la dinâmica.</p><h2 id="salvando-a-pontua-o"><strong>Salvando a pontuação</strong></h2><p>Nossa próxima tarefa é manter uma pontuação em algum lugar da nossa aplicação e incrementar esse valor se o usuário selecionar a opção correta.</p><p>O local lógico para fazer isso é na função "handleAnswerOptonClick".</p><p>Lembre-se de que, quando iteramos sobre as <strong><strong>answerOptions</strong></strong>, a função <code>map()</code> nos fornece um objeto para cada uma delas, que inclui o <strong><strong>questionText</strong></strong> e um<strong><strong> </strong>valor <strong>boolean</strong>o </strong>que mostra se a resposta está correta ou não. Esse booleano é o que usaremos para nos ajudar a incrementar nossa pontuação.</p><p>Em nosso botão, atualize a função da seguinte maneira:</p><pre><code class="language-jsx">onClick={()=&gt; handleAnswerButtonClick(answerOption.isCorrect)
</code></pre><p>Em seguida, atualize a função para que aceite o parâmetro a seguir:</p><pre><code class="language-jsx">const handleAnswerButtonClick = (isCorrect) =&gt; {
	//... other code
};
</code></pre><p>Agora, podemos adicionar alguma lógica aqui em nossa função. Por enquanto, queremos dizer que "se <code>isCorrect</code> for verdadeiro, queremos mostrar um alerta":</p><pre><code class="language-jsx">const handleAnswerButtonClick = (isCorrect) =&gt; {
	if (isCorrect) {
		alert(“the answer is correct!”)
	}

	//...other code
};
</code></pre><p>Isso é o mesmo que <code>if(isCorrect === true)</code>, apenas uma versão abreviada. Agora, se tentarmos fazer isso, você verá que receberemos um alerta quando clicarmos na resposta correta.</p><p>Só para recapitular até agora:</p><ul><li>Quando repetimos os botões, passamos o valor booleano <code>isCorrect</code> desse botão para a função <strong><strong>handleAnswerButtonClick</strong></strong>.</li><li>Na função, verificamos se esse valor é verdadeiro e, se for, exibimos um alerta.</li></ul><p>Em seguida, queremos realmente salvar a pontuação. Como você acha que podemos fazer isso? Se você disse "valor no <em>state</em>", está correto!</p><p>Vá em frente e adicione outro valor no <em>state</em> chamado "score" (pontuação). Lembre-se de prefixar a função para alterar o valor com "set" para que seja setScore. Inicialize-a com <code>0</code>:</p><pre><code class="language-jsx">const [score, setScore] = useState(0);
</code></pre><p>Em seguida, em vez de mostrar um alerta, queremos atualizar nossa pontuação em 1 se o usuário tiver acertado a resposta.</p><p>Em nossa função <strong><strong>handleAnswerButtonClick</strong></strong>, remova o alerta e aumente nossa pontuação em um:</p><pre><code class="language-jsx">const handleAnswerButtonClick = (isCorrect) =&gt; {
	if (answerOption.isCorrect) {
		setScore(score + 1);
	}

	//...other code
};
</code></pre><h2 id="exibi-o-da-pontua-o"><strong>Exibição da pontuação</strong></h2><p>Para mostrar a pontuação, basta fazer uma pequena alteração em nosso código de renderização. Em nosso JSX, remova a string inserida diretamente no código na seção de pontuação e adicione essa nova variável:</p><pre><code class="language-jsx">&lt;div className='score-section'&gt;
	You scored {score} out of {questions.length}
&lt;/div&gt;
</code></pre><pre><code class="language-jsx">&lt;div className='score-section'&gt;
	You scored {score} out of {questions.length}
&lt;/div&gt;
</code></pre><p>Agora, se revisarmos as respostas, a pontuação é dinâmica e será exibida corretamente no final!</p><p>Uma última coisa antes de encerrarmos nossa aplicação de questionário: você notará que a pergunta atual exibida na interface do usuário é sempre "1", pois isso está inserido diretamente no código. Precisamos mudar isso para que seja mais dinâmico.</p><p>Substitua o "question-count" pelo seguinte:</p><pre><code class="language-jsx">&lt;div className='question-count'&gt;
	&lt;span&gt;Question {currentQuestionIndex + 1}&lt;/span&gt;/{questions.length}
&lt;/div&gt;
</code></pre><p>Lembre-se de que precisamos do +1, pois os computadores começam a contar a partir de 0 e não do 1.</p><h2 id="deseja-mais-ideias-para-projetos"><strong>Deseja mais ideias para projetos?</strong></h2><p>Por que não tentar criar alguns projetos em React para melhorar ainda mais seu aprendizado? A cada duas semanas, o autor publica um novo projeto para que você experimente um exemplo funcional, um código inicial e dicas. <a href="https://subscribe.jschris.com/">Inscreva-se para receber as publicações diretamente na sua caixa de mensagens!</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Lazy loading no Angular – um guia para iniciantes sobre os NgModules ]]>
                </title>
                <description>
                    <![CDATA[ O que é lazy loading? O lazy loading (algo como "carregamento lento", em português) é o processo de carregamento de componentes, módulos ou outros ativos de um site, conforme necessário. Como o Angular cria uma SPA (Aplicação de Página Única) [https://en.wikipedia.org/wiki/Single-page_application#:~:text=From%20Wikipedia%2C%20the%20free%20encyclopedia,browser%20loading%20entire%20new%20pages.] , todos os seus componentes são carregados de uma ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/lazy-loading-no-angular-um-guia-para-iniciantes-sobre-os-ngmodules/</link>
                <guid isPermaLink="false">6488e5f8d1454605b613f0f3</guid>
                
                    <category>
                        <![CDATA[ Angular ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Mon, 03 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/cat-1.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/lazy-loading-in-angular-intro-to-ngmodules/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Lazy Loading in Angular – A Beginner's Guide to NgModules</a>
      </p><h2 id="o-que-lazy-loading">O que é <em>lazy loading</em><strong>?</strong></h2><p>O <em>lazy loading</em> (algo como "carregamento lento", em português) é o processo de carregamento de componentes, módulos ou outros ativos de um site, conforme necessário.</p><p>Como o Angular cria uma <a href="https://en.wikipedia.org/wiki/Single-page_application#:~:text=From%20Wikipedia%2C%20the%20free%20encyclopedia,browser%20loading%20entire%20new%20pages.">SPA (Aplicação de Página Única)</a>, todos os seus componentes são carregados de uma só vez. Isso significa que muitas bibliotecas ou módulos desnecessários também podem ser carregados.</p><p>Para uma aplicação pequena, não há problema. Porém, à medida que a aplicação cresce, o tempo de carregamento aumentará se tudo for carregado de uma vez. O lazy loading permite que o Angular carregue componentes e módulos como e quando eles forem necessários.</p><p>Em primeiro lugar, para entender como o <em>lazy loading</em> funciona no Angular, precisamos entender os blocos de construção básicos da estrutura: os <strong>NgModules</strong>.</p><h2 id="o-que-s-o-os-ngmodules"><strong>O que são os </strong>NgModules<strong>?</strong></h2><p>Bibliotecas do Angular, como RouterModule, BrowserModule e FormsModule são conhecidas como <strong>NgModules</strong>. <a href="https://material.angular.io/">Material Angular</a>, que é uma ferramenta de terceiros, também é um tipo de NgModule.</p><p>Os NgModules consistem em arquivos e códigos relacionados a um domínio específico ou que têm um conjunto semelhante de funcionalidades.</p><p>Um arquivo NgModule típico declara componentes, instruções, <em>pipes</em> e serviços. Ele também pode importar outros módulos que são necessários no módulo atual.</p><p>Uma das vantagens importantes dos NgModules é que eles podem ser carregados lentamente. Vamos dar uma olhada em como podemos configurar o carregamento lento.</p><p>Você pode <a href="https://www.freecodecamp.org/news/lazy-loading-in-angular-intro-to-ngmodules/#root-module">verificar abaixo</a> para ver como é um arquivo NgModule básico.</p><h2 id="como-criar-ngmodules"><strong>Como criar NgModules</strong></h2><p>Neste tutorial, criaremos dois módulos, <em><em><em><em>Módulo</em></em></em> <em><em>A</em></em></em> e <em><em><em>Módulo B</em></em></em>, que serão carregados lentamente. Na tela principal, teremos dois botões para carregar cada módulo de maneira lenta.</p><h3 id="crie-o-projeto"><strong>Crie o projeto</strong></h3><p>Crie um projeto do Angular chamado <em><em><em><em>lazy-load-demo</em></em></em></em> executando o comando abaixo:</p><pre><code>ng new lazy-load-demo --routing --style css
code lazy-load-demo
</code></pre><p>Aqui, estamos criando um novo projeto com roteamento. Além disso, mencionamos o formato da folha de estilo para CSS. O segundo comando abre seu projeto no VS Code.</p><h3 id="m-dulo-root"><strong>Módulo Root</strong></h3><p>Por padrão, um módulo raiz ou módulo de aplicação é criado em <em><em><em><em>/src/app</em></em></em></em>. Abaixo está o arquivo NgModule que é criado.</p><pre><code>import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

@NgModule({
  declarations: [
    AppComponent
  ],
  imports: [
    BrowserModule,
    AppRoutingModule
  ],
  providers: [],
  bootstrap: [AppComponent]
})
export class AppModule { }
</code></pre><p>Primeiro, importamos todos os módulos e componentes necessários.</p><p>Depois disso, o decorador <strong><strong><strong><strong><code>@NgModule</code></strong></strong></strong></strong> declara que a classe AppModule é um tipo de NgModule. O decorador aceita <em><em><em>declarações, importações, provedores </em></em></em>e<em><em><em><em> bootstrap. </em></em></em></em>Aqui estão as descrições de cada um deles:</p><ul><li><strong><strong><strong><strong>decla</strong></strong></strong>raçõe<strong><strong><strong>s</strong></strong></strong></strong>: os componentes deste módulo.</li><li><strong><strong><strong><strong>i</strong></strong></strong>mportações</strong>: os módulos que são exigidos pelo módulo atual.</li><li><strong><strong><strong><strong>prov</strong></strong></strong>edores</strong>: os provedores de serviços, se houver.</li><li><strong><strong><strong><strong>bootstrap</strong></strong></strong></strong>: o componente <em><em><em><em>root</em></em></em></em> que o Angular cria e insere na página da Web do host <code>index.html</code>.</li></ul><h3 id="tela-principal"><strong>Tela principal</strong></h3><p>A tela principal terá dois botões: <strong> Load Module<strong><strong><strong> A </strong></strong></strong></strong>e<strong><strong><strong> </strong></strong>Load Module B<strong><strong>.</strong></strong></strong> Como o nome sugere (Carregar o módulo A e Carregar o módulo B, respectivamente), clicar nesses botões carregará lentamente cada módulo.</p><p>Para isso, substitua seu arquivo <em><em><em><em>app.component.html</em></em></em></em> pelo conteúdo abaixo.</p><pre><code>&lt;button style="padding: 20px; color: white; background-color: green;" routerLink="a"&gt;Load Module A&lt;/button&gt;
&lt;button style="padding: 20px; color: white; background-color: blue;" routerLink="b"&gt;Load Module B&lt;/button&gt;
&lt;router-outlet&gt;&lt;/router-outlet&gt;
</code></pre><p>Vamos definir os módulos para as rotas <em><em><em><em>a </em></em></em></em>e <em><em><em><em>b</em></em></em></em>.</p><h3 id="m-dulos-de-carregamento-lento"><strong>Módulos de carregamento lento</strong></h3><p>Para criar módulos carregados de modo lento, execute os comandos abaixo:</p><pre><code>ng generate module modulea --route a --module app.module
ng generate module moduleb --route b --module app.module
</code></pre><p>Os comandos gerarão duas pastas, chamadas <strong><strong><strong><strong>modulea</strong></strong></strong></strong> e <strong><strong><strong><strong>moduleb</strong></strong></strong></strong>. Cada pasta conterá seus próprios arquivos <em><em><em>module.ts</em></em></em>,<em><em><em> routing.ts </em></em></em> e <em><em><em>component</em></em></em>.</p><p>Se você verificar seu <em><em><em><em>app-routing.module.ts</em></em></em></em>, verá o código abaixo para as rotas:</p><pre><code>const routes: Routes = [
  { path: 'a', loadChildren: () =&gt; import('./modulea/modulea.module').then(m =&gt; m.ModuleaModule) },
  { path: 'b', loadChildren: () =&gt; import('./moduleb/moduleb.module').then(m =&gt; m.ModulebModule) }
];
</code></pre><p>Isso implica que, quando a rota <em><em><em><em>a</em></em></em></em> ou <em><em><em><em>b </em></em></em></em>é visitada, carrega seus respectivos módulos de maneira lenta.</p><p>Ao executar o projeto com <strong><strong><strong><strong>ng serve</strong></strong></strong></strong>, você verá a tela abaixo:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screenshot-2021-04-25-at-11.18.55-PM.png" class="kg-image" alt="Screenshot-2021-04-25-at-11.18.55-PM" width="434" height="210" loading="lazy"><figcaption>Página inicial</figcaption></figure><p>Ao clicar no botão <em><em><em><em>Load Module A</em></em></em></em>, você será direcionado para a página <em><em><em><em>a</em></em></em></em>. Esta é a aparência da sua tela:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screenshot-2021-04-25-at-11.18.14-PM.png" class="kg-image" alt="Screenshot-2021-04-25-at-11.18.14-PM" width="483" height="245" loading="lazy"><figcaption>Módulo A carregado em lazy loading</figcaption></figure><p>Você deverá ver uma tela semelhante que diz <strong><strong><strong><strong>moduleb </strong></strong></strong>works<strong><strong><strong>! </strong></strong></strong></strong> quando clicar em <em><em><em>Load Module B.</em></em></em></p><h2 id="como-verificar-se-o-lazy-loading-funcionou"><strong>Como verificar se o <em>lazy loading </em>funcionou</strong></h2><p>Para verificar se os arquivos foram carregados, abra as ferramentas de desenvolvedor pressionando F12. Depois disso, visite a aba <em><em><em><em>Network</em></em></em></em>, como pode ser visto na captura de tela abaixo. Quando você atualizar a página, ela mostrará alguns arquivos que foram solicitados.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Network-Tab-1.jpg" class="kg-image" alt="Network-Tab-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/Network-Tab-1.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/06/Network-Tab-1.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/06/Network-Tab-1.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Network-Tab-1.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1173" loading="lazy"><figcaption>Aba Network (Rede) nas ferramentas do desenvolvedor</figcaption></figure><p>Vá em frente e limpe sua lista de solicitações pressionando o botão <em>Clear </em>(Limpar), conforme mostrado na imagem abaixo.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screenshot-2021-04-25-at-11.42.21-PM.png" class="kg-image" alt="Screenshot-2021-04-25-at-11.42.21-PM" width="131" height="160" loading="lazy"></figure><p>Ao clicar em <em><em><em><em>Load Module A</em></em></em></em>, você verá uma solicitação para <em><em><em><em>modulea-modulea-module.js</em></em></em></em>, como na captura de tela abaixo. Isso verifica se o <em><em><em><em>Módulo A </em></em></em></em>foi carregado de maneira lenta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screenshot-2021-04-25-at-11.46.50-PM.png" class="kg-image" alt="Screenshot-2021-04-25-at-11.46.50-PM" width="419" height="171" loading="lazy"><figcaption>Módulo A carregado</figcaption></figure><p>Do mesmo modo, quando você clica em <em><em><em>Load Module B</em></em></em>, o arquivo <em><em><em>moduleb-moduleb-module.js</em></em></em> é carregado. Isso verifica se o Módulo B foi carregado de maneira lenta.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/Screenshot-2021-04-25-at-11.47.10-PM.png" class="kg-image" alt="Screenshot-2021-04-25-at-11.47.10-PM" width="452" height="201" loading="lazy"><figcaption>Módulo B carregado</figcaption></figure><p>Agora, quando você tentar clicar nos botões, ele não carregará esses arquivos <em><em>js</em></em> novamente.</p><h2 id="casos-de-uso-para-os-ngmodules"><strong>Casos de uso para os NgModules</strong></h2><p>Como vimos, é muito fácil criar módulos de <em>lazy loading</em>. Há muitos casos de uso em que eles são úteis, como:</p><ul><li>Criação de um módulo separado para telas de pré-login e pós-login.</li><li>Em um site <em>e-commerce</em>, as telas voltadas para o fornecedor e as telas voltadas para o cliente podem pertencer a módulos separados. Você também pode criar um módulo separado para pagamento.</li><li>Geralmente, é criado um <em>CommonModule</em> separado, que contém componentes, instruções ou <em>pipelines </em>compartilhados. Instruções como o botão <em><em>Copy Code</em></em> e componentes como <em><em>upvote/downvote</em></em> geralmente são incluídos em um módulo comum.</li></ul><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Para sites menores, talvez não seja muito importante que todos os módulos sejam carregados de uma só vez. Porém, à medida que o site cresce, é útil ter módulos separados, que são carregados conforme necessário.</p><p>Devido ao <em>lazy loading</em>, o tempo de carregamento dos sites pode ser reduzido drasticamente. Isso é especialmente útil quando se está tentando obter uma classificação mais elevada para SEO. Mesmo que não seja o caso, tempos de carregamento mais curtos significam uma melhor experiência do usuário.</p><p>Você tem interesse em mais tutoriais? Dê uma olhada nestes recursos (em inglês):</p><ul><li><a href="https://arjavdave.com/2021/04/14/learn-test-driven-development-with-integration-tests-in-net-5-0/">Learn TDD with Integration Tests in .NET</a></li><li><a href="https://arjavdave.com/2021/03/31/net-5-setup-authentication-and-authorisation/">How to authenticate &amp; authorise API’s correctly in .NET</a></li><li><a href="https://arjavdave.com/2021/03/22/azure-functions-wkhtmltopdf/">Azure Functions &amp; wkhtmltopdf: Convert HTML to PDF</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Componentes funcionais x componentes de classe no React Native ]]>
                </title>
                <description>
                    <![CDATA[ No React Native, há dois tipos principais de componentes que compõem uma aplicação: componentes funcionais e componentes de classe. Eles são estruturados do mesmo modo que seriam em uma aplicação para a web normal do React. Componentes de classe Os componentes de classe são classes do JavaScript ES2015 que estendem ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/componentes-funcionais-x-componentes-de-classe-no-react-native/</link>
                <guid isPermaLink="false">645da45215c958056bc6d335</guid>
                
                    <category>
                        <![CDATA[ React Native ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Tue, 30 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/5f9c9dcf740569d1a4ca39c4.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/functional-vs-class-components-react-native/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Functional vs Class Components in React Native</a>
      </p><p>No React Native, há dois tipos principais de componentes que compõem uma aplicação: <strong>componentes funcionais</strong> e <strong><strong>c</strong>omponentes de<strong> </strong>classe</strong>. Eles são estruturados do mesmo modo que seriam em uma aplicação para a web normal do React.</p><h2 id="componentes-de-classe"><strong>Componentes de classe</strong></h2><p>Os componentes de classe são classes do JavaScript ES2015 que estendem uma classe base do React chamada <code>Component</code>.</p><pre><code class="language-js">class App extends Component {
    render () {
        return (
            &lt;Text&gt;Hello World!&lt;/Text&gt;
        )
    }
}</code></pre><p>Isso dá para a classe <code>App</code> acesso aos métodos do ciclo de vida do React, como <code>render</code>, bem como às funcionalidades de <em>state</em>/<em>props</em> dos componentes pai.</p><h2 id="componentes-funcionais"><strong>Componentes funcionais</strong></h2><p>Os componentes funcionais são mais simples. Eles não gerenciam seu próprio <em>state</em> nem têm acesso aos métodos de ciclo de vida fornecidos pelo React Native. Eles são, literalmente, funções do JavaScript antigas e simples – às vezes, chamados de componentes sem estado (do inglês, <em>stateless</em>).</p><pre><code class="language-js">const PageOne = () =&gt; {
    return (
        &lt;h1&gt;Page One&lt;/h1&gt;
    );
}</code></pre><h2 id="sum-rio"><strong>Sumário</strong></h2><p>Os componentes de classe são usados como componentes de contêiner para lidar com o gerenciamento do <em>state</em> e para integrar componentes secundários.</p><p>Os componentes funcionais geralmente são usados apenas para fins de exibição – esses componentes chamam funções dos componentes pai para lidar com interações do usuário ou atualizações do <em>state</em>.</p><h2 id="mais-informa-es-sobre-o-estado-do-componente"><strong>Mais informações sobre o estado do componente</strong></h2><h3 id="estado-do-componente"><strong>Estado do componente</strong></h3><p>Nos componentes <code>Class</code>, há uma maneira de armazenar e gerenciar o <em>state</em> criado no React Native.</p><pre><code class="language-javascript">class App extends Component {
  constructor () {
    super();
    this.state = {
      counter: 0
    };
  }
  incrementCount () {
    this.setState({
      counter: this.state.counter + 1
    });
  }
  decrementCount () {
    this.setState({
      counter: this.state.counter - 1
    });
  }
  render () {
    return (
      &lt;View&gt;
        &lt;Text&gt;Count: {this.state.counter}&lt;/Text&gt;
        &lt;Button onPress={this.decrementCount.bind(this)}&gt;-&lt;/Button&gt;
        &lt;Button onPress={this.incrementCount.bind(this)}&gt;+&lt;/Button&gt;
      &lt;/View&gt;
    );
  }
}</code></pre><p>O <em>state </em>é semelhante às <em>props</em>, mas é privado e totalmente controlado pelo componente. Aqui, o método <code>constructor()</code> chama o construtor da classe pai com <code>super();</code> – <strong><strong><strong><strong><code>Component</code></strong></strong></strong></strong> é a classe pai do <code>App</code>, pois estamos usando a palavra-chave <code>extends</code>. O método <code>constructor()</code> também inicializa o objeto de <em>state</em> do componente:</p><pre><code class="language-text">this.state = {
  counter: 0
};</code></pre><p>O <em>state </em>pode ser exibido dentro do componente:</p><pre><code class="language-js">{this.state.counter}</code></pre><p>Ele também pode ser atualizado pela chamada:</p><pre><code class="language-js">this.setState({});</code></pre><p><strong>Observação<strong><strong><strong>:</strong></strong></strong></strong> após a criação inicial no método <code>constructor()</code> do componente, você nunca deve modificar diretamente o <em>state</em> do componente com <code>this.state =</code>. Você deve usar <code>this.setState</code>, como pode ser visto nas funções <code>incrementCount</code> e <code>decrementCount</code> acima.</p><p>A contagem é ampliada e reduzida ao chamar as funções passadas para os manipuladores <code>onPress</code> do mesmo modo que seriam se você chamasse um manipulador de clique do JavaScript na web.</p><p><em><em>A</em>dendo<em>: </em>no primeiro exemplo<em>, <code>&lt;Button&gt;</code> </em>é um componente personalizado<em>; </em>se trata de uma combinação de<em> <code>&lt;TouchableOpacity&gt;</code> </em>e<em> <code>&lt;Text&gt;</code> </em>da<em> </em>API do<em> React Nativ</em>e<em>:</em></em></p><pre><code class="language-js">const Button = ({ onPress, children, buttonProps, textProps }) =&gt; {
  const { buttonStyle, textStyle } = styles;
  return (
    &lt;TouchableOpacity onPress={onPress} style={[buttonStyle, buttonProps]}&gt;
      &lt;Text style={[textStyle, textProps]}&gt;
        {children}
      &lt;/Text&gt;
    &lt;/TouchableOpacity&gt;
  );
};</code></pre><h2 id="mais-informa-es-sobre-o-react-native-"><strong>Mais informações sobre o React Native:</strong></h2><ul><li><a href="https://www.freecodecamp.org/news/react-native-guide/">Guia do React Native</a> (em inglês)</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ As melhores bibliotecas de gráficos para JavaScript ]]>
                </title>
                <description>
                    <![CDATA[ Primeiro, uma breve história: Com a coleta e utilização de dados seguindo em seu aumento exponencial, a necessidade de visualizar estes dados está se tornando cada vez mais importante. Os desenvolvedores procuram consolidar milhões de registros de bases de dados em belos gráficos e painéis que os humanos possam interpretar ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/as-melhores-bibliotecas-de-graficos-para-javascript/</link>
                <guid isPermaLink="false">64526827e704550645dff419</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Mon, 22 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/1_Aom0Yz2zVQZdBiiByborCA.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/these-are-the-best-javascript-chart-libraries-for-2019-29782f5e1dc2/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">These are the best JavaScript chart libraries for 2019</a>
      </p><p>Primeiro, uma breve história:</p><p>Com a coleta e utilização de dados seguindo em seu aumento exponencial, a necessidade de visualizar estes dados está se tornando cada vez mais importante. Os desenvolvedores procuram consolidar milhões de registros de bases de dados em belos gráficos e painéis que os humanos possam interpretar de maneira rápida e intuitiva.</p><p>A tecnologia de visualização de dados continuou a melhorar na última década e muitas bibliotecas de gráficos avançadas estão agora disponíveis para os consumidores. No início dos anos 2000, a geração de gráficos era dominada por gráficos de imagens bitmap do lado do servidor. <em>Plug-ins</em> como o Flash e o Silverlight ofereciam uma experiência de criação de gráficos mais interativa, mas com um grande impacto na velocidade de transferência, na duração da bateria e nos recursos do sistema.</p><p>Com a explosão da utilização de dispositivos móveis e tablets, os <em>plug-ins</em> deixaram de ser suportados nas principais plataformas e os desenvolvedores tiveram de mudar para tecnologias abertas do lado do <em>client</em> que podiam ser executadas em qualquer lugar. Ao mesmo tempo, o advento de telas de resolução muito alta e o zoom mais comum através de gestos tácteis trouxeram para a primeira linha os gráficos vetoriais independentes da resolução.</p><p>Chegamos na era atual da visualização de dados, dominada pelo JavaScript e pelo SVG (Gráficos Vetoriais Escaláveis). Os gráficos são agora executados em todos os navegadores, sem <em>plug-ins</em> especiais, suportam interatividade e animações e têm um aspecto nítido mesmo nos dispositivos de resolução mais elevada. Ao analisar mais de 50 bibliotecas de visualização, estes 9 produtos destacaram-se:</p><h4 id="d3-js"><strong><strong><a href="https://d3js.org/" rel="noopener"><strong><strong>D3.js</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/S6EaFX5GX8yUIDvllrXDeYc2fONsQL-8jMUL.jpg" class="kg-image" alt="S6EaFX5GX8yUIDvllrXDeYc2fONsQL-8jMUL" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/S6EaFX5GX8yUIDvllrXDeYc2fONsQL-8jMUL.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/S6EaFX5GX8yUIDvllrXDeYc2fONsQL-8jMUL.jpg 700w" width="700" height="397" loading="lazy"></figure><p>D3.js é uma biblioteca gráfica do JavaScript muito extensa e poderosa. Permite associar dados arbitrários a um Modelo de Objeto de Documento (DOM) e, em seguida, aplicar transformações baseadas em dados ao documento.</p><p>O D3 vai muito além das típicas bibliotecas gráficas, incluindo muitos outros módulos técnicos menores, tais como eixos, cores, hierarquias, contornos, suavização, polígonos e muito mais. Tudo isto contribui para uma curva de aprendizagem acentuada.</p><p>Tentar criar um simples gráfico pode ser complicado. Todos os elementos incluindo eixos e outros itens do gráfico precisam ser explicitamente definidos. Muitos modelos mostram como o CSS pode ser utilizado para dar estilo aos elementos do gráfico. Nenhuma característica baseada em gráficos é aplicada automaticamente. Se quiser ir mais longe e utilizar a criatividade para controlar totalmente cada elemento, esta é a melhor opção. Ao trabalhar em horário reduzido para cumprir os requisitos de um projeto de visualização de dados, pode não ser a melhor opção para começar do zero.</p><p>O D3.js pode ser um bloco de construção para uma biblioteca de gráficos. Os desenvolvedores vêm utilizando o D3 para facilitar a utilização de soluções de gráficos que o consomem, como o NVD3.</p><p>O D3.js é de código aberto e de utilização gratuita.</p><h4 id="jscharting"><strong><strong><a href="https://jscharting.com/" rel="noopener"><strong><strong>JSCharting</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hTX6DIAPWYObB4LCQ--zfJIRrW1q85peGy3A.jpg" class="kg-image" alt="hTX6DIAPWYObB4LCQ--zfJIRrW1q85peGy3A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/hTX6DIAPWYObB4LCQ--zfJIRrW1q85peGy3A.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/hTX6DIAPWYObB4LCQ--zfJIRrW1q85peGy3A.jpg 700w" width="700" height="324" loading="lazy"></figure><p>A biblioteca de gráficos JSCharting suporta muitos tipos de gráficos, incluindo mapas, gráficos de Gantt, mapas em estoque e outros que frequentemente requerem bibliotecas separadas para serem utilizados. Inclui mapas incorporados de todos os países do mundo e uma biblioteca de ícones SVG. Um conjunto de micrográficos autónomos pode ser apresentado em qualquer etiqueta de gráfico ou em qualquer elemento div numa página. Os controles de IU (UiItems) também estão incluídos, permitindo gráficos interativos mais ricos. É fácil controlar os dados ou as variáveis de visualização em tempo real e os gráficos podem ser exportados para os formatos SVG, PNG, PDF e JPG.</p><p>A galeria está dividida em amostras de tipos de gráficos e de características. O estilo do gráfico é polido e produz alguns gráficos de aparência limpa. Os visuais gerais proporcionam uma experiência de gráficos limpa e profissional.</p><p>Os modelos incluídos utilizam um objeto de configuração para personalizar os gráficos. As definições para criar e controlar os tipos de gráficos são muito simples de utilizar. São necessárias poucas definições de propriedades para especificar tipos de gráficos mais complexos. O JSCharting tem predefinições fortes e dinâmicas, o que significa que tenta escolher automaticamente as melhores definições para os cenários.</p><p>A documentação inclui muitos tutoriais e descrições completas das propriedades da API. Muitas propriedades incluem exemplos de utilização e ligações de amostra.</p><p>O JSCharting é gratuito para utilização não comercial e pessoal e oferece opções de licença comercial que incluem todos os tipos de gráficos e produtos por uma única taxa.</p><h4 id="highcharts"><strong><strong><a href="https://www.highcharts.com/" rel="noopener"><strong><strong>Highcharts</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/2syqkeQ3kQi2mhDSFfsqV57jiG810QWR7b7G.jpg" class="kg-image" alt="2syqkeQ3kQi2mhDSFfsqV57jiG810QWR7b7G" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/2syqkeQ3kQi2mhDSFfsqV57jiG810QWR7b7G.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/2syqkeQ3kQi2mhDSFfsqV57jiG810QWR7b7G.jpg 700w" width="700" height="267" loading="lazy"></figure><p>Highcharts é uma biblioteca popular de gráficos do JavaScript utilizada por muitas das maiores empresas do mundo. Os gráficos são gerados usando SVG e recorrem à VML para compatibilidade com versões anteriores até o IE6/IE8. Os gráficos de teste demonstram um conjunto de recursos bastante rico, mas não impressionam visualmente. A documentação geral inclui tutoriais para muitos tópicos relevantes e a documentação da API é completa.</p><p>O gráfico utiliza opções de configuração para criar gráficos e a API é fácil de utilizar.</p><p>O Highcharts é gratuito para utilização não comercial e pessoal. O licenciamento comercial é necessário para outras utilizações e os gráficos de stock, de mapas e gráficos de Gantt são licenciados de forma separada.</p><h4 id="amcharts"><strong><strong><a href="https://www.amcharts.com/" rel="noopener"><strong><strong>amCharts</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/g5AOK1ltx8xdH2JFXp3iw7fcZAYJ5pthfFdG.jpg" class="kg-image" alt="g5AOK1ltx8xdH2JFXp3iw7fcZAYJ5pthfFdG" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/g5AOK1ltx8xdH2JFXp3iw7fcZAYJ5pthfFdG.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/g5AOK1ltx8xdH2JFXp3iw7fcZAYJ5pthfFdG.jpg 700w" width="700" height="259" loading="lazy"></figure><p>O amCharts lançou recentemente a sua versão 4, que adiciona um forte motor de animação SVG que permite criar cenas semelhantes a filmes.</p><p>Os gráficos de teste têm uma aparência muito agradável. A maioria dos testes oferece uma série de paletas e uma IU deslizante para ajustar as variáveis do gráfico em tempo real. A documentação inclui muitos tutoriais e descrições completas das propriedades da API.</p><p>A criação de um gráfico é um pouco diferente da abordagem baseada na configuração e, em vez disso, utiliza uma API mais declarativa. Requer um pouco mais de código para configurar os gráficos, mas oferece uma melhor experiência de preenchimento de código.</p><p>O amCharts oferece uma licença gratuita com gráficos marcados e licenças pagas para outras utilizações.</p><h4 id="google-charts"><strong><strong><a href="https://developers.google.com/chart/" rel="noopener"><strong><strong>Google Charts</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/fPisdLR3HjGBrfbCAzc75uXc5IO9wsf2wj-f.jpg" class="kg-image" alt="fPisdLR3HjGBrfbCAzc75uXc5IO9wsf2wj-f" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/fPisdLR3HjGBrfbCAzc75uXc5IO9wsf2wj-f.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/fPisdLR3HjGBrfbCAzc75uXc5IO9wsf2wj-f.jpg 700w" width="700" height="259" loading="lazy"></figure><p>Os gráficos do Google são poderosos e fáceis de utilizar.</p><p>Os exemplos de gráficos têm um aspecto limpo e são agradáveis à vista. A galeria e a galeria expandida mostram muitos tipos de gráficos, mas pressionar o menu de hambúrguer revela mais tipos (como o calendário) que não são mostrados nestas listas da galeria.</p><p>Cada tipo de gráfico tem um tutorial dedicado com exemplos ao vivo. Os tutoriais incluem código para os recursos relacionados e listagens de API. Esta é uma experiência agradável para começar com uma nova biblioteca de gráficos.</p><p>Os gráficos são personalizados utilizando o objeto de opções de configuração. Os conjuntos de dados são preenchidos usando uma classe DataTable que pode ser consumida por todos os gráficos. Cada tipo de gráfico tem opções únicas listadas nos tutoriais específicos do tipo. A nomeação de propriedades é padronizada e muitas opções funcionam em todos os tipos.</p><p>Os Gráficos do Google são gratuitos, mas há uma ressalva. Trata-se de um serviço da web e não pode ser hospedado localmente. No passado, a Google retirou as APIs. Por isso, se a sua utilização for de missão crítica, poderá querer escolher outra opção.</p><h4 id="zingchart"><strong><strong><a href="https://www.zingchart.com/" rel="noopener"><strong><strong>ZingChart</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/7UxG9uthgcsC-fYPf0GEXgJY6A3X6C187ggy.jpg" class="kg-image" alt="7UxG9uthgcsC-fYPf0GEXgJY6A3X6C187ggy" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/7UxG9uthgcsC-fYPf0GEXgJY6A3X6C187ggy.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/7UxG9uthgcsC-fYPf0GEXgJY6A3X6C187ggy.jpg 700w" width="700" height="319" loading="lazy"></figure><p>O ZingChart oferece muitos tipos de gráficos e integra-se com Angular, React e outros <em>frameworks</em>. Ele tem um forte conjunto de recursos com muitas opções de personalização.</p><p>Os gráficos de teste mostram uma série de temas de estilo, alguns dos quais parecem ser melhores que outros, mas as opções para os estilizar conforme necessário estão lá. Os gráficos de teste não apresentam todos os tipos de gráficos disponíveis.</p><p>A documentação inclui tutoriais para todos os tipos disponíveis, um bom número de funcionalidades e uma listagem completa da API.</p><p>O ZingChart usa opções de configuração para personalizar os gráficos. As amostras incluem muitas configurações de propriedade, como estilo de fonte. Elas podem atrapalhar a compreensão de quais configurações são necessárias para um determinado gráfico.</p><p>O ZingChart pode ser utilizado gratuitamente com a marca. Está disponível um licenciamento pago para utilização sem marca.</p><h4 id="fusioncharts"><strong><strong><a href="https://www.fusioncharts.com/" rel="noopener"><strong><strong>FusionCharts</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7k3uk0H59ImJz2wBVa6zBRCx8J6euicz1ZW.jpg" class="kg-image" alt="b7k3uk0H59ImJz2wBVa6zBRCx8J6euicz1ZW" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/b7k3uk0H59ImJz2wBVa6zBRCx8J6euicz1ZW.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/b7k3uk0H59ImJz2wBVa6zBRCx8J6euicz1ZW.jpg 700w" width="700" height="319" loading="lazy"></figure><p>O FusionCharts existe há muitos anos, tendo começado como um <em>plug-in </em>de gráficos baseado em Flash. É uma biblioteca de visualização de gráficos robusta. Suporta muitos formatos de dados, incluindo XML, JSON e JavaScript, funciona em navegadores modernos e é compatível com versões anteriores ao IE6. Muitas das estruturas do JavaScript e linguagens de programação laterais do servidor também são suportadas.</p><p>A galeria de gráficos inclui muitos exemplos e o seu aspecto visual é simples.</p><p>A documentação inclui boas descrições da API e exemplos de cada tipo de gráfico. As propriedades de configuração estão agrupadas por tarefas e características do gráfico.</p><p>Os gráficos são criados utilizando opções baseadas na configuração e são relativamente fáceis de utilizar. A lista de propriedades pode ser longa quando nos aprofundamos na API. Todas as propriedades de configuração são superficiais, como {chartLeftMargin, showAlternateHGridColor}. Parece uma tentativa de melhorar o preenchimento de código.</p><p>O FusionCharts é gratuito para utilização pessoal com a marca no gráfico. Está disponível um licenciamento pago para utilização comercial e sem marca.</p><h4 id="koolchart"><strong><strong><a href="https://www.koolchart.com/" rel="noopener"><strong><strong>KOOLCHART</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3iWJw51bCnMDw4QKpjP-0k-lZsoX0DUNnzL5.jpg" class="kg-image" alt="3iWJw51bCnMDw4QKpjP-0k-lZsoX0DUNnzL5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/3iWJw51bCnMDw4QKpjP-0k-lZsoX0DUNnzL5.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/3iWJw51bCnMDw4QKpjP-0k-lZsoX0DUNnzL5.jpg 700w" width="700" height="319" loading="lazy"></figure><p>O KoolChart é uma biblioteca de gráficos de JavaScript baseada na tela do HTML5. Também está disponível um produto de mapeamento e grade.</p><p>A sua nova versão v5 inclui um conjunto de funcionalidades mais interativas e um estilo atualizado. Os visuais são limpos e modernos. A utilização de telas oferece um melhor desempenho em detrimento do fato de ser baseado em dados de rasterização.</p><p>As amostras utilizam um XML baseado em cadeias de caracteres para aplicar opções de gráficos, o que parece menos prático do que outros modelos. Estas opções assemelham-se ao HTML5, mas são definidas através de uma instrução em JavaScript.</p><p>A API está bem documentada com exemplos de gráficos para cada propriedade. Também está disponível um manual em PDF de 173 páginas.</p><p>Está disponível um período teste de dois meses para avaliação. O licenciamento é necessário após a expiração do período teste.</p><h4 id="chart-js"><strong><strong><a href="https://www.chartjs.org/" rel="noopener"><strong><strong>Chart.js</strong></strong></a></strong></strong></h4><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/ewHuQvOha7Jgzn2rLM8jzoz5caFNhU7IuQCw.jpg" class="kg-image" alt="ewHuQvOha7Jgzn2rLM8jzoz5caFNhU7IuQCw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/ewHuQvOha7Jgzn2rLM8jzoz5caFNhU7IuQCw.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/ewHuQvOha7Jgzn2rLM8jzoz5caFNhU7IuQCw.jpg 700w" width="700" height="257" loading="lazy"></figure><p>O Chart.js é uma biblioteca do JavaScript de código aberto que suporta 8 tipos de gráficos. É uma pequena biblioteca do JS, com apenas 60kb. Os tipos incluem gráficos de linhas, gráficos de barras, gráficos de área, radar, gráficos de tartes, bolhas, gráficos de pontos e mistos. Uma série temporal também é suportada. Utiliza o elemento da tela para renderização e é responsivo ao redimensionamento da janela para manter a granularidade da escala. É compatível com versões anteriores ao IE9. Estão disponíveis <em>polyfills </em>para funcionar também com o IE7.</p><p>As amostras visuais possuem um aspecto bastante moderno e incluem animações iniciais quando se desenha pela primeira vez. Faz a animação tranquilamente quando se adicionam séries ou pontos de dados em tempo real. As opções do gráfico podem ser modificadas depois e a chamada de uma função update() redesenha o gráfico.</p><p>O código-fonte de amostra não é apresentado na galeria do site, mas está disponível no repositório do GitHub. As opções de configuração são utilizadas para criar e modificar gráficos. A API de opções é limpa e intuitiva.</p><p>A documentação é completa e inclui tutoriais com a API de propriedades e trechos de código.</p><p>O Chart.js é uma biblioteca de código aberto e de utilização gratuita para uso pessoal e comercial, o que é uma vantagem. O número limitado de tipos pode ser um problema para requisitos de painéis de controle mais avançados.</p><h4 id="conclus-o"><strong><strong><strong><strong>Conclus</strong></strong></strong>ão</strong></h4><p>O ecossistema de bibliotecas gráficas JavaScript evoluiu consideravelmente ao longo da última década. Atualmente, existem muitos produtos de gráficos que atendem a requisitos muito diversos, servindo a uma ampla gama de projetos por meio de centenas de tipos de gráficos. A maioria das bibliotecas fornece uma versão teste gratuita ou uma versão marcada que permite avaliar a eficácia gráfica com os seus próprios dados, carregamento e complexidade do projecto.</p><p>É fácil para a maioria das bibliotecas de gráficos lidar com conjuntos de dados curados simples e visualizações estáticas. No entanto, os gráficos nem sempre lidam bem com as coisas quando são visualizados dados dinâmicos do mundo real. Pode ser necessário mais trabalho para ajustar e organizar os elementos para que os gráficos pareçam corretos. Este ajuste manual pode falhar à medida que novos dados dinâmicos são visualizados.</p><p>Para selecionar a melhor solução de gráficos JS para as suas necessidades específicas, recomendo que teste os seus próprios dados com algumas das bibliotecas listadas acima para garantir a opção ideal para os seus projetos atuais e futuros.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como se tornar um Engenheiro de Software – plano de ação para 2023 ]]>
                </title>
                <description>
                    <![CDATA[ Engenheiros de softwares estão em alta demanda hoje em dia. Em geral, eles recebem salários confortáveis e podem ter um bom equilíbrio entre vida pessoal e profissional. O que faz, no entanto, um engenheiro de software? Como você pode se tornar um por conta própria? Neste artigo, explicarei as tarefas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/</link>
                <guid isPermaLink="false">644d2d12e704550645dfe58c</guid>
                
                    <category>
                        <![CDATA[ Engenharia de software ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Carlos Silva. ]]>
                </dc:creator>
                <pubDate>Sun, 21 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/pexels-christina-morillo-1181675.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-become-a-software-engineer-2023-roadmap/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Become a Software Engineer – Detailed Roadmap</a>
      </p><p>Engenheiros de softwares estão em alta demanda hoje em dia. Em geral, eles recebem salários confortáveis e podem ter um bom equilíbrio entre vida pessoal e profissional.</p><p>O que faz, no entanto, um engenheiro de software? Como você pode se tornar um por conta própria?</p><p>Neste artigo, explicarei as tarefas e responsabilidades dos engenheiros de software e abordarei algumas das áreas em que estes se especializam mais frequentemente.</p><p>Também listarei algumas das habilidades mais importantes caso você queira se tornar um engenheiro de software por conta própria.</p><p>Aqui está o que abordaremos:</p><ol><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#o-que-engenharia-de-software">O que é engenharia de software?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#o-que-faz-um-engenheiro-de-software"> O que faz um engenheiro de software?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#quais-s-o-as-especializa-es-em-engenharia-de-software">Quais são as especializações em engenharia de software?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#por-que-escolher-uma-carreira-em-engenharia-de-software">Por que escolher uma carreira em engenharia de software?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#como-se-tornar-um-engenheiro-de-software">Como se tornar um engenheiro de software</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#escolha-o-seu-ambiente-educativo-diploma-universit-rio-x-bootcamp-x-aprendizagem-autodidata-">Escolha o seu ambiente educativo – diploma universitário x bootcamp x aprendizagem autodidata</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#aprenda-a-aprender-desenvolva-h-bitos-efetivos-de-estudo">Aprenda a aprender</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#aprenda-uma-linguagem-de-programa-o">Aprenda uma linguagem de programação</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#aprenda-estruturas-de-dados-e-algoritmos">Aprenda estruturas de dados e algoritmos</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#aprenda-a-arquitetura-de-bancos-de-dados-e-sql">Aprenda a arquitetura de bancos de dados e SQL</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#aprenda-como-utilizar-ferramentas-de-engenharia-de-software">Aprenda como utilizar ferramentas de engenharia de software</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-engenheiro-de-software-plano-de-acao-para-2023/#desenvolva-suas-habilidades-n-o-t-cnicas">Desenvolva suas habilidades não técnicas</a></li></ol><p>Vamos começar!</p><h2 id="o-que-engenharia-de-software"><strong>O que é engenharia de software?</strong></h2><p>Todos os dias, é provável que visite vários sites e utilize aplicações para a web e para dispositivos móveis.</p><p>Essas ferramentas modernas possuem centenas ou até milhares de linhas de código por trás delas. Essas linhas de códigos foram escritas por um engenheiro de software.</p><p>Engenharia de software é o processo de elaboração, construção, teste, implementação e manutenção de produtos de software voltados aos clientes, sistemas informáticos complexos para computadores e ferramentas úteis. Os engenheiros de software fazem isso usando metodologias de engenharia de software, princípios da ciência da computação e linguagens de programação.</p><p>Os engenheiros de software escrevem código para hardware, sistemas operacionais, sistemas embarcados, redes, aplicações empresariais, sites ou videogames.</p><p>Eles apresentam soluções estratégicas que atendem às necessidades dos usuários finais e da empresa para a qual trabalham. O código que escrevem resolve um problema específico do mundo real.</p><h2 id="o-que-faz-um-engenheiro-de-software"><strong>O que faz um engenheiro de software?</strong></h2><p>De um modo geral, aqui estão algumas das tarefas e responsabilidades dos engenheiros de software no dia a dia:</p><ul><li>Coletar e analisar as necessidades e os requisitos dos usuários e entender como utilizam o software.</li><li>Organizar os requisitos dos usuários em categorias individuais para implementar as sugestões e o feedback deles.</li><li>Usar linguagens de programação para elabora e criar sistemas de software e aplicações que atendam aos requisitos dos usuários.</li><li>Criar software eficiente, confiável, seguro, acessível e fácil de utilizar.</li><li>Testar, corrigir bugs, solucionar e manter os sistemas de software existentes.</li><li>Otimizar o código em termos de qualidade, desempenho, velocidade e escalabilidade.</li><li>Resolver problemas que possam surgir e ajudar a empresa a atingir os seus objetivos.</li><li>Criar fluxogramas, documentação e especificações técnicas que descrevam todo o processo do início ao fim para ajudar a partilhar resultados e soluções com outros membros da equipe.</li><li>Consultar com membros de diferentes equipes da organização.</li><li>Apresentar novas funcionalidades e atualizações aos investidores e aos clientes.</li></ul><p>Dito isto, as tarefas e responsabilidades dependem da área em que o engenheiro de software se especializa.</p><h2 id="quais-s-o-as-especializa-es-em-engenharia-de-software"><strong>Quais são as especializações em engenharia de software?</strong></h2><p>Engenharia de software é um setor diversificado, ou seja, há muitas áreas em que um engenheiro de software pode se especializar.</p><p>Aqui estão algumas das especializações mais comuns em engenharia de software:</p><h3 id="desenvolvimento-de-front-end-para-a-web"><strong>Desenvolvimento de <em>front-end </em>para a web</strong></h3><p>O <a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-de-front-end-habilidades-para-desenvolver-para-a-web/">desenvolvimento de <em>front-end</em> para a web</a> é uma área que envolve elaboração, construção e teste da Experiência do Usuário (UX), Interface do Usuário (UI) e as partes de sites e aplicações para a web que os usuários veem ou com as quais interagem.</p><p>Desenvolvedores de <em>front-end</em> utilizam linguagens como HTML, CSS, JavaScript e as suas estruturas e bibliotecas associadas.</p><h3 id="desenvolvimento-de-back-end-para-a-web"><strong>Desenvolvimento de <em>back-end </em>para a web</strong></h3><p>O <a href="https://www.freecodecamp.org/news/front-end-developer-vs-back-end-developer-definition-and-meaning-in-practice/">desenvolvimento de back-end para a web</a> (texto em inglês), também conhecido como desenvolvimento lateral do servidor, é uma área que envolve construção e manutenção das partes dos sites das aplicações para a web que os usuários não veem e com as quais não interagem – principalmente, a funcionalidade dos bastidores dos sites.</p><p>Lida com bancos de dados, arquitetura web, servidores, autenticação de usuários, autorização, manuseamento e processamento de pedidos de usuários, interfaces de programação de aplicações (as APIs) e garantia de que a lógica adequada está em vigor para que o <em>front-end</em> tenha o que precisa para funcionar de maneira eficiente.</p><h3 id="desenvolvimento-full-stack-para-a-web"><strong>Desenvolvimento <em>full-stack </em>para a web</strong></h3><p>O <a href="https://www.freecodecamp.org/news/learn-full-stack-development-html-css-javascript-node-js-mongodb/">desenvolvimento full-stack para a web</a> (texto em inglês) é uma área que envolve elaboração, construção, teste e implementação do <em>front-end</em> e do <em>back-end</em> dos sites e aplicações para a web do início ao fim.</p><h3 id="desenvolvimento-para-dispositivos-m-veis"><strong>Desenvolvimento para dispositivos móveis</strong></h3><p>O <a href="https://www.freecodecamp.org/news/what-is-mobile-app-development/">desenvolvimento para dispositivos móveis</a> (texto em inglês) é uma área que envolve elaboração e construção de aplicações de software que funcionam em dispositivos móveis, como smartphones e tablets com os sistemas operacionais iOS e Android.</p><h3 id="desenvolvimento-de-jogos"><strong>Desenvolvimento de jogos</strong></h3><p>O <a href="https://www.freecodecamp.org/news/what-is-game-development/">desenvolvimento de jogos</a> (texto em inglês) é uma área que envolve elaboração e construção de jogos que funcionam em uma variedade de plataformas, como PCs, consoles, navegadores da web e dispositivos móveis.</p><h3 id="desenvolvimento-de-aplica-es-para-desktop"><strong>Desenvolvimento de aplicações para desktop</strong></h3><p>O <a href="https://www.freecodecamp.org/news/build-a-sudoku-java-desktop-application/">desenvolvimento de aplicações para desktop</a> (texto em inglês) é uma área que envolve construção de aplicações de software que funcionem em computadores desktop locais e que tenham uma interface gráfica de utilizador (GUI), como um processador de texto ou um editor de imagens.</p><h3 id="desenvolvimento-de-sistemas-operacionais">Desenvolvimento de sistemas operacionais</h3><p>O <a href="https://www.freecodecamp.org/news/what-is-an-os-operating-system-definition-for-beginners/">desenvolvimento de sistemas operacionais</a> (texto em inglês) é uma área que envolve o desenvolvimento do hardware e da plataforma para que outras aplicações de software sejam executadas, como Linux, macOS e Windows.</p><h3 id="devops"><strong>DevOps</strong></h3><p>O <a href="https://www.freecodecamp.org/news/devops-engineering-course-for-beginners/">DevOps</a> (texto em inglês) é uma área que envolve a utilização de processos, metodologias e ferramentas que automatizam, gerem e melhoram a infraestrutura e as operações das aplicações de software ao longo do ciclo de vida do desenvolvimento de software.</p><h3 id="computa-o-em-nuvem"><strong>Computação em nuvem</strong></h3><p>A <a href="https://www.freecodecamp.org/news/what-is-cloud-computing-beginners-guide/">computação em nuvem</a> (texto em inglês) é uma área que envolve a elaboração e o desenvolvimento de serviços baseados em nuvem para a construção de sistemas escaláveis e fiáveis.</p><h3 id="ciberseguran-a"><strong>Cibersegurança</strong></h3><p>A <a href="https://www.freecodecamp.org/news/10-tools-you-should-know-as-a-cybersecurity-engineer/">cibersegurança</a> (texto em inglês) é uma área que envolve a garantia da segurança de aplicações e sistemas de software e a sua proteção contra acesso ilegal, malware, ameaças, vulnerabilidades e diferentes tipos de crimes cibernéticos.</p><h2 id="por-que-escolher-uma-carreira-em-engenharia-de-software"><strong>Por que escolher uma carreira em engenharia de software?</strong></h2><p>Você pode querer escolher uma carreira em engenharia de software por algumas razões.</p><p>Em primeiro lugar, a tecnologia evolui a um ritmo acelerado e está em constante mudança – há muitos novos desenvolvimentos praticamente todos os dias.</p><p>Engenheiros de software aprendem constantemente coisas novas para se manterem atualizados com as últimas mudanças. São aprendizes ao longo da vida.</p><p>Se você é curioso e adora aprender novas habilidades e maneiras de fazer as coisas e não gosta de ficar estagnado e de fazer tarefas monótonas, pode ser que goste de brincar com as novas tecnologias e ferramentas que surgem.</p><p>Outro indicador de que a engenharia de software pode ser a escolha certa para a sua carreira é o fato de gostar de resolver problemas difíceis.</p><p>Os engenheiros de software são solucionadores de problemas. Utilizam a lógica e a criatividade para resolver os problemas do seu empregador ou cliente.</p><p>Se é racional, analítico e metódico, pode adorar o processo de resolver problemas lógicos complexos e construir coisas úteis.</p><p>Poderá também optar por uma carreira na área da engenharia de software, uma vez que os engenheiros de software são muito procurados.</p><p>O <a href="https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm">Departamento de Estatísticas do Trabalho dos EUA</a> (link em inglês) prevê um aumento de 25% no crescimento das perspectivas de emprego até 2031, o que é muito mais rápido do que a média.</p><p>Diversas indústrias precisam de engenheiros de software, incluindo agências governamentais, organizações sem fins lucrativos, <em>start-ups</em>, empresas de consultoria, instituições de ensino, empresas financeiras e de saúde, bem como empresas varejistas e de entretenimento, para citar apenas algumas. Atualmente, quase todas as empresas são empresas tecnológicas.</p><p>Os engenheiros de software também costumam ter salários confortáveis.</p><p>De acordo com o <a href="https://www.bls.gov/ooh/computer-and-information-technology/software-developers.htm">Departamento de Estatísticas do Trabalho dos EUA</a> (link em inglês), o salário médio dos engenheiros de software é de US$ 109.020,00 por ano.</p><p>Dito isto, o salário dependerá de sua localização e dos anos de experiência.</p><p>Para ter uma ideia melhor, pesquise no Google o salário médio dos engenheiros de software da sua região com o mesmo nível de experiência que o seu.</p><p>Outra razão para querer uma carreira em engenharia de software é o fato de permitir o trabalho remoto, a flexibilidade do local de trabalho, horários flexíveis e um bom equilíbrio entre a vida profissional e pessoal.</p><p>Para saber mais sobre como encontrar uma função de programador remoto, leia <a href="https://www.freecodecamp.org/news/remote-work-how-to-find-remote-working-jobs-from-home/">este artigo</a> (texto em inglês).</p><h2 id="como-se-tornar-um-engenheiro-de-software"><strong>Como se tornar um engenheiro de software</strong></h2><p>Nas seções seguintes, explicarei como se tornar um engenheiro de software e listarei algumas das habilidades técnicas interpessoais que precisará aprender. Também fornecerei alguns recursos para que possa começar.</p><p>Por favor, tenha em mente que não se trata de uma lista exaustiva das habilidades de que precisará, mas serve como algumas sugestões-chave do que poderá ser útil para a sua jornada de aprendizagem.</p><h3 id="escolha-o-seu-ambiente-educativo-diploma-universit-rio-x-bootcamp-x-aprendizagem-autodidata-"><strong>Escolha o seu ambiente educativo – diploma universitário x bootcamp x aprendizagem autodidata.</strong></h3><p>Engenharia de software requer muito estudo e aprendizagem.</p><p>Portanto, o primeiro passo para se tornar um engenheiro de software é pensar a respeito de suas opções educacionais e que caminho você quer seguir.</p><h4 id="diploma-em-ci-ncias-da-computa-o"><strong>Diploma em ciências da computação</strong></h4><p>Uma das opções – a mais tradicional para se tornar um engenheiro de software – é obter um diploma universitário de quatro anos e <a href="https://www.freecodecamp.org/news/what-you-learn-in-a-4-year-computer-science-degree-35a95457cb06/">especializar-se em Ciências da Computação</a> (texto em inglês) ou um programa de especialização em matemática e ciências.</p><p>Um <a href="https://www.freecodecamp.org/news/how-to-choose-a-computer-science-degree-program-2c67687bfb2e/">diploma de Ciências da Computação</a> (texto em inglês) de uma universidade acreditada é altamente respeitado por alguns empregadores e considerado uma credencial impressionante (e para alguns, ainda necessária) no seu currículo.</p><p>Dito isto, obter um diploma é um investimento e uma caminho a seguir – os diplomas universitários, porém, não são baratos.</p><p>De acordo com a <a href="https://survey.stackoverflow.co/2022/#developer-profile-education">pesquisa de Desenvolvedores do Stack Overflow de 2022</a> (texto em inglês), contudo, a maioria dos desenvolvedores (87%) tem algum tipo de formação na área, com algum curso superior ou mais.</p><p>Apesar de <a href="https://www.freecodecamp.org/news/do-you-need-a-computer-science-degree-to-work-in-tech/">você não necessariamente precisar de um diploma</a> (texto em inglês) para se tornar um engenheiro de software e de os empregadores se preocuparem mais com o fato de você possuir as competências e a experiência necessárias, pode valer a pena investir para abrir mais oportunidades de emprego.</p><h4 id="bootcamp-de-programa-o"><strong>Bootcamp de programação</strong></h4><p>Outra opção é inscrever-se em um <a href="https://www.freecodecamp.org/news/coding-bootcamp-handbook/">bootcamp de programação</a> (texto em inglês).</p><p>Bootcamps são programas de treinamento intensivo e ambientes de aprendizagem que ensinam as habilidades técnicas necessárias para conseguir um emprego em engenharia de software. A duração média de um bootcamp é de cerca de vinte a trinta semanas.</p><p>A aprendizagem baseia-se normalmente em projetos e, no final do programa, você terá um portfólio de trabalhos para apresentar a potenciais empregadores.</p><p>Dito isto, não deixa de ser um caminho a se tomar, embora caro. Alguns bootcamps cobram quantias que chegam aos cinco dígitos (em dólar) apenas por alguns meses de formação e podem também não ser o ambiente adequado para você e suas circunstâncias de vida.</p><h4 id="ensine-a-si-mesmo-a-programar"><strong>Ensine a si mesmo a programar</strong></h4><p>Outra opção é <a href="https://www.freecodecamp.org/news/my-best-tips-for-new-developers-advice-from-a-mostly-self-taught-software-engineer-9cb2f6238177/">aprender a programar por contra própria</a> (texto em inglês) e criar seu plano de estudo autodidata utilizando recursos gratuitos ou pagos, como livros, tutoriais em vídeos e cursos interativos.</p><p>Aprender por conta própria é uma boa opção se você é uma pessoa ocupada, que tem responsabilidades na vida – como cuidar da família – ou não pode deixar o seu emprego integral para mudar de carreira.</p><p>Você pode aprender ao seu próprio tempo e ritmo e criar o seu horário individual de acordo com o tempo livre que tem.</p><p>Pode começar com o <a href="https://www.freecodecamp.org/portuguese/learn/">currículo do freeCodeCamp</a>, que é gratuito e baseado em projetos.</p><p>Em resumo, embora durante muitos anos a obtenção de um diploma formal tenha sido considerado o modo padrão de trabalhar como engenheiro de software, existem atualmente outras vias para escolher, como a participação em um bootcamp ou a aprendizagem autodidata.</p><h3 id="aprenda-a-aprender-desenvolva-h-bitos-efetivos-de-estudo"><strong>Aprenda a aprender – desenvolva hábitos efetivos de estudo</strong></h3><p>Não importa o estilo de ensino que escolherá, terá que aprender como aprender de maneira eficaz para tirar o máximo proveito dos seus estudos e solidificar a sua aprendizagem.</p><p>Aprender a aprender permitirá que <a href="https://ncase.me/remember/">processe e fixe qualquer coisa mais rapidamente</a> (link em inglês) que você pode precisar usar como engenheiro de software. A profissão requer aprendizagem constante no trabalho.</p><p>Existem técnicas de aprendizagem que, apesar de parecerem intuitivamente corretas, fazem mais mal do que bem e são ineficazes, uma vez que exigem pouco esforço cognitivo.</p><p>Essas técnicas ineficazes são a releitura passiva, a tomada de notas e o destaque/sublinha.</p><p>As duas estratégias de aprendizagem mais eficazes e cognitivamente exigentes para reter informação são a <a href="https://pt.wikipedia.org/wiki/Efeito_de_testagem">recordação ativa</a> e <a href="https://pt.wikipedia.org/wiki/Repeti%C3%A7%C3%A3o_espa%C3%A7ada">repetição espaçada</a>.</p><p>A recordação ativa consiste em fazer perguntas a si próprio e recordar as ideias principais do que acabou de ler/aprender.</p><p>O cérebro faz ligações mais fortes quando recupera informação e não quando a recebe – o processo de recuperação reforça a aprendizagem profunda.</p><p>A repetição espaçada é uma prática que reduz a curva de esquecimento que temos naturalmente como seres humanos. É natural que nos esqueçamos das coisas que aprendemos.</p><p>A repetição espaçada envolve a revisão frequente do que você aprendeu – isso o ajuda a construir seu conhecimento ao longo do tempo.</p><p>Uma boa ferramenta para praticar repetição espaçada é usando o <a href="https://apps.ankiweb.net/">Anki</a> (link em inglês), uma aplicação de <em>flashcards </em>com um algoritmo por trás que mostra o conteúdo em intervalos de tempo – sempre quando você estiver prestes a esquecê-lo.</p><p>Para saber mais sobre aprendizagem e a criação de hábitos de estudo eficazes, dê uma olhada no <a href="https://www.coursera.org/learn/learning-how-to-learn">curso na Coursera sobre aprender a aprender</a> (em inglês).</p><h3 id="aprenda-uma-linguagem-de-programa-o"><strong>Aprenda uma linguagem de programação</strong></h3><p>Como um engenheiro de software, você precisará de um conhecimento aprofundado de, pelo menos, uma ou, por vezes, duas ou mais linguagens de programação.</p><p>Terá de compreender conceitos como variáveis, tipos de dados, declarações condicionais, lógica booleana, laços de repetição, <em>arrays</em>, operadores e entrada/saída, para citar apenas alguns.</p><p>Há centenas de linguagens de programação para escolher. Cada uma delas tem os seus casos de utilização específicos.</p><p>A linguagem de programação que escolherá vai depender da área de engenharia de software que você queira se especializar.</p><p>Algumas das mais populares são as seguintes:</p><ul><li><a href="https://www.freecodecamp.org/news/what-is-javascript-javascript-code-explained-in-plain-english/">JavaScript</a> (texto em inglês) – uma linguagem de script que funciona em um navegador da web e é utilizada para criar o <em>front-end </em>e o <em>back-end </em>de aplicações para a web.</li><li><a href="https://www.freecodecamp.org/news/what-is-python-used-for-10-coding-uses-for-the-python-programming-language/"></a><a href="https://www.freecodecamp.org/portuguese/news/para-que-serve-o-python-mais-de-10-casos-de-utilizacao-da-linguagem-de-programacao-python/">Python</a> – uma linguagem lateral do servidor de uso geral, normalmente utilizada para o desenvolvimento web back-end.</li><li><a href="https://www.freecodecamp.org/news/java-for-backend-web-development/">Java</a> (texto em inglês) – uma linguagem multifuncional normalmente utilizada para desenvolver aplicações para várias plataformas, incluindo aplicações para a internet e para Android.</li><li><a href="https://www.freecodecamp.org/news/how-to-learn-the-c-programming-language/">C++</a> (texto em inglês) – uma linguagem popular para o desenvolvimento de sistemas operacionais, aplicações e jogos.</li></ul><p>Para saber mais sobre essas linguagens, veja os seguintes recursos (em inglês) para começar:</p><ul><li><a href="https://www.freecodecamp.org/news/full-javascript-course-for-beginners/">Curso completo de JavaScript para iniciantes</a></li><li><a href="https://www.freecodecamp.org/news/python-programming-course/">Curso gratuito de programação em Python</a></li><li><a href="https://www.freecodecamp.org/news/learn-java-free-java-courses-for-beginners/">Aprenda Java – cursos gratuitos de Java para iniciantes</a></li><li><a href="https://www.freecodecamp.org/news/learn-c-with-free-31-hour-course/">Aprenda programação C++ para iniciantes – curso de 31 horas gratuito</a></li></ul><h3 id="aprenda-estruturas-de-dados-e-algoritmos"><strong>Aprenda estruturas de dados e algoritmos</strong></h3><p>As estruturas de dados e os algoritmos são tópicos que provavelmente surgirão com frequência durante as suas entrevistas de emprego em engenharia de software.</p><p>Uma base sólida em estruturas de dados e algoritmos vai permitir que você se saia melhor na resolução de problemas, em encontrar soluções mais eficientes e práticas para os problemas e escrever código mais escalável e de mais fácil manutenção.</p><p>Estruturas de dados são áreas de armazenamento para guardar e organizar elementos de dados, de modo que os computadores possam realizar os cálculos com esses elementos com mais precisão e eficiência.</p><p>Um algoritmo é uma série de instruções passo a passo bem definidas e precisas. Essas instruções dizem ao computador como executar uma determinada tarefa que resolverá um problema específico.</p><p>Um algoritmo recebe um <em>input </em>(em português, entrada) e produz um dado que resolve o problema em questão.</p><p>Para aprender mais sobre estruturas de dados e algoritmos, dê uma olhada <a href="https://www.freecodecamp.org/news/algorithms-and-data-structures-free-treehouse-course/">neste curso</a> (em inglês).</p><h3 id="aprenda-a-arquitetura-de-bancos-de-dados-e-sql"><strong>Aprenda a arquitetura de bancos de dados e SQL</strong></h3><p>Saber como armazenar, manter, gerir e elaborar a arquitetura de um banco de dados será útil como programador. Terá de saber como executar operações de bancos de dados – nomeadamente, as operações CRUD (que significa Criar, Ler, Atualizar, Deletar) – e escrever consultas básicas em SQL. Afinal de contas, as aplicações de software complexas e de grande escala precisam lidar com grandes quantidades de dados.</p><p>Você deve querer aprender sobre os diferentes tipos de bancos de dados, tais como as diferenças entre bancos de dados relacionais e não relacionais (também conhecidos como bancos de dados NoSQL).</p><p>Você também pode querer estudar SQL. SQL, que significa linguagem de consulta estruturada (do inglês, <em>Structured Query Language</em>), é uma linguagem de consulta para pesquisar e manipular dados em bancos de dados relacionais.</p><p>Para saber mais sobre como lidar com bancos de dados e escrever consultas SQL, consulte a certificação de <a href="https://www.freecodecamp.org/portuguese/learn/relational-database/">bancos de dados relacionais do freeCodeCamp</a>.</p><h3 id="aprenda-como-utilizar-ferramentas-de-engenharia-de-software"><strong>Aprenda como utilizar ferramentas de engenharia de software</strong></h3><p>Como um engenheiro de software, utilizará diversas ferramentas no seu trabalho do dia a dia.</p><p>Algumas delas que mais utilizará são:</p><ul><li>o <a href="https://www.freecodecamp.org/news/git-for-professionals/">Git</a>, que é um sistema de controle de versão e uma ferramenta colaborativa. Com o Git, você pode trabalhar com outros desenvolvedores no mesmo projeto e acompanhar as alterações no código;</li><li>o <a href="https://www.freecodecamp.org/news/git-and-github-crash-course/">GitHub</a>, que é um serviço de hospedagem popular que permite compartilhar o seu código com o mundo;</li><li>a <a href="https://www.freecodecamp.org/news/command-line-for-beginners/">linha de comandos</a>, que é uma aplicação que permite interagir com o sistema operacional subjacente e o sistema de arquivos através de comandos baseados em texto;</li><li>um <a href="https://www.freecodecamp.org/news/what-is-an-ide-for-beginners/">IDE (ou Ambiente de Desenvolvimento Integrado)</a>, que é uma aplicação de software que permite escrever código de modo eficiente e produtivo. Especificamente, é onde você escreve, edita, executa, testa e depura o seu código. Os IDEs oferecem funcionalidades como realce de sintaxe, que facilitam a leitura do código e a detecção de erros e atalhos de teclado que poupam tempo.</li></ul><h3 id="desenvolva-suas-habilidades-n-o-t-cnicas"><strong>Desenvolva suas habilidades não técnicas</strong></h3><p>Embora o desenvolvimento das suas habilidades técnicas seja necessário para se tornar um engenheiro de software profissional, você não pode negligenciar as suas habilidades não técnicas (muitas vezes referidas como interpessoais).</p><p>O estereótipo dos engenheiros de software que trabalham isolados, sozinhos em uma sala e sem falar com ninguém está longe da realidade.</p><p>Como um engenheiro de software, você, normalmente, colaborará com outras pessoas e sendo parte de uma equipe. Precisará de fortes habilidades interpessoais para ser uma membro valioso da equipe.</p><p>É necessário <a href="https://www.freecodecamp.org/news/how-to-cultivate-great-communication-skills-as-a-dev-and-kick-bad-habits-to-the-curb-d62a075700f5/">comunicar com eficácia</a> (texto em inglês) suas ideias de um modo claro e fácil de compreender, uma vez que trabalhará frequentemente com outros membros da equipe que não têm o mesmo nível de conhecimentos técnicos que você.</p><p>Como construirá aplicações de software para um público diversificado, terá de ter empatia com os seus usurários finais e compreender o tipo de problemas que estes podem enfrentar. Ter <a href="https://www.freecodecamp.org/news/how-empathy-makes-you-a-better-software-engineer/">empatia</a> (texto em inglês) significa colocar-se no lugar dos outros e ser capaz de ver as perspectivas dos outros. Isto ajuda-o a se tornar um desenvolvedor e solucionador de problemas mais eficaz.</p><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>Esperamos que este artigo tenha sido útil para você e que tenha compreendido melhor o que envolve a engenharia de software.</p><p>Neste artigo, analisamos as tarefas e responsabilidades dos engenheiros de software e algumas das razões pelas quais esta carreira pode ser uma boa opção para você. Também vimos algumas das habilidades que você precisará desenvolver para se tornar um engenheiro de software.</p><p>Obrigado pela leitura!</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
