<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Stanley Gomes</title>
    <description>The latest articles on DEV Community by Stanley Gomes (@stanley).</description>
    <link>https://dev.to/stanley</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F511211%2F9a385842-d6a9-4def-bed0-ca5af6dfe9e6.jpeg</url>
      <title>DEV Community: Stanley Gomes</title>
      <link>https://dev.to/stanley</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/stanley"/>
    <language>en</language>
    <item>
      <title>Sobre Micro Front-ends</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Sat, 18 Dec 2021 11:47:30 +0000</pubDate>
      <link>https://dev.to/stanley/sobre-micro-front-ends-3ihb</link>
      <guid>https://dev.to/stanley/sobre-micro-front-ends-3ihb</guid>
      <description>&lt;p&gt;Hoje eu vou abordar um tema que está em pleno uso e cada vez mais se tornando um padrão de arquitetura de desenvolvimento no frontend, o conceito de Micro Front-end.&lt;/p&gt;

&lt;p&gt;Não posso falar de Micro Front-end sem abordar a forma como eram construídas as aplicações antes do seu surgimento. Antigamente, ao desenvolver uma aplicação frontend, todo o código era feito dentro um repositório e totalmente interdependente. &lt;/p&gt;

&lt;p&gt;Com o tempo, os programadores foram adaptando várias formas de separar o frontend, de forma que ele se tornasse mais desacoplado.&lt;/p&gt;

&lt;p&gt;Com o surgimento do conceito de Micro Front-end, agora uma aplicação é dividida em módulos de forma que algumas partes específicas da tela são separadas em diferentes repositórios.&lt;/p&gt;

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

&lt;p&gt;Cada módulo é uma aplicação com sua stack particular (react, angular, vue etc), funcionando de forma independente, sem um estado global ou compartilhamento de recursos.&lt;/p&gt;

&lt;p&gt;Apesar de serem independentes, os micro serviços no frontend precisam ter alguma forma de se comunicar, afinal, juntos eles são uma única aplicação. Geralmente usa-se o recurso de localstorage ou frameworks específicas para lidar com esse cenário, como o &lt;a href="https://single-spa.js.org" rel="noopener noreferrer"&gt;Single SPA&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Por fim, com todo esse hype sobre esse tema, acabam aparecendo os questionamentos: "Será que devo parar de escrever aplicações monlíticas?". A resposta é simples: Não. Cada projeto vai demandar uma arquitetura própria pensada considerando o resultado que se espera. O micro front-ends são flexíveis para grandes aplicações,  com escalabilidade e várias equipes, mas não são tão vantajosos para projetos com poucas pessoas.&lt;/p&gt;

&lt;p&gt;Se você quiser contribuir mais sobre o conceito de Micro Front-ends, comenta aqui embaixo.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>microservices</category>
      <category>microfrontend</category>
      <category>webdev</category>
    </item>
    <item>
      <title>Monorepo? O que é? Devo usar?</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 03 Nov 2021 16:09:25 +0000</pubDate>
      <link>https://dev.to/stanley/monorepo-o-que-e-devo-usar-133c</link>
      <guid>https://dev.to/stanley/monorepo-o-que-e-devo-usar-133c</guid>
      <description>&lt;p&gt;Monorepo é simplesmente a definição de arquitetura em que você utiliza apenas um repositório que podem conter vários projetos ao inves de distribuir esses projetos em vários repositórios. Você pode ter, por exemplo, um repositório que contenha um subdiretório de sua aplicação web, outro para seu aplicativo e outro para sua API.&lt;/p&gt;

&lt;p&gt;Esses projetos estão conectados e podem compartilhar o gerenciamento de dependências.&lt;/p&gt;

&lt;p&gt;Quando se fala em Monorepo, rapidamente vem a comparação com outra arquitetura que é a de Polirepo. Fazendo o paralelo entre elas, podemos notar semelhanças e diferenças.&lt;/p&gt;

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

&lt;p&gt;As principais semelhanças são inerentes a própria forma como são essas arquiteturas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Existem projetos (grandes e pequenos) bem sucedidos utilizando utilizando Monorepo ou Polirepo, como também existem projetos que fracassaram utilizando qualquer um dos dois;&lt;/li&gt;
&lt;li&gt;Ambas arquiteturas são simples de manter, implementar e escalar quando o projeto está no começo. Quando ele começa a crescer as dificuldades de manter um super repositório crescem, no caso do Monorepo e as dificuldades de manter dezenas ou centenas de repositórios também crescem, no caso do Polirepo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Isso mostra que não existe uma arquitetura superior e sim que o desenvolvedor precisa analisar quando deve usar um caso ou outro.&lt;/p&gt;

&lt;p&gt;Podemos citar alguns problemas nessa arquitetura.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Pasta .git pode ficar gigante no repositório;&lt;/li&gt;
&lt;li&gt;O Git clone fica lento;&lt;/li&gt;
&lt;li&gt;Alto número de commits e de branchs afetam a performance do repositório;&lt;/li&gt;
&lt;li&gt;Tempo de build pode ser demorado (pelo número de arquivos);&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Algumas soluções que podem ser implementadas.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Manter poucas branchs que tenham uma longa vida para que o git tenha que se preocupar com menos referencias;&lt;/li&gt;
&lt;li&gt;Colocar arquivos de midia como gif, imagens e vídeos em um outro serviço, como o Git LFS;&lt;/li&gt;
&lt;li&gt;Não limita o acesso a determinadas partes do código a equipes ou pessoas específicas;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;
&lt;p&gt;Monorepo é diferente de repositório monolito&lt;/p&gt;
&lt;/blockquote&gt;

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

&lt;p&gt;Agora vamos para os pontos positivos de utilização do conceito de Monorepo.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Em um único lugar você tem todas as configurações, CI/CD, testes de forma que tudo fica padronizado para todos os subprojetos;&lt;/li&gt;
&lt;li&gt;Refatorar um problema ou uma melhoria de uma vez só em vários projetos em um único pull request (dependencia com problema de segurança, por exemplo);&lt;/li&gt;
&lt;li&gt;Gerenciamento e manutenção de dependencias centralizada e simplificada;&lt;/li&gt;
&lt;li&gt;Reutilização e compartilhamento de código para executar uma mesma tarefa em múltiplos repositórios;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se você conhece algum outra informação relevante sobre os Monorepos, comenta aqui embaixo.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>monorepo</category>
      <category>cleancode</category>
      <category>architecture</category>
    </item>
    <item>
      <title>Escalonando aplicações frontend</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 20 Oct 2021 12:59:07 +0000</pubDate>
      <link>https://dev.to/stanley/escalonando-aplicacoes-frontend-37od</link>
      <guid>https://dev.to/stanley/escalonando-aplicacoes-frontend-37od</guid>
      <description>&lt;p&gt;Sempre que começamos a desenvolver um novo projeto de software, temos que considerar a escalabilidade de até onde e quantas pessoas vão conseguir utilizar nossa ferramenta simultaneamente. É um consenso que escalar a aplicação é um grande desafio e envolve um planejamento desde o início do desenvolvimento.&lt;/p&gt;

&lt;p&gt;Nesse post, o objetivo é abordar os tópicos sobre dicas de por onde começar a escalar o seu código frontend. Quando falamos sobre escalar a infraestrutura (seja verticalmente ou horizontalmente), fica mais fácil de entender e executar, mas quando se trata de código, a demanda é se aprofundar mais no assunto.&lt;/p&gt;

&lt;h2&gt;
  
  
  Código escalável
&lt;/h2&gt;

&lt;p&gt;Um código escalável tem fundamentos básicos que podemos definir como regras. Começamos definindo que o código precisa ser eficiente e como, de maneira geral, ele vai utilizar os recursos de processamento do cliente, para que ele possa ser acessado a partir do maior número de pessoas, ele precisa ter eficiência de processamento, baixo consumo de banda e &lt;a href="https://www.w3schools.com/html/html_responsive.asp" rel="noopener noreferrer"&gt;responsividade&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Outros fatores fundamentais para um código escalável é possuir recursos pequenos e independentes (&lt;a href="https://medium.com/@tbaragao/solid-s-r-p-single-responsibility-principle-2760ff4a7edc" rel="noopener noreferrer"&gt;single responsability principle&lt;/a&gt;), que podem ser servidos de forma independente. Isso é requisito para facilitar manutenção e provisão de recursos.&lt;/p&gt;

&lt;p&gt;Abaixo vou tentar listar algumas outras dicas para escalonar o seu frontend:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Backend desacoplado do frontend, escalation separado;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Se sua aplicação tem &lt;a href="https://www.treinaweb.com.br/blog/spa-e-ssr-quais-as-diferencas" rel="noopener noreferrer"&gt;SSR&lt;/a&gt; (server side rendering) garanta que apenas as páginas que realmente precisam ser geradas no server sejam;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Lazy loading: Carregue apenas recursos que sejam necessários na usabilidade do usuário. Os demais recursos serão carregados sob demanda (Scripts, imagens, fontes, css);&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Trabalhe com CDN e caching com eficiência para reduzir o consumo de recursos de servidor de forma inteligênte e diminuir tempo de resposta e carregamento do frontend;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Reduza a complexidade do código e trabalhe com código limpo. Dessa forma, toda equipe terá facilidade de entender, evoluir e corrigir o código, evitando bugs inesperados e indisponibilidade da plataforma. É muito importante também que você remova o código e funcionalidades que não são utilizadas;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Transite o mínimo necessário de informação nas requests para o backend para reduzir o consumo de recursos de banda e aumentar velocidade de resposta;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Crie testes automatizados para garantir mais velocidade de entrega com menos riscos de quebra da aplicação;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Monitore sua aplicação com rotinas automatizadas que gerem métricas e capturem erros, como por exemplo, o Sentry(&lt;a href="https://sentry.io" rel="noopener noreferrer"&gt;https://sentry.io&lt;/a&gt;);&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Se você conhece alguma outra técnica para otimizar o frontend, comenta aqui embaixo.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

&lt;p&gt;Este post foi baseado no artigo do Nagendra Prajwal:&lt;br&gt;
&lt;a href="https://www.linkedin.com/pulse/intro-scalable-frontend-what-how-write-one-nagendra-prajwal" rel="noopener noreferrer"&gt;https://www.linkedin.com/pulse/intro-scalable-frontend-what-how-write-one-nagendra-prajwal&lt;/a&gt;&lt;/p&gt;

</description>
    </item>
    <item>
      <title>AMP, já era?</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 28 Jul 2021 13:09:18 +0000</pubDate>
      <link>https://dev.to/stanley/por-uma-web-mais-rapida-16mi</link>
      <guid>https://dev.to/stanley/por-uma-web-mais-rapida-16mi</guid>
      <description>&lt;p&gt;AMP é um framework HTML criado pelo google para criação de páginas otimizadas para um carregamento instantâneo em dispositivos móveis. Em maio de 2021, o Google avisou que vai parar de priorizar sites AMP nos mecanismos do ranking de busca.&lt;/p&gt;

&lt;p&gt;Mesmo com essa notícia, o PWA ainda é muito utilizado, tem muito espaço e muitas vantagens. É na parte das vantagens que vou focar nessa postagem.&lt;/p&gt;

&lt;p&gt;O principal resultado do uso dessa tecnologia é a melhora da experiência do usuário em utilizar sites e também melhorias no ranking de buscas para SEO.&lt;/p&gt;

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

&lt;p&gt;O ganho expressivo de velocidade de carregamento de páginas em um site com AMP se deve a utilização de um conjunto de especificações no HTML, que são impulsionadas pelo uso de Javascript, mas o principal fator é devido a rede de cache do próprio Google que funciona como uma &lt;a href="https://www.gocache.com.br/cdn/" rel="noopener noreferrer"&gt;CDN&lt;/a&gt;, que guarda uma versão daquela página para acesso imediato.&lt;/p&gt;

&lt;p&gt;O AMP não é apenas um framework para performance. Seus &lt;a href="https://amp.dev/support/faq/platform-and-vendor-partners" rel="noopener noreferrer"&gt;componentes HTML&lt;/a&gt;, fáceis de usar, também auxiliam na criação de páginas com elementos dinâmicos e funcionalidades como outros sites. Como é um projeto aberto para comunidade, surgem novos componentes e melhorias constantemente.&lt;/p&gt;

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

&lt;p&gt;Muitos sites de notícias e conteúdos em geral estão utilizando AMP, como &lt;a href="https://www.washingtonpost.com" rel="noopener noreferrer"&gt;The Washington Post&lt;/a&gt;, ecommerces como &lt;a href="https://www.ebay.com" rel="noopener noreferrer"&gt;Ebay&lt;/a&gt;, sites de eventos, como &lt;a href="https://www.eventbrite.com" rel="noopener noreferrer"&gt;EventBrite&lt;/a&gt; etc.&lt;/p&gt;

&lt;p&gt;Mais recentemente o AMP tem expandido para outras áreas como páginas HTML por &lt;a href="https://amp.dev/about/email" rel="noopener noreferrer"&gt;email&lt;/a&gt; e &lt;a href="https://amp.dev/about/ads" rel="noopener noreferrer"&gt;ads&lt;/a&gt;. Com essas novas expansões, ele pode levar as vantagens que são aplicadas no sites, para novos serviços que demandam renovação tecnológica.&lt;/p&gt;

&lt;p&gt;Enfim, se seu site é mais rápido, logo ele é mais competitivo e converte mais vendas/visitas. Pesquisas mostram que páginas lentas podem aumentar em mais de 100% a taxa de rejeição e desistência de pessoas a esperar uma página de carrega lentamente.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>amp</category>
      <category>seo</category>
      <category>web</category>
      <category>html</category>
    </item>
    <item>
      <title>Kanban - Comece agora</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Fri, 23 Jul 2021 00:57:47 +0000</pubDate>
      <link>https://dev.to/stanley/kanban-comece-agora-33if</link>
      <guid>https://dev.to/stanley/kanban-comece-agora-33if</guid>
      <description>&lt;p&gt;Pessoal, vamos direto ao ponto. Kanban é uma metodologia de fluxo de trabalho contínuo. Embora seja cada vez mais popular atualmente, estas técnicas foram concebidas pela Toyota na década de 60.&lt;/p&gt;

&lt;p&gt;Para a Toyota, o kanban trouxe mais transparência e visibilidade da cadeia de processos, reduzindo desperdício e facilitando a comunicação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Visão completa do fluxo
&lt;/h2&gt;

&lt;p&gt;O kanban propõe a utilização de cartões ou post-its em um quadro para organizar o andamento do fluxo de trabalho e atividades. Ele também possibilita uma gestão em que toda equipe tem visibilidade de todo o processo. Sendo assim, a interação entre os membros é mais fluída.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Prioridades
&lt;/h2&gt;

&lt;p&gt;Um dos conceitos mais fortes no Kanban é o WIP (Work in Progress ou Trabalho em andamento). Ele consiste em definir as prioridades de trabalho em andamento para os membros da equipe. Limitar essa quantidade é um princípio base do Kanban.&lt;/p&gt;

&lt;h2&gt;
  
  
  Facilidade para gestão
&lt;/h2&gt;

&lt;p&gt;Os gestores de uma equipe orientada a Kanban tem visibilidade da evolução, status e responsáveis por cada tarefa de maneira muito prática, podendo definir datas de entrega com mais segurança.&lt;/p&gt;

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

&lt;p&gt;Vale apontar que essas facilidades também se extendem a todos os membros do time, que podem vir a ser futuros gestores.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ferramentas
&lt;/h2&gt;

&lt;p&gt;Existem diversas ferramentas web ou aplicativos para fazer a gestão dos cartões online.&lt;/p&gt;

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

&lt;p&gt;Com certeza o &lt;a href="https://trello.com" rel="noopener noreferrer"&gt;Trello&lt;/a&gt; é a ferramenta mais conhecida, mas também podemos citar o run-run-it, Asana, Jira dentre outros.&lt;/p&gt;

&lt;p&gt;Mesmo que, onde você trabalha não utilize a metodologia kanban, por ser muito versátil, esses conceitos podem ser aplicados em sua vida pessoal ou mesmo em algum freelance que você trabalhe.&lt;/p&gt;

&lt;h2&gt;
  
  
  Começando?
&lt;/h2&gt;

&lt;p&gt;A melhor parte do Kanban é que ele é totalmente flexível e adaptável ao fluxo de entrega de qualquer negócio. Comece implementando seu fluxo atual dentro de uma ferramenta e com o tempo você evolui e o melhora.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>agile</category>
      <category>kanban</category>
    </item>
    <item>
      <title>Vida longa ao PWA</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 14 Jul 2021 15:22:44 +0000</pubDate>
      <link>https://dev.to/stanley/vida-longa-ao-pwa-5amf</link>
      <guid>https://dev.to/stanley/vida-longa-ao-pwa-5amf</guid>
      <description>&lt;p&gt;Hoje o assunto é sobre PWA. PWA (Progressive Web Application) é um tipo de aplicação construída com as tecnologias da web (HTML, CSS e JS) com objetivo de funcionar em qualquer plataforma ou dispositivo, dependendo apenas de um navegador de internet compatível.&lt;/p&gt;

&lt;p&gt;Os PWAs são um marco da história da internet, pois possibilitam aos desenvolvedores proporcionar uma experiência de uso de um app utilizando o navegador. A web é muito utilizada para pesquisa de conteúdo e serviços, e nem todos esses estão instalados como apps no dispositivo do usuário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Por que construir um PWA
&lt;/h3&gt;

&lt;p&gt;Vamos analisar os principais pontos que um PWA pode se diferenciar de um site comum.&lt;/p&gt;

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

&lt;h4&gt;
  
  
  Velocidade
&lt;/h4&gt;

&lt;p&gt;Sites rápidos aumentam a capacidade de captura de leads consideralmente.&lt;/p&gt;

&lt;h4&gt;
  
  
  Disponibilidade
&lt;/h4&gt;

&lt;p&gt;Um PWA que segue os requisitos pode funcionar em diversos navegadores e atingir uma massa de clientes muito maior, escrevendo apenas um código para todas os mais diversos dispositivos.&lt;/p&gt;

&lt;h4&gt;
  
  
  Adaptabilidade
&lt;/h4&gt;

&lt;p&gt;Uma aplicação adaptável e responsiva construída para funcionar em celulares, tablets ou computadores possibilita que mais usuários consumam seu produto/serviço.&lt;/p&gt;

&lt;h4&gt;
  
  
  Aplicativo instalável
&lt;/h4&gt;

&lt;p&gt;Se o cliente desejar, pode instalar seu app com apenas um clique, durante a navegação na sua aplicação. Como a base de código é pequena e utiliza o browser do dispositivo, as instalações são pequenas (medidas em Kbs) e rápidas. Ao aproveitar bem os recursos do PWA, você pode construir aplicativos com excelente performance de resposta e execução.&lt;/p&gt;

&lt;h4&gt;
  
  
  Offline-first
&lt;/h4&gt;

&lt;p&gt;Seu app pode ter funcionalidades que continuem atendendo determinadas demandas do cliente, mesmo que ele esteja com baixa velocidade ou mesmo sem internet.&lt;/p&gt;

&lt;h4&gt;
  
  
  APIs do dispositivo
&lt;/h4&gt;

&lt;p&gt;Por vezes, sua aplicação demanda alguns recursos que precisariam de um aplicativo nativo. Funcionalidades que dependem de armazenamento de arquivos, controle de audio, acesso ao GPS, contatos ou mesmo notificações, são implementáveis numa aplicação PWA.&lt;/p&gt;

&lt;h3&gt;
  
  
  Casos de sucesso
&lt;/h3&gt;

&lt;p&gt;Os PWAs estão há um bom tempo no mercado, com resultados demonstráveis na prática. O google montou alguns estudos de casos, que você pode ver neste &lt;a href="https://web.dev/progressive-web-apps/#case-studies" rel="noopener noreferrer"&gt;link&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;O &lt;a href="https://photos.google.com" rel="noopener noreferrer"&gt;Google Photos&lt;/a&gt; é um bom exemplo de PWA.&lt;/p&gt;

&lt;p&gt;Muitos dos casos mostram como o percentual de conversão aumentou depois da mudança. As grandes e mais diversas empresas estão utilizando amplamente os recursos de PWA para tornar suas aplicações mais amigáveis ao usuário.&lt;/p&gt;

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

&lt;h3&gt;
  
  
  Por onde começar
&lt;/h3&gt;

&lt;p&gt;Primeiro, você precisa entender que PWA não é uma linguagem de programação, mas uma metodologia de desenvolvimento. Os navegadores de internet adotaram algumas &lt;a href="https://blog.logrocket.com/project-fugu-5-new-apis-to-try-out-in-your-pwa/" rel="noopener noreferrer"&gt;APIs&lt;/a&gt; e &lt;a href="https://www.w3.org/TR/appmanifest/" rel="noopener noreferrer"&gt;padrões&lt;/a&gt; para estas aplicações.&lt;/p&gt;

&lt;p&gt;Você pode começar utilizando um boilerplate com algumas configurações como o &lt;a href="https://github.com/luizalabs/juggernaut" rel="noopener noreferrer"&gt;Juggernaut&lt;/a&gt;, por exemplo.&lt;/p&gt;

&lt;p&gt;Caso você já tenha uma aplicação rodando, também é possível ir migrando aos poucos e um bom parâmetro do que você pode melhorar é a ferramenta DevTools do Chrome. Ela aponta problemas no seu código e como corrigí-los.&lt;/p&gt;

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

&lt;p&gt;Vale resaltar que a adoção dos PWAs só não é maior, devido a uma oposição forte da empresa Apple, que é muito fechada nos seus dispositivos. A preocupação deles no momento é de perder parte do lucro que é imposto de taxação sobre cada venda feita nos apps de sua loja (App Store).&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>pwa</category>
      <category>javascript</category>
      <category>web</category>
      <category>programming</category>
    </item>
    <item>
      <title>Entrega ágil com Scrum</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 30 Jun 2021 11:38:24 +0000</pubDate>
      <link>https://dev.to/stanley/entrega-agil-com-scrum-4bn9</link>
      <guid>https://dev.to/stanley/entrega-agil-com-scrum-4bn9</guid>
      <description>&lt;p&gt;Pessoal, hoje vou "falar" um pouco sobre &lt;a href="https://agilemanifesto.org/iso/ptbr/manifesto.html" rel="noopener noreferrer"&gt;metodologia ágil&lt;/a&gt;. Vantagens, motivação e aplicação. Mais especificamente sobre o Scrum. Vamos direto ao ponto.&lt;/p&gt;

&lt;p&gt;O Scrum é um framework gestão de projetos, fundamentalmente construído com base em experiências adquiridas durante o próprio processo de desenvolvimento. Ou seja, as demandas, pessoas e prioridades são construídas com base em decisões passadas e aprendizado.&lt;/p&gt;

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

&lt;p&gt;Esta característica é marcante devido ao foco de aplicação do scrum em projetos com incerteza ou pouco conhecimento do produto final. Sendo assim, a equipe scrum deve estar sempre apta a trabalhar em um ambiente de constante mudança.&lt;/p&gt;

&lt;p&gt;O scrum também sugere a participação constante do cliente na construção do produto desde o início, fornecendo feedbacks constantes em ciclos previamente definidos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cerimônias e Termos
&lt;/h2&gt;

&lt;p&gt;São vários os termos utilizados no Scrum. Dentre eles, podemos destacar alguns principais. Como dito anteriormente, o scrum trabalha em ciclos definidos e estes ciclos são compostos de etapas recorrentes.&lt;/p&gt;

&lt;p&gt;Tudo começa com a definição de tempo de ciclo de tarefas, conhecidas como Sprints. A cada Sprint é definido a lista de atividades a serem desenvolvidas e entregues no ciclo (o Sprint Backlog), numa reunião chamada Product Planning.&lt;/p&gt;

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

&lt;p&gt;Durante a fase de desenvolvimento, em cada ciclo, é feita uma reunião diária conhecida como Daily, na qual a equipe fica de pé e cada integrante comenta de forma breve sobre o status do andamento da suas atividades.&lt;/p&gt;

&lt;p&gt;Logo ao final da Sprint, é realizada uma reunião que reune dois conceitos do scrum (Sprint Review e Sprint Retrospective) com a finalidade de revisar o que foi feito, entender o que deu certo ou errado e fazer alterações no Backlog de atividades do produto, se necessário.&lt;/p&gt;

&lt;h2&gt;
  
  
  Papéis
&lt;/h2&gt;

&lt;p&gt;As equipes que trabalham com o Scrum são pequenas e tem papéis bem definidos. Existe o Product Owner, que é o responsável pela entrega do produto ("Dono do produto"). Já o Scrum Master lida com a manutenção do Scrum, reuniões e comunicação e fluidez de trabalho do time. Por fim, a equipe também conta com os desenvolvedores do produto.&lt;/p&gt;

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

&lt;p&gt;O Product Owner (PO) também é responsável pela gestão do Product Backlog e priorização do que é mais importante. &lt;/p&gt;

&lt;p&gt;O Scrum é amplamente utilizado em ambientes de desenvolvimento de software, porém, ele pode ser adaptado para desenvolvimento de produto em geral, principalmente em projetos de alta complexidade, pelo fato de fazer entregas rápidas, baseadas em feedback do cliente e aprendizado constante.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>scrum</category>
      <category>agilidade</category>
      <category>agile</category>
    </item>
    <item>
      <title>Primeiros passos com Git</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Sat, 19 Jun 2021 17:40:28 +0000</pubDate>
      <link>https://dev.to/stanley/primeiros-passos-com-git-2e8h</link>
      <guid>https://dev.to/stanley/primeiros-passos-com-git-2e8h</guid>
      <description>&lt;h2&gt;
  
  
  O que é o Git?
&lt;/h2&gt;

&lt;p&gt;Hoje o assunto é &lt;a href="https://git-scm.com" rel="noopener noreferrer"&gt;GIT&lt;/a&gt;. O Git é a melhor ferramenta para gerenciamento e versionamento de código e também a mais utilizada atualmente.&lt;/p&gt;

&lt;p&gt;Não importa se você é desenvolvedor Javascript, Java, Python ou C++, com certeza você vai precisar utilizar o Git. Meu objetivo neste post é mostrar o básico de Git (publicando o primeiro commit) para quem está começando na área de desenvolvimento.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Por que usar o Git?
&lt;/h2&gt;

&lt;p&gt;Vamos direto ao ponto: as duas principais facilidades oferecidas para quem está começando com Git é salvar seu código em um servidor na nuvem e o controle de versionamento de todas as alterações feitas nele.&lt;/p&gt;

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

&lt;p&gt;Você já deve ter ouvido falar do &lt;a href="https://github.com" rel="noopener noreferrer"&gt;github&lt;/a&gt;, &lt;a href="https://bitbucket.com" rel="noopener noreferrer"&gt;bitbucket&lt;/a&gt; ou do &lt;a href="https://gitlab.com" rel="noopener noreferrer"&gt;gitlab&lt;/a&gt;. Estes são serviços de empresas que hospedam as versões dos códigos dos seus projetos utilizando a tecnologia do Git.&lt;/p&gt;

&lt;p&gt;Com o seu código hospedado em um servidor, você tem a garantia de um backup, caso aconteça algo com seu computador e também pode compartilhar esse código para que outras pessoas possam trabalhar nele.&lt;/p&gt;

&lt;p&gt;Já o versionamento de código te garante uma rastreabilidade das mudanças que foram feitas com o tempo, possibilitando também que você desfaça o código que você desenvolveu com facilidade.&lt;/p&gt;

&lt;h2&gt;
  
  
  O primeiro repositório
&lt;/h2&gt;

&lt;p&gt;Antes de mais nada, você precisa criar um repositório (que nada mais é do que um projeto). Escolha uma pasta do seu computador.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir &lt;/span&gt;meu-projeto
&lt;span class="nb"&gt;cd &lt;/span&gt;meu-projeto
git init
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Quando você cria um repositório em um dos serviços apresentados anteriormente, eles fornecem uma URL para hospedar seu projeto. Nesse momento, vamos adicionar a URL do projeto no repositório local.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git remote add origin http://urlDoServico.com/seuProjeto
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O próximo passo é adicionar seus arquivos dentro dessa pasta. Para em seguida, fazer o primeiro commit (que é forma como o git grava uma versão de alteração no seu código). Primeiro, vamos adicionar os arquivos que queremos commitar.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;# adicionar todos os arquivos da pasta&lt;/span&gt;
git add &lt;span class="nb"&gt;.&lt;/span&gt;

&lt;span class="c"&gt;# deixe uma mensagem que explique o que você desenvolveu&lt;/span&gt;
git commit &lt;span class="nt"&gt;-m&lt;/span&gt; &lt;span class="s2"&gt;"Criando meu primeiro commit"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O último passo agora é enviar o código para o repositório online.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git push origin master
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Este é apenas o começo. O Git oferece diversas possibilidades, as quais abordarei em próximos posts.&lt;/p&gt;




&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>git</category>
      <category>github</category>
    </item>
    <item>
      <title>React Hooks: Ref e State</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 16 Jun 2021 16:10:50 +0000</pubDate>
      <link>https://dev.to/stanley/react-hooks-ref-e-state-1g2h</link>
      <guid>https://dev.to/stanley/react-hooks-ref-e-state-1g2h</guid>
      <description>&lt;p&gt;Pessoal, nesse post vou abordar mais um pouco sobre os &lt;a href="https://reactjs.org/docs/hooks-intro.html" rel="noopener noreferrer"&gt;React Hooks&lt;/a&gt;. Nós vamos observar os casos de uso dos hooks &lt;strong&gt;useRef, createRef, useState e useReducer&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Os hooks nos permitem utilizar estado e outros recursos do react como memoization, ciclo de vida do componente etc sem a necessidade de criar o componente como uma classe.&lt;/p&gt;

&lt;p&gt;Nesse post abaixo, eu mostrei um pouco sobre a parte de memoization com o useMemo.&lt;/p&gt;


&lt;div class="ltag__link"&gt;
  &lt;a href="/stanley" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__pic"&gt;
      &lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F511211%2F9a385842-d6a9-4def-bed0-ca5af6dfe9e6.jpeg" alt="stanley"&gt;
    &lt;/div&gt;
  &lt;/a&gt;
  &lt;a href="https://dev.to/stanley/performance-com-memo-usememo-e-usecallback-40ga" class="ltag__link__link"&gt;
    &lt;div class="ltag__link__content"&gt;
      &lt;h2&gt;Performance com Memo e useMemo&lt;/h2&gt;
      &lt;h3&gt;Stanley Gomes ・ Mar 24 '21&lt;/h3&gt;
      &lt;div class="ltag__link__taglist"&gt;
        &lt;span class="ltag__link__tag"&gt;#usecallback&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#usememo&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#react&lt;/span&gt;
        &lt;span class="ltag__link__tag"&gt;#javascript&lt;/span&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/a&gt;
&lt;/div&gt;


&lt;h2&gt;
  
  
  Ref
&lt;/h2&gt;

&lt;p&gt;Vamos começar com o &lt;code&gt;ref&lt;/code&gt;. Podemos utilizar o hook &lt;code&gt;useRef&lt;/code&gt; para acessar os elementos DOM do HTML.&lt;/p&gt;

&lt;p&gt;No exemplo abaixo, vamos o usar o hook para que quando o botão for clicado, o campo de input seja focado para digitação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Utilizando useRef&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Focar no campo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;useRef&lt;/code&gt; foi criado com objetivo de ser uma proposta de hook como alternativa ao &lt;a href="https://reactjs.org/docs/refs-and-the-dom.html#creating-refs" rel="noopener noreferrer"&gt;createRef&lt;/a&gt;. O &lt;code&gt;createRef&lt;/code&gt; é uma API do React que desempenha o mesmo papel.&lt;/p&gt;

&lt;p&gt;Nesse exemplo abaixo, eu utilizei o mesmo código do exemplo anterior, porém desta vez criando a referencia com o &lt;code&gt;createRef&lt;/code&gt;. O resultado será o mesmo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ref&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;createRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;current&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;focus&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;className&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"App"&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Utilizando useRef&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h1&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;ref&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Focar no campo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Uma diferença entre essas duas funcionalidades é que o useRef &lt;br&gt;
cria a referência apenas uma vez, logo quando o componente é renderizado. Já o createRef cria uma nova referência para o elemento toda vez que ocorre o re-render do componente, sendo assim menos performático.&lt;/p&gt;
&lt;h2&gt;
  
  
  State
&lt;/h2&gt;

&lt;p&gt;O próximo hook que vamos ver é uma solução para gerenciamento de estado do componente, o &lt;strong&gt;useState&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Nesse exemplo abaixo, é possível armazenar no estado do componente, o número de vezes que o botão foi clicado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
       Você clicou &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt; vezes!
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setCount&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        Mais um!
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O &lt;code&gt;useState(0)&lt;/code&gt; é uma função e seu parâmetro é o valor inicial do estado que você quer gerenciar, nesse caso a contagem. Já essa primeira parte &lt;code&gt;[count, setCount]&lt;/code&gt; com o array de variáveis utiliza uma funcionalidade do Js, o &lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment" rel="noopener noreferrer"&gt;Destructuring assignment&lt;/a&gt; , que é retornada pelo useState.&lt;/p&gt;

&lt;p&gt;O primeiro elemento &lt;code&gt;count&lt;/code&gt; é uma variável com o valor atual do estado e o segundo elemento &lt;code&gt;setCount&lt;/code&gt; é a função que altera o valor do estado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Reducer
&lt;/h2&gt;

&lt;p&gt;O &lt;a href="https://reactjs.org/docs/hooks-reference.html#usereducer" rel="noopener noreferrer"&gt;useReducer&lt;/a&gt; é mais um hook criado para componentes de classe. Este com o propósito também de gerenciamento de estado de componente, mas com uma abordagem para casos em que o gerenciamento dos dados é mais complexo.&lt;/p&gt;

&lt;p&gt;Nesse exemplo abaixo (retirado da documentação do react), vou utilizar uma função de contador com as opções de incrementar e decrementar o valor.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nf"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;switch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="k"&gt;case&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;decrement&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="na"&gt;count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nl"&gt;default&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
      &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Operador não implementado&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Counter&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;useReducer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;reducer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;initialState&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      Contador: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;count&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;decrement&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;-&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;dispatch&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;increment&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;+&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Em casos que o estado é mais simples, é recomendada a utilização do useState, por ser mais simples de implementar e gerenciar.&lt;/p&gt;




&lt;p&gt;Este post não seria possível sem o trabalho de pesquisa e discussão do time do capítulo de frontend do LuizaLabs.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

&lt;p&gt;Até mais.&lt;/p&gt;

</description>
      <category>react</category>
      <category>javascript</category>
      <category>hooks</category>
    </item>
    <item>
      <title>Next.js - Presente e futuro 🚀</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Sun, 16 May 2021 18:40:43 +0000</pubDate>
      <link>https://dev.to/stanley/next-js-3k31</link>
      <guid>https://dev.to/stanley/next-js-3k31</guid>
      <description>&lt;h2&gt;
  
  
  O que é? Para que serve?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://nextjs.org" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt; é um framework de renderização estática no lado do servidor, para a lib &lt;a href="https://reactjs.org" rel="noopener noreferrer"&gt;Reactjs&lt;/a&gt;. Traduzindo: seu código react é compilado no servidor, que retorna para o browser o HTML, CSS e Js.&lt;/p&gt;

&lt;p&gt;O Next.js é usado amplamente na comunidade de desenvolvedores javascript e atualmente é mantido pela empresa &lt;a href="https://vercel.com" rel="noopener noreferrer"&gt;vercel&lt;/a&gt;, que tem criado uma série de serviços &lt;br&gt;
para montar um ecosistema que facilite o trabalho do desenvolvedor.&lt;/p&gt;

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

&lt;p&gt;Mesmo que a vercel ofereça este ecosistema, você pode hospedar seu projeto em qualquer outro lugar. O Next.js é open source.&lt;/p&gt;

&lt;h2&gt;
  
  
  Principais recursos
&lt;/h2&gt;

&lt;p&gt;De cara, podemos apontar o quanto é fácil &lt;a href="https://nextjs.org/docs/getting-started" rel="noopener noreferrer"&gt;iniciar um projeto&lt;/a&gt; next.js. Não precisa configurar nada, apenas customizar de acordo com sua necessidade.&lt;/p&gt;

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

&lt;p&gt;O NextJS oferece suporte a todos os navegadores modernos e o IE11. Também suporta code spliting. Ele tem suporte nativo para Typescript, com &lt;a href="https://nextjs.org/docs/basic-features/typescript" rel="noopener noreferrer"&gt;configuração simples&lt;/a&gt; e compilador em tempo real.&lt;/p&gt;

&lt;p&gt;No desenvolvimento você escreve o código e as mudanças são refletidas automaticamente no browser graças ao &lt;a href="https://nextjs.org/docs/basic-features/fast-refresh" rel="noopener noreferrer"&gt;fast refresh&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ecosistema vercel
&lt;/h2&gt;

&lt;p&gt;Com o &lt;a href="https://nextjs.org/analytics" rel="noopener noreferrer"&gt;Next.js Analytics&lt;/a&gt; é um serviço desse ecosistema. É uma métrica de boa experiência de usuário em seu site. Foi construido para responder perguntas como: seu site carrega rápido? é responsivo? é visualmente estável?&lt;/p&gt;

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

&lt;p&gt;Outra funcionalidade legal da plataforma é o deploy da sua ferramenta, que pode ser feito em apenas um comando e você pode acompanhar todo log de build da aplicação no site da vercel. Você também pode conectar um repositório do github e configurar deploy automatizado quando fizer um push na branch &lt;code&gt;master&lt;/code&gt;, por exemplo.&lt;/p&gt;

&lt;h1&gt;
  
  
  SSR: Server Side Rendering
&lt;/h1&gt;

&lt;p&gt;O SSR é uma técnica utilizada em que o bundle da aplicação react é compilado no servidor e retorna o código compilado para o browser em HTML, CSS e JS. Sem essa técnica, é necessário aguardar o carregamento de todo o bundle que contém o código da sua página para definir como será a página.&lt;/p&gt;

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

&lt;p&gt;Como a compilação é feita no lado do servidor, a renderização da página é mais rápida, aumentando assim a retenção do usuário e também ajudando pessoas com dispositivos antigos e conexões de internet com baixa velocidade.&lt;/p&gt;

&lt;p&gt;Outra grande vantagem é que dessa forma, os motores de busca como Google, Yahoo e Bing ao lerem o HTML da sua página vão ter muito mais facilidade para indexar o seu conteúdo, visto que tudo já estará compilado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Futuro
&lt;/h2&gt;

&lt;p&gt;Observando a &lt;a href="https://www.npmtrends.com/next" rel="noopener noreferrer"&gt;curva de crescimento&lt;/a&gt; de trending do Next.js na comunidade javascript é possível perceber que a utilização está em ascenção e já por tempo considerável. É uma framework completa, estável e muito atualizada.&lt;/p&gt;

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

&lt;p&gt;Esses fatores indicam que é uma tecnologia que ainda vai crescer muito e aumentar ainda mais sua participação de mercado. Com certeza é algo que vale investir um tempo de estudo e implementação em futuros projetos.&lt;/p&gt;




&lt;p&gt;Este post não seria possível sem o trabalho de pesquisa e discussão no time do capítulo de frontend do LuizaLabs.&lt;/p&gt;

&lt;p&gt;Se você gostou, me segue para novos posts e deixa o like nesse post.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

&lt;p&gt;Até mais.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>nextjs</category>
      <category>react</category>
    </item>
    <item>
      <title>Consistência de estilo entre editores/IDEs</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Sat, 08 May 2021 01:52:58 +0000</pubDate>
      <link>https://dev.to/stanley/consistencia-de-estilo-entre-editores-ides-83n</link>
      <guid>https://dev.to/stanley/consistencia-de-estilo-entre-editores-ides-83n</guid>
      <description>&lt;p&gt;Pessoal, hoje vou trazer uma configuração para você colocar no seu repositório para determinar algumad regras que os editores de código/IDEs fiquem padronizados.&lt;/p&gt;

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

&lt;p&gt;Você já deve passado pela situação de commitar seu código e no momento de olhar o diff no git, você commitou diversos espaços no arquivo, sendo que você alterou apenas uma linha.&lt;/p&gt;

&lt;p&gt;Isso acontece por que seu editor de código (vscode, atom, sublime text etc) possui configurações diferentes de indentação.&lt;/p&gt;

&lt;p&gt;Para resolver esse tipo de problema você pode utilizar um arquivo chamado &lt;a href="https://editorconfig.org" rel="noopener noreferrer"&gt;.editorconfig&lt;/a&gt;. Neste arquivo você vai definir regras como indentação (espacos ou tabs) e charset padrão.&lt;/p&gt;

&lt;p&gt;Veja abaixo um exemplo de arquivo com as propriedades disponíveis.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# define que a pasta onde o arquivo está, é a raiz do projeto
root = true

# Padrão de de nova linha nk Unix
[*]
end_of_line = lf
insert_final_newline = true

# Charset padrão
[*.{js,py}]
charset = utf-8

# Indentação com 4 espaços
Você pode escolher entre tab ou space
[*.py]
indent_style = space
indent_size = 4

# sobrepor configuração para um diretório específico.
[lib/**.js]
indent_style = space
indent_size = 2
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bora implementar esse arquivo nos nossos projetos. &lt;/p&gt;




&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

</description>
      <category>editor</category>
      <category>code</category>
      <category>tips</category>
    </item>
    <item>
      <title>Debaixo do capô: Entendendo a performance no React</title>
      <dc:creator>Stanley Gomes</dc:creator>
      <pubDate>Wed, 05 May 2021 14:41:52 +0000</pubDate>
      <link>https://dev.to/stanley/entendendo-a-performance-no-react-j9h</link>
      <guid>https://dev.to/stanley/entendendo-a-performance-no-react-j9h</guid>
      <description>&lt;p&gt;Pessoal, muito se fala sobre a alta performance de renderização de aplicações desenvolvidas utilizando React. Um dos motivos que mais são importantes quando se toca neste ponto é o &lt;a href="https://reactjs.org/docs/reconciliation.html" rel="noopener noreferrer"&gt;React Conciliation&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Esta API do React é responsável por observar e gerenciar o que muda a cada ciclo de re-renderização da sua aplicação/componentes. Nesse processo o React utiliza um algoritmo chamado &lt;code&gt;React’s “diffing” algorithm&lt;/code&gt;, que é responsável por entender melhor o que muda a cada renderização e alterar o DOM da forma mais performática possível.&lt;/p&gt;

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

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Existem algumas ações simples que o algoritmo faz para entender essas diferenças entre as versões de renderizações, que nós podemos observar para trabalhar com mais performance.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Elementos de diferentes tipos
&lt;/h2&gt;

&lt;p&gt;Quando o React compara as versões, ele observa o tipo de elemento que está renderizando aquela árvore de componentes. Quando o elemento é alterado, todos seus filhos são re-renderizados. Veja no exemplo abaixo:&lt;/p&gt;

&lt;p&gt;Neste cenário, eu vou alterar um elemento que era do tipo &lt;code&gt;div&lt;/code&gt; e mudou para o tipo &lt;code&gt;span&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Versão anterior do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ListaDeUsuarios&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/div&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Nova versão do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;span&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;ListaDeUsuarios&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/span&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neste caso acima, todo esse componente será re-renderizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Elementos de mesmo tipo
&lt;/h2&gt;

&lt;p&gt;Quando o elemento mantem seu tipo entre as versões o react analisa outras características para decidir o que vai ser re-renderizado.&lt;/p&gt;

&lt;p&gt;Neste caso abaixo, o componente mantêm o tipo &lt;code&gt;div&lt;/code&gt; entre as versões, porém o conteúdo da prop &lt;code&gt;title&lt;/code&gt; é alterado. Neste caso, o React vai renderizar apenas esta alteração individual da prop.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Versão anterior do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;className=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Meu App"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Nova versão do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;className=&lt;/span&gt;&lt;span class="s"&gt;"header"&lt;/span&gt; &lt;span class="na"&gt;title=&lt;/span&gt;&lt;span class="s"&gt;"Meu App - Usuários"&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Um outro exemplo é a tag style, que é tratada de forma especial. Nesse caso abaixo, apenas a propriedade &lt;code&gt;color&lt;/code&gt; do CSS do elemento em questão é alterada, então o React vai entender que apenas essa propriedade deve ser re-renderizada, ao mesmo tempo que o &lt;code&gt;textAlign&lt;/code&gt; continua imutável.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Versão anterior do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;{{color:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;red&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;textAlign:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="err"&gt;'}}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Nova versão do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;div&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;{{color:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;green&lt;/span&gt;&lt;span class="err"&gt;',&lt;/span&gt; &lt;span class="na"&gt;textAlign:&lt;/span&gt; &lt;span class="err"&gt;'&lt;/span&gt;&lt;span class="na"&gt;left&lt;/span&gt;&lt;span class="err"&gt;'}}&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Lista de elementos
&lt;/h2&gt;

&lt;p&gt;Ao renderizar uma lista de elementos, você pode utilizar uma propriedade chamada &lt;code&gt;key&lt;/code&gt; para que instruí-lo a re-renderizar os elementos da lista que mudaram as &lt;code&gt;keys&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Versão anterior do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;first&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;second&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Nova versão do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;first&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;second&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"third"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;third&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Caso a ordem desses elementos seja alterada, os elementos que mantiverem mesmas keys não serão re-renderizados.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="c"&gt;&amp;lt;!-- Versão anterior do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;first&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;second&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;

&lt;span class="c"&gt;&amp;lt;!-- Nova versão do componente --&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;ul&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"second"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;second&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
  &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;key=&lt;/span&gt;&lt;span class="s"&gt;"first"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;first&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Estas são técnicas que nos ajudam a escrever um código que o motor de renderização do React compreenda a melhor forma de re-renderizar nossos componentes e assim ganhamos performance.&lt;/p&gt;

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

&lt;p&gt;Este post foi baseado na documentação do &lt;a href="https://reactjs.org/docs/reconciliation.html" rel="noopener noreferrer"&gt;React Conciliation&lt;/a&gt;, usando os mesmos exemplos apresentados na DOC.&lt;/p&gt;




&lt;p&gt;Este post não seria possível sem o trabalho de pesquisa e discussão do time do capítulo de frontend do LuizaLabs.&lt;/p&gt;

&lt;p&gt;Obrigado pela leitura! Espero que possa ter ajudado. 🚀&lt;/p&gt;

&lt;p&gt;Até mais.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>react</category>
    </item>
  </channel>
</rss>
