<?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: Nina Kitsu</title>
    <description>The latest articles on DEV Community by Nina Kitsu (@ninetails).</description>
    <link>https://dev.to/ninetails</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%2F122287%2F10d51848-56f3-403e-9048-f343b745ee16.jpg</url>
      <title>DEV Community: Nina Kitsu</title>
      <link>https://dev.to/ninetails</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/ninetails"/>
    <language>en</language>
    <item>
      <title>Runtimes JavaScript [pt-br]</title>
      <dc:creator>Nina Kitsu</dc:creator>
      <pubDate>Tue, 17 Jan 2023 15:11:00 +0000</pubDate>
      <link>https://dev.to/ninetails/runtimes-javascript-4b65</link>
      <guid>https://dev.to/ninetails/runtimes-javascript-4b65</guid>
      <description>&lt;p&gt;Para desenvolver e/ou rodar uma aplicação local JavaScript você precisa instalar um &lt;em&gt;Runtime&lt;/em&gt; localmente.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mas o que é um &lt;em&gt;runtime&lt;/em&gt;?
&lt;/h2&gt;

&lt;p&gt;A palavra em si pode significar muitas coisas na área da computação. Porém um significado em específico será utilizado aqui, que é o de ambiente de &lt;em&gt;runtime&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Este ambiente de &lt;em&gt;runtime&lt;/em&gt; é a base, a interface que lida entre seu programa e a máquina, que pode ser local, virtual, na nuvem...&lt;/p&gt;

&lt;p&gt;Um famoso runtime é o Ambiente de &lt;em&gt;Runtime&lt;/em&gt; do Java, do inglês Java Runtime Environment, também conhecido por sua sigla JRE. Simplificando, este é responsável por rodar uma aplicação Java na Máquina Virtual do Java.&lt;/p&gt;

&lt;p&gt;Então pro JavaScript teria algo como um ambiente de &lt;em&gt;Runtime&lt;/em&gt; JavaScript, certo? SIM! Mas sendo este artigo sobre ferramentas, listarei apenas as que rodam direto numa máquina e não num navegador.&lt;/p&gt;

&lt;p&gt;Infelizmente nenhuma ferramenta tem um nome sugestivo sendo sigla do que ele faz. Mesmo porquê teria as mesmas iniciais da &lt;em&gt;Runtime&lt;/em&gt; do Java. Mas os desenvolvedores das runtimes foram até que criativos.&lt;/p&gt;

&lt;h2&gt;
  
  
  Node.js
&lt;/h2&gt;

&lt;p&gt;Este é o mais famoso &lt;em&gt;runtime&lt;/em&gt; JavaScript e um dos primeiros a existir fora do navegador.&lt;/p&gt;

&lt;p&gt;Ele foi desenvolvido em cima do &lt;a href="https://v8.dev/" rel="noopener noreferrer"&gt;interpretador V8&lt;/a&gt;, criado pelo Google, o mesmo interpretador de código JavaScript embutido nos motores de renderização &lt;strong&gt;Blink&lt;/strong&gt;, presente em navegadores &lt;strong&gt;Chrome&lt;/strong&gt; e outros navegadores baseados na versão de código aberto &lt;strong&gt;Chromium&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Confuso né?&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbifri8ogju87vqawy2p9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbifri8ogju87vqawy2p9.png" alt="Abaixo uma caixa com o V8, acima dele uma linha separando verticalmente. De um lado, denominado máquina, tem uma caixa escrito Node.js, do outro lado, denominado navegador, tem duas caixas. Acima, escrito Chrome/Chromium e no meio, Blink" width="591" height="443"&gt;&lt;/a&gt;&lt;/p&gt;
Diagrama comparando o navegador com o Node.js



&lt;p&gt;Assim tornou-se possível rodar aplicações escritas em JavaScript fora do navegador. E aplicações de diversas naturezas. Aqui abordo ferramentas, porém devido ao seu suporte para diversos sistemas operacionais, o Node também pode ser usado para criar aplicações web para servidores e até mesmo ser utilizado em controle de dispositivos IoT.&lt;/p&gt;

&lt;p&gt;Infelizmente este artigo não é focado em desenvolvimento utilizando Node.js. Existem diversos artigos e cursos espalhados pela Internet. Irei focar nos executáveis em si.&lt;/p&gt;

&lt;h2&gt;
  
  
  Existem outros &lt;em&gt;runtimes&lt;/em&gt; para ambientes JavaScript?
&lt;/h2&gt;

&lt;p&gt;Sim, e citarei duas que estão dominando as discussões ultimamente (no momento de escrita deste artigo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Deno
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;DENO LOGO&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Desenvolvido pelo mesmo criador do Node.js, &lt;a href="https://en.wikipedia.org/wiki/Ryan_Dahl" rel="noopener noreferrer"&gt;Ryan Dahl&lt;/a&gt;. Escrito em &lt;a href="https://www.rust-lang.org/" rel="noopener noreferrer"&gt;Rust&lt;/a&gt; e também tendo como base o motor JavaScript &lt;a href="https://v8.dev/" rel="noopener noreferrer"&gt;V8&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A motivação da criação desta nova runtime foram alguns arrependimentos do criador em relação a decisões tomadas quando o Node foi criado. O Deno foi anunciado em 2018, quase 10 anos após o lançamento do Node.&lt;/p&gt;

&lt;p&gt;Abaixo o vídeo, em inglês somente, da &lt;em&gt;talk&lt;/em&gt; do &lt;strong&gt;Ryan Dahl&lt;/strong&gt; com o título de "10 Coisas que me arrependo sobre o Node.js".&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/M3BM9TB-8yA"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Dentre estas melhorias:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Rodar TypeScript e usar ES6 por padrão;&lt;/li&gt;
&lt;li&gt;Não requer um gerenciador de pacote, a resolução de módulos é feita por URLs;&lt;/li&gt;
&lt;li&gt;Melhor controle de permissões...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Em 2020 foi lançada sua primeira versão estável.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bun
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;BUN LOGO&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Já o &lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Bun&lt;/a&gt;, criado em 2021 pelo &lt;a href="https://twitter.com/jarredsumner" rel="noopener noreferrer"&gt;Jarred Sumner&lt;/a&gt;, tenta ir por outro caminho diferente do Node/Deno.&lt;/p&gt;

&lt;p&gt;Ao invés de ter como base o &lt;strong&gt;V8&lt;/strong&gt;, o Bun utiliza como base de seu interpretador o &lt;a href="https://webkit.org/" rel="noopener noreferrer"&gt;Webkit&lt;/a&gt;, presente no navegador &lt;strong&gt;Safari&lt;/strong&gt;. E foi programado em &lt;a href="https://ziglang.org/" rel="noopener noreferrer"&gt;Zig&lt;/a&gt;, outra linguagem de programação &lt;em&gt;low-code&lt;/em&gt; voltada a performance, como o &lt;strong&gt;Rust&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Suporta &lt;strong&gt;TypeScript&lt;/strong&gt; e &lt;strong&gt;JSX&lt;/strong&gt; por padrão e possui um instalador eficiente compatível com &lt;strong&gt;npm&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Porém como toda novidade, este &lt;em&gt;runtime&lt;/em&gt; ainda está em fase experimental, sem lançamento de uma versão estável.&lt;/p&gt;

&lt;h2&gt;
  
  
  Diferenciais
&lt;/h2&gt;

&lt;p&gt;Uma premissa de ambos desde sua concepção foi serem criados com suporte ao TypeScript. Muito do que a linguagem evolui sobre padrões &lt;a href="https://tc39.es/" rel="noopener noreferrer"&gt;&lt;strong&gt;EcmaScript&lt;/strong&gt; da &lt;strong&gt;TC39&lt;/strong&gt;&lt;/a&gt; é também atrelado a este suporte ao &lt;strong&gt;TS&lt;/strong&gt;, já que o próprio TypeScript acaba adotando como padrão as evoluções das propostas da &lt;strong&gt;ES&lt;/strong&gt;. Logo também é padrão a utilização de &lt;strong&gt;ESModules&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Bun&lt;/strong&gt; está em estágio experimental e é o caçula dos runtimes. Podem ter funcionalidades, bibliotecas e ferramentais que ainda não possuam suporte.&lt;/p&gt;

&lt;p&gt;Um diferencial que considero legal de se citar do &lt;strong&gt;Deno&lt;/strong&gt; é que desde sua criação teve-se uma preocupação maior sobre permissões. Ou seja, ao rodar uma aplicação feita em Deno, é preciso prover explicitamente permissões ao rodar a aplicação. Pode até ser algo que parece irritante durante o desenvolvimento esquecer de dar alguma permissão, porém evita que alguma dependência execute certos scripts, maliciosos ou não.&lt;/p&gt;

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

&lt;p&gt;Como tanto o &lt;strong&gt;Deno&lt;/strong&gt; quanto o &lt;strong&gt;Bun&lt;/strong&gt; são runtimes um tanto recentes e não cheguei a estudar profundamente.&lt;/p&gt;

&lt;p&gt;Se deseja testá-los, é possível instalá-los utilizando o &lt;a href="https://asdf-vm.com/" rel="noopener noreferrer"&gt;asdf&lt;/a&gt;. Ambos possuem plugins já criados:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/cometkim/asdf-bun" rel="noopener noreferrer"&gt;asdf-bun&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/asdf-community/asdf-deno" rel="noopener noreferrer"&gt;asdf-deno&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Links
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://levelup.gitconnected.com/dev-explainer-javascript-runtimes-8e4d1e3af405" rel="noopener noreferrer"&gt;Tudo o que você precisa saber sobre Runtimes JavaScript, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://nodejs.org/pt-br/" rel="noopener noreferrer"&gt;Site oficial do Node.js&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://v8.dev/" rel="noopener noreferrer"&gt;Página do V8, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://deno.land/" rel="noopener noreferrer"&gt;Site oficial do Deno, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://bun.sh/" rel="noopener noreferrer"&gt;Site oficial do Bun, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>beginners</category>
    </item>
    <item>
      <title>História sobre usar o JavaScript para programar JavaScript</title>
      <dc:creator>Nina Kitsu</dc:creator>
      <pubDate>Mon, 31 Oct 2022 23:23:53 +0000</pubDate>
      <link>https://dev.to/ninetails/historia-sobre-usar-o-javascript-para-programar-javascript-4l2i</link>
      <guid>https://dev.to/ninetails/historia-sobre-usar-o-javascript-para-programar-javascript-4l2i</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;Olá pessoa desenvolvedora. Depois de muito tempo resolvi tentar voltar a escrever artigos. A de hoje não tem nada de programação, é muito mais historinha. Espero que gostem. :)&lt;/p&gt;

&lt;p&gt;Não sou historiadora e os fatos não estão descritos necessariamente numa ordem cronológica certa tão pouco científicos. Esse texto tem tanta credibilidade quanto uma página da Wikipédia no início do milênio, ou seja, nenhuma. Não a usem como base histórica.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Motivação
&lt;/h2&gt;

&lt;p&gt;Quem no começo da carreira não se preocupava com quantos espaços identava seu código, se usava tab, se botava ou não chaves se o &lt;code&gt;if&lt;/code&gt; tinha apenas uma linha...?&lt;/p&gt;

&lt;p&gt;E claro que com isso empresas e pessoas desenvolvedoras começaram a se preocupar com a forma que iriam programar. Criaram diretrizes, chamadas de Guias de Estilo, ou em inglês &lt;strong&gt;Style Guides&lt;/strong&gt;, para todos escreverem um programa de forma única parecendo como se fosse programado por apenas uma pessoa.&lt;/p&gt;

&lt;p&gt;Por outro lado, pessoas desenvolvedoras também se preocupavam se seu programa funcionava de forma correta. &lt;strong&gt;Testavam&lt;/strong&gt; manualmente e viam se o comportamento do teste condizia com o que foi planejado.&lt;/p&gt;

&lt;p&gt;Não só isso. Com o passar do tempo vieram outras preocupações como qualidade de código, se existe muitos códigos duplicados, se o programa roda regularmente em qualquer ambiente que for suportado.&lt;/p&gt;

&lt;p&gt;Imagine pessoas lidando com tudo isso, lendo e corrigindo códigos, apontando erros, verificando se a aplicação não quebraria, testando em diversos ambientes... Um tanto inviável, certo?&lt;/p&gt;

&lt;p&gt;Criou-se então uma necessidade de se automatizar tarefas "triviais" (no sentido que possam ser reproduzidos) de forma não humana pois usando um programa para avaliar outro programa seria muito mais rápido que uma pessoa avaliando o código fonte ou funcionalidade de outro programa em específico.&lt;/p&gt;

&lt;p&gt;Hoje em dia, quem processa contas complexas mais rápido? Uma pessoa mediana/padrão ou um computador já configurado para fazer contas?&lt;/p&gt;

&lt;p&gt;Então por que não atribuir tarefas corriqueiras pra máquinas para as pessoas programadoras se preocuparem muito mais em criar programas que ficar pensando qual a melhor maneira para programar?&lt;/p&gt;

&lt;h2&gt;
  
  
  E o JavaScript?
&lt;/h2&gt;

&lt;p&gt;Os navegadores sempre foram bons programas em acessar um servidor, pegar uma informação em texto e imprimir pro usuário.&lt;/p&gt;

&lt;p&gt;Este protocolo de mensageria entre navegador e um servidor é a própria HTTP. Do inglês &lt;em&gt;Hypertext Transfer Protocol&lt;/em&gt;, literalmente traduzido como Protocolo de Transferência de Hipertexto.&lt;/p&gt;

&lt;p&gt;Mas somente imprimir um texto na tela é chato, não? Imagine não poder nem botar uma corzinha, uma imagenzinha... E com este pensamento os navegadores evoluíram e agregaram mais funcionalidades.&lt;/p&gt;

&lt;p&gt;Em 1995 foi atribuida uma tarefa para um funcionário da &lt;a href="https://pt.wikipedia.org/wiki/Netscape" rel="noopener noreferrer"&gt;Netscape&lt;/a&gt; chamado &lt;a href="https://pt.wikipedia.org/wiki/Brendan_Eich" rel="noopener noreferrer"&gt;Brendan Eich&lt;/a&gt;: desenvolver uma linguagem que seria embutida nos navegadores da &lt;strong&gt;Netscape&lt;/strong&gt;. Inicialmente chamada de &lt;strong&gt;LiveScript&lt;/strong&gt;, mas pouco tempo depois renomeada para &lt;strong&gt;JavaScript&lt;/strong&gt; para aproveitar a popularidade de outra linguagem de programação: o &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Apesar de ser uma das primeiras linguagens da Web a possibilitar adicionar interatividade às páginas estáticas, o JavaScript nem sempre foi fácil de programar. Linguagem que apesar do nome, não se parecia em nada com o &lt;strong&gt;Java&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Mesmo assim a web evoluía e novas formas de interatividade foram criadas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Applets&lt;/em&gt; em Java... Animações em Flash...&lt;/p&gt;

&lt;p&gt;E o JavaScript além de possuir limitações, cada navegador podia adicionar alguma funcionalidade no JavaScript da forma que bem entendesse e quando entendesse.&lt;/p&gt;

&lt;p&gt;Mas da mesma forma que vieram e tiveram seu hype, também tiveram sua decadência. &lt;em&gt;Applets&lt;/em&gt; Java utilizavam a JVM, Java Virtual Machine, ou em português: Máquina Virtual do Java, trazendo um problema de segurança. Sendo o mesmo interpretador que estava na máquina do usuário, uma pessoa desenvolvedora poderia maliciosamente criar um programa com outra finalidade e ter acesso ao computador do visitante.&lt;/p&gt;

&lt;p&gt;Já sobre o outro, havia uma frase famosa que todos repetiam na época:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O Flash foi morto pelo Steve Jobs&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando a Apple criou o iPhone, contendo um navegador dentro dele, foi-lhe arrancada qualquer método de rodar Flash. Animações e aplicações em Flash rodavam perfeitamente no computador, porém num computador de bolso poderia exigir mais da máquina e comprometer o tempo de bateria do dispositivo.&lt;/p&gt;

&lt;p&gt;Também haviam outros fatores como a Apple ter que lidar com um produto de uma companhia externa que talvez exigisse algum retorno por ceder uso de uma tecnologia proprietária.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ferramentas para códigos escritos em JavaScript
&lt;/h2&gt;

&lt;p&gt;Uma das primeiras ferramentas criadas com o intuito de modificar um código JavaScript foi devido a preocupação de enviar um código muito grande pra quem navegasse a página que carregaria este script.&lt;/p&gt;

&lt;p&gt;Ninguém escreve código todo em uma linha, certo? Digo, pessoas programadoras normais. Ficaria ilegível.&lt;/p&gt;

&lt;p&gt;Mas e se uma ferramenta tirasse os espaços e quebras de linha e o meu arquivo JavaScript tivesse um tamanho menor?&lt;/p&gt;

&lt;p&gt;Assim foi criado o minificador de código. E qual o ganho? O usuário do site iria ficar esperando menos tempo para baixar script embutido na página.&lt;/p&gt;

&lt;p&gt;Esta mesma pessoa que criou o minificador também tinha umas opiniões fortes sobre como um desenvolvedor deveria escrever seu código.&lt;/p&gt;

&lt;p&gt;Logo em seguida o mesmo criou uma ferramenta que apontava más práticas de escrita de código JavaScript e também procurava erros triviais como estrutura do código, se uma instrução foi escrita sem erro... Coisa que já existia em outras linguagens. Este analizador de código estático foi chamado de &lt;strong&gt;JSLint&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A pessoa que criou ambos se chama &lt;a href="https://pt.wikipedia.org/wiki/Douglas_Crockford" rel="noopener noreferrer"&gt;Douglas Crockford&lt;/a&gt;. Não sei se foi realmente as primeiras ferramentas criadas para códigos escritos JavaScript, porém foram uma das primeiras ferramentas mais populares.&lt;/p&gt;

&lt;p&gt;Este também foi responsável por popularizar o formato de documentos &lt;strong&gt;JSON&lt;/strong&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.crockford.com/jsmin.html" rel="noopener noreferrer"&gt;Leia mais sobre o JSMin, em inglês&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Porém mesmo sendo umas das primeiras ferramentas para modificar códigos JavaScript, a primeira rodava em linha de comando e foi escrito em C. A segunda só rodava no navegador.&lt;/p&gt;

&lt;h2&gt;
  
  
  Google quem?
&lt;/h2&gt;

&lt;p&gt;Uma empresa que já estava bem consolidada no mercado de buscas se intromete e decide também ditar regras de como uma pessoa desenvolvedora de tecnologias web deveria escrever seus sites de forma performática, já que era assim que eles faziam.&lt;/p&gt;

&lt;p&gt;Sim, essa empresa era..... o &lt;strong&gt;Yahoo!&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Uma das primeiras ferramentas online sobre performance (pelo menos que eu tenho ciência) foram feitas por eles. &lt;a href="http://yslow.org/" rel="noopener noreferrer"&gt;Leia mais no site do YSlow, em inglês.&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Algo que era &lt;em&gt;hype&lt;/em&gt; nessa época eram os &lt;strong&gt;Provedores de Serviços&lt;/strong&gt;. Sites que agregavam de tudo. Nelas qualquer pessoa podia fazer sua página, ter sua conta de email, ver notícias, enviar mensagens, jogar joguinhos em Flash... TER SEU BLOG!!!&lt;/p&gt;

&lt;p&gt;Outra coisa que era &lt;em&gt;hype&lt;/em&gt; na época eram &lt;del&gt;discadores personalizados&lt;/del&gt; barras pro Internet Explorer personalizados. Toda empresa provedora de serviços tinha um navegador onde o usuário só clicasse e a primeira página que abria era a da própria provedora.&lt;/p&gt;

&lt;p&gt;E com isso o visitante nem precisaria digitar &lt;em&gt;dáblio dáblio dáblio ponto......&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E mesmo o Yahoo! sendo um dos portais mais famosos e acessados da Internet na época e sempre pensando em performance, uma empresa rival no setor de buscas começou a ter visibilidade e abocanhar seu &lt;em&gt;market share&lt;/em&gt; quando ofereceu uma conta de email onde a capacidade da sua caixa de entrada seria de &lt;strong&gt;um giga&lt;/strong&gt;. Nenhuma outra empresa oferecia tanto espaço para guardar emails. Algumas davam 1mb, 4mb de armazenamento e a pessoa tinha que apagar os emails pra ter espaço para receber mais e-mails.&lt;/p&gt;

&lt;p&gt;Mas esta empresa não contente com o navegador da &lt;strong&gt;Microsoft&lt;/strong&gt;, resolveram ao invés de só criar uma barra personalizada, lançaram um novo navegador: o &lt;strong&gt;Google Chrome&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Que quase levou o nome de &lt;strong&gt;GBrowser&lt;/strong&gt;, analogamente ao GMail.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  Ok, não foi bem assim...
&lt;/h3&gt;

&lt;p&gt;Não foi só pra ter um navegador próprio que a Google criou o Chrome. Foram contratades pessoas desenvolvedoras que participaram do desenvolvimento do Internet Explorer e de ferramentas da Mozilla para a concepção deste produto.&lt;/p&gt;

&lt;p&gt;O &lt;strong&gt;Firefox&lt;/strong&gt; também já existia na época. Mesmo assim o &lt;strong&gt;Internet Explorer&lt;/strong&gt; dominava o &lt;em&gt;market share&lt;/em&gt; dentre os navegadores (claro que por ser um navegador que vinha junto do Windows por padrão).&lt;/p&gt;

&lt;p&gt;Mas a motivação para a criação de um novo navegador pela Google foi a de ter uma experiência para seus usuários do Gmail, Blogger e YouTube muito mais parecida com um aplicativo &lt;em&gt;Desktop&lt;/em&gt; que simples páginas web.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://blog.chromium.org/2018/09/how-we-designed-chrome-10-years-ago.html" rel="noopener noreferrer"&gt;Caso queira saber mais sobre a criação do Google Chrome, veja este artigo, em inglês.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Tá, e pra que toda essa historinha longa?
&lt;/h2&gt;

&lt;p&gt;Este novo navegador criado pelo Google, inicialmente utilizava &lt;a href="https://webkit.org/" rel="noopener noreferrer"&gt;Webkit&lt;/a&gt;, criado pela Apple e já sendo código aberto (open source) desde 2005.&lt;/p&gt;

&lt;p&gt;Porém por &lt;a href="https://www.wired.com/2013/04/blink/" rel="noopener noreferrer"&gt;problemas de compatibilidade&lt;/a&gt;, a Google decidiu criar seu próprio motor interpretador de JavaScript, o &lt;strong&gt;V8&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Toda essa volta pra falar que uma pessoa pegou esse motor do navegador e decidiu tirar ele de lá e rodar localmente na máquina.&lt;/p&gt;

&lt;p&gt;Assim surgiu o &lt;strong&gt;Node.js&lt;/strong&gt;. E nome deste programador é &lt;a href="https://en.wikipedia.org/wiki/Ryan_Dahl" rel="noopener noreferrer"&gt;Ryan Dahl&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;del&gt;E assim começaram os pesadelos e os full stacks unicórnios&lt;/del&gt;&lt;/p&gt;

&lt;p&gt;Isso possibilitou que as pessoas programadoras pudessem usar o mesmo JavaScript que existia no navegador para criar programas que rodavam não no navegador, mas sim na máquina.&lt;/p&gt;

&lt;p&gt;E assim aqui eu costuro com o começo da história:&lt;/p&gt;

&lt;p&gt;O Node tornou possível que pessoas desenvolvedoras na linguagem JavaScript pudessem usar o JavaScript para criar programas que automatizassem tarefas triviais como análise estática de código, validadores de sintaxe, executáveis de testes unitários com emuladores de API do navegador etc...&lt;/p&gt;

&lt;p&gt;E então o &lt;strong&gt;npm&lt;/strong&gt; fomentado pelo &lt;strong&gt;Open Source&lt;/strong&gt; explodiu de aplicações que faziam de tudo, pois muito dev já programava em JavaScript para web.&lt;/p&gt;

&lt;p&gt;Uma delas é o &lt;a href="https://coffeescript.org/" rel="noopener noreferrer"&gt;CoffeeScript&lt;/a&gt;, uma das primeiras linguagens a compilar para JavaScript. Também foi precursor para que voltassem as discussões do &lt;a href="https://www.ecma-international.org/publications-and-standards/standards/ecma-262/" rel="noopener noreferrer"&gt;Ecma262&lt;/a&gt; e a &lt;a href="https://www.ecma-international.org/technical-committees/tc39/" rel="noopener noreferrer"&gt;TC39&lt;/a&gt;, que são comitês de padrões ligados ao JavaScript voltadas às evoluções da linguagem. Inclusive, com o &lt;strong&gt;CoffeeScript&lt;/strong&gt; já era possível utilizar &lt;em&gt;arrow functions&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Hoje existem diversas outras linguagens que compilam para o JavaScript: &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt;, &lt;a href="https://clojurescript.org/" rel="noopener noreferrer"&gt;ClojureScript&lt;/a&gt;, &lt;a href="https://elm-lang.org/" rel="noopener noreferrer"&gt;Elm&lt;/a&gt;, &lt;a href="https://reasonml.github.io/" rel="noopener noreferrer"&gt;ReasonML&lt;/a&gt;, dentre outras.&lt;/p&gt;

&lt;p&gt;Atualmente também existem ferramentas que mesmo rodando a partir do Node, parte foi programada em outra linguagem, muitas vezes &lt;em&gt;low-code&lt;/em&gt; como C, C++ e ultimamente Rust e Go para serem mais performáticas.&lt;/p&gt;




&lt;p&gt;Olá pessoas, sou a &lt;strong&gt;Nina Kitsu&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Decidi contar uma historinha, como diriam, "baseadas em fatos reais", de como foi a minha percepção de fatos sobre tempo enquanto profissional da área focando no surgimento de aplicações feitas com JavaScript fora do navegador, nas máquinas locais.&lt;/p&gt;

&lt;p&gt;Hoje aplicações JavaScript são usadas diariamente no &lt;strong&gt;frontend&lt;/strong&gt;, no &lt;strong&gt;backend&lt;/strong&gt; e até no seu computador.&lt;/p&gt;

&lt;p&gt;E com esta historinha abro uma série onde falo um pouco de ferramentas para ambientes JavaScript e configuração de repositórios.&lt;/p&gt;




&lt;h2&gt;
  
  
  Fontes
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.jetbrains.com/lp/javascript-25/" rel="noopener noreferrer"&gt;25 anos de História do JavaScript, em inglês, publicado no site da JetBrains&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.vice.com/en/article/8q8n3k/a-brief-history-of-the-java-applet" rel="noopener noreferrer"&gt;Uma breve história do Applet Java, em inglês, publicado na Vice&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>braziliandevs</category>
      <category>javascript</category>
      <category>webdev</category>
      <category>tooling</category>
    </item>
    <item>
      <title>Refatoração de código React</title>
      <dc:creator>Nina Kitsu</dc:creator>
      <pubDate>Thu, 06 Feb 2020 17:51:31 +0000</pubDate>
      <link>https://dev.to/ninetails/refatoracao-de-codigo-react-10eb</link>
      <guid>https://dev.to/ninetails/refatoracao-de-codigo-react-10eb</guid>
      <description>&lt;p&gt;Trago neste artigo alguns aprendizados acumulados durante minha carreira. É importante lembrar que apesar dos exemplos serem um pouco generalizados são voltados para utilização dentro de aplicações que utilizem componentes em React e que por isso supõe-se que u leitore tenha algum conhecimento sobre a biblioteca e também sobre ECMAScript.&lt;/p&gt;

&lt;p&gt;Também adiciono que podem ter pontos tanto básicos da linguagem quanto algo avançado.&lt;/p&gt;

&lt;p&gt;&lt;small&gt;E meu português para artigos continua coloquial e com alguns erros de sintaxe que possam gerar confusão.&lt;/small&gt;&lt;/p&gt;




&lt;p&gt;Esse é um assunto recorrente para toda pessoa programadora e em qualquer outra linguagem e em qualquer era da computação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Contos da meia noite
&lt;/h2&gt;

&lt;p&gt;(em &lt;em&gt;fast forward&lt;/em&gt;)&lt;/p&gt;

&lt;p&gt;Para contar uma história resumida ao extremo sobre como surgiram padrões de projeto, &lt;del&gt;&lt;a href="https://youtu.be/CMSYv_Z4SI8" rel="noopener noreferrer"&gt;Our whole universe was in a hot, dense state&lt;/a&gt;...&lt;/del&gt; dois programadores: &lt;a href="https://en.wikipedia.org/wiki/Kent_Beck" rel="noopener noreferrer"&gt;Kent Beck&lt;/a&gt; e &lt;a href="https://en.wikipedia.org/wiki/Ward_Cunningham" rel="noopener noreferrer"&gt;Ward Cunningham&lt;/a&gt; pegaram as idéias de um arquiteto chamado &lt;a href="https://pt.wikipedia.org/wiki/Christopher_Alexander" rel="noopener noreferrer"&gt;Christopher Alexander&lt;/a&gt; e tentaram portá-las para o mundo da criação de Software.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;fonte: &lt;a href="https://en.wikipedia.org/wiki/Software_design_pattern" rel="noopener noreferrer"&gt;Wikipedia&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Depois vieram os &lt;a href="https://en.wikipedia.org/wiki/Design_Patterns" rel="noopener noreferrer"&gt;Gang of Four&lt;/a&gt;, 4 outros autores, e lançaram um livro:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--7xEnNJQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://upload.wikimedia.org/wikipedia/en/7/78/Design_Patterns_cover.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--7xEnNJQX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://upload.wikimedia.org/wikipedia/en/7/78/Design_Patterns_cover.jpg" alt="Capa do livro Design Patterns" width="140" height="175"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Trata-se de um compilado de &lt;strong&gt;padrões de projeto&lt;/strong&gt; para programação orientada a objetos e que foi base para toda a popularização sobre o tema, tal que foi portado e adaptado para todas as outras linguagens.&lt;/p&gt;

&lt;p&gt;E este é só um &lt;em&gt;storytelling&lt;/em&gt; para dizer que este problema pode ser mais antigo o quanto você imagina e que a dor está em todos os lugares.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tá, mas e o React?
&lt;/h2&gt;

&lt;p&gt;Falando da &lt;strong&gt;lib&lt;/strong&gt; em si, a própria documentação tem uma parte &lt;a href="https://pt-br.reactjs.org/docs/design-principles.html" rel="noopener noreferrer"&gt;falando sobre o tema&lt;/a&gt;, explicando como foi tracejado sua concepção. Recomendo a leitura para entender mais como foram as idéias por trás de sua criação.&lt;/p&gt;

&lt;p&gt;Tendo em mente tais idéias, antes de apresentar a minha lista gostaria de evidenciar alguns ideais de desenvolvimentos que serão pertinentes para o decorrer deste artigo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Don%27t_repeat_yourself" rel="noopener noreferrer"&gt;&lt;strong&gt;DRY&lt;/strong&gt; - Don't Repeat Yourself&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://pt.wikipedia.org/wiki/Princ%C3%ADpio_KISS" rel="noopener noreferrer"&gt;&lt;strong&gt;KISS&lt;/strong&gt; - Keep it simple...&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Formatação Vertical &amp;amp; Horizontal - &lt;a href="https://books.google.com/books/about/?id=GXWkDwAAQBAJ&amp;amp;printsec=frontcover&amp;amp;source=kp_read_button&amp;amp;redir_esc=y#v=onepage&amp;amp;q&amp;amp;f=false" rel="noopener noreferrer"&gt;Clean Code&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Se não tiver com pressa, busque sobre o assunto no Google mesmo, depois volte aqui :D&lt;/p&gt;

&lt;h3&gt;
  
  
  Bom senso
&lt;/h3&gt;

&lt;p&gt;Creio que acima de tudo, vale o bom senso. Talvez da própria pessoa desenvolvedora (ou seja, você) ou mesmo em acordo de time. O padrão de desenvolvimento adotado na concepção do produto deve ser um princípio na criação do produto. Um ótimo exemplo é no link lá em cima dos &lt;a href="https://pt-br.reactjs.org/docs/design-principles.html" rel="noopener noreferrer"&gt;princípios de design do React&lt;/a&gt;, o importante é o projeto ter consistência.&lt;/p&gt;

&lt;p&gt;Não fará nenhum sentido colocar 20 &lt;em&gt;design patterns&lt;/em&gt; enquanto você cita 10 nomes de pessoas importantes no desenvolvimento de Software se ninguém mais do seu time comprar a idéia. Seu código não tornará mais legível se quem ler seu código não entender onde você quer chegar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Minha listinha
&lt;/h2&gt;

&lt;p&gt;Essa lista não é bem uma lista, mas sim algumas releituras de documentações e alguns exemplos de melhorias de código que fui acumulando durante minha carreira.&lt;/p&gt;

&lt;p&gt;Também aponto uma outra fonte de padrões já existentes: &lt;a href="https://reactpatterns.com/" rel="noopener noreferrer"&gt;https://reactpatterns.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Citarei alguns padrões existentes na lista deles porém com outro viés.&lt;/p&gt;

&lt;p&gt;Também gostaria de explicar algumas idéias básicas para quem é iniciante e que estão acessando esse artigo, então se algum item você achar básico demais pode pular.&lt;/p&gt;

&lt;h3&gt;
  
  
  JS(X)?
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;(&lt;em&gt;jeiésséquis&lt;/em&gt; is too &lt;em&gt;sexy&lt;/em&gt;)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O &lt;a href="https://pt-br.reactjs.org/docs/introducing-jsx.html" rel="noopener noreferrer"&gt;JSX&lt;/a&gt; é uma &lt;strong&gt;extensão de sintaxe JavaScript&lt;/strong&gt; inspirada no &lt;strong&gt;XML&lt;/strong&gt;, famoso "tag HTML dentro do seu JS". Coloco ele como uma primeira idéia a discutir pois ainda vejo muita galera que está começando com React achá-lo estranho. E é mesmo.&lt;/p&gt;

&lt;p&gt;Porém gostaria de dismistificá-lo. O &lt;strong&gt;JSX&lt;/strong&gt;, tal como explicado na documentação do React, diz-se "uma extensão de sintaxe para JavaScript". E realmente é. Apesar de popularizado pelo React, tem muito mais a ver com o &lt;strong&gt;Babel&lt;/strong&gt;, que é uma ferramenta que compila seu código &lt;strong&gt;ECMAScript&lt;/strong&gt; para uma versão que pode ser interpretada pelos navegadores.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ECMAScript&lt;/strong&gt; é a mesma coisa que &lt;strong&gt;JavaScript&lt;/strong&gt;, só que &lt;a href="https://www.theregister.co.uk/2018/04/18/oracle_ios_app_takedown_javascript/" rel="noopener noreferrer"&gt;sem direitos autorais&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ou seja, quando você ver esse código:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se trata apenas de &lt;strong&gt;ECMAScript&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se não acredita em mim, &lt;a href="https://babeljs.io/repl#?browsers=&amp;amp;build=&amp;amp;builtIns=false&amp;amp;spec=false&amp;amp;loose=false&amp;amp;code_lz=GYVwdgxgLglg9mABAeSgCwKYCcDCcC2ADghmFIgBQDeiEaMANgCZamIC-AlIlQFCKJWUEFiQAeJjABuPAHTzCWOIQDO7AHxU6jFqXZiA9JKnre7Xr1CRYCRHiIkylGtuaswAGkTzZi5So5uPgEhEXFUTFwCYjBSciofP1UNLXo3PUMI7HsYuNN2IA&amp;amp;debug=false&amp;amp;forceAllTransforms=false&amp;amp;shippedProposals=false&amp;amp;circleciRepo=&amp;amp;evaluate=false&amp;amp;fileSize=false&amp;amp;timeTravel=false&amp;amp;sourceType=module&amp;amp;lineWrap=true&amp;amp;presets=es2017%2Creact%2Cstage-2&amp;amp;prettier=false&amp;amp;targets=&amp;amp;version=7.8.3&amp;amp;externalPlugins=" rel="noopener noreferrer"&gt;teste você mesmo!&lt;/a&gt; Escrevendo sem &lt;strong&gt;JSX&lt;/strong&gt; você consegue usar &lt;strong&gt;React&lt;/strong&gt; direto no navegador, já que o mesmo não entende código &lt;strong&gt;JSX&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;"Ah mas eu uso &lt;strong&gt;classes&lt;/strong&gt;".&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Classes no &lt;strong&gt;ES6&lt;/strong&gt; são apenas &lt;a href="https://medium.com/@naveenkarippai/debunking-fake-classes-in-javascript-78f67a6b5c96" rel="noopener noreferrer"&gt;syntax sugar&lt;/a&gt; de funções e prototipagem. Brinque um pouco com o &lt;a href="https://babeljs.io/repl" rel="noopener noreferrer"&gt;REPL do Babel&lt;/a&gt; e veja como seria seu código para navegadores que não suportam ES6.&lt;/p&gt;

&lt;p&gt;Darei outro exemplo abaixo, utilizando um componente dentro de outro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;OutroComponente&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;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;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OutroComponente&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&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;children&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/OutroComponente&lt;/span&gt;&lt;span class="err"&gt;&amp;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;strong&gt;Babel&lt;/strong&gt; transforma o acima no abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;OutroComponente&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;div&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;children&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;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;props&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="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createElement&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;OutroComponente&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;children&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;No final é tudo função.&lt;/strong&gt; - Guarde bem essa afirmação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Render &lt;em&gt;wat&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--TfNUYbOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.ytimg.com/vi/lxZTcDePoqI/maxresdefault.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--TfNUYbOX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://i.ytimg.com/vi/lxZTcDePoqI/maxresdefault.jpg" alt="meme de uma mulher com uma legenda escrita " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No React meu componente pode retornar um componente ou uma composição de componentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;OtroComponente&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas lembre também que seu componente pode retornar também outros tipos:&lt;/p&gt;

&lt;h4&gt;
  
  
  Strings
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Oi leitore!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Null
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;NullComponent&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(na verdade ele não renderiza nada visual)&lt;/p&gt;

&lt;h4&gt;
  
  
  Array
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;ArrayComponent&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="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Repetindo &lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="mi"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;NullComponent&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;null&lt;/span&gt;&lt;span class="dl"&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;StringComponent&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;string&lt;/span&gt;&lt;span class="dl"&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="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Renderiza: "Repetindo 9Oi leitor!"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;(Após o React v16.2)&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;É importante ressaltar que é necessário o atributo &lt;code&gt;key&lt;/code&gt; e que assim funciona da mesma forma que a maioria dos &lt;em&gt;reacteires&lt;/em&gt; estão acostumados a enfrentar laços de repetição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;items&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&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;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(({&lt;/span&gt;&lt;span class="nx"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
          &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`item-{id}`&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;value&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;)
&lt;/span&gt;      &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;&lt;small&gt;&lt;strong&gt;edit:&lt;/strong&gt; por favor, não utilize o índice do &lt;em&gt;array&lt;/em&gt; como atributo &lt;code&gt;key&lt;/code&gt;. Obrigado &lt;strong&gt;Stefano&lt;/strong&gt; por me lembrar.&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;Seria como imprimir um vetor de componentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{[&lt;/span&gt;
        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`item-1`&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;item1&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`item-2`&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;item2&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;        &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;span&lt;/span&gt; &lt;span class="nx"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`item-3`&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;item3&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/span&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;,
&lt;/span&gt;        &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;]}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;&lt;small&gt;&lt;strong&gt;edit 2:&lt;/strong&gt; A forma como o Typescript lida com &lt;em&gt;childrens&lt;/em&gt; pode ser diferente.&lt;/small&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://reactjs.org/blog/2017/11/28/react-v16.2.0-fragment-support.html" rel="noopener noreferrer"&gt;Fragments&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;Também na versão do React v16.2 vieram os fragmentos. A idéia é bem similar aos &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/API/DocumentFragment" rel="noopener noreferrer"&gt;DocumentFragment&lt;/a&gt; já existente no &lt;strong&gt;DOM&lt;/strong&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Fragment&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;hum&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;dovs&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;trevs&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/React.Fragment&lt;/span&gt;&lt;span class="err"&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;Utilizando o &lt;strong&gt;Babel&lt;/strong&gt; após a &lt;strong&gt;versão 7&lt;/strong&gt; também é possível utilizar um &lt;em&gt;shorthand&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&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="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;hum&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;dovs&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;li&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;trevs&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/li&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&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;Link do &lt;a href="https://babeljs.io/repl#?browsers=&amp;amp;build=&amp;amp;builtIns=false&amp;amp;spec=false&amp;amp;loose=false&amp;amp;code_lz=GYVwdgxgLglg9mABAYTgWwA4IKZiogCgEpEBvAKEUQCdsoRqkDKrEAeAPhdfYBsYOACxBo2Aen5ceVNpIAmcAG4BncZO6tZAqLRVqBG8VMRFyAXyA&amp;amp;debug=false&amp;amp;forceAllTransforms=false&amp;amp;shippedProposals=false&amp;amp;circleciRepo=&amp;amp;evaluate=false&amp;amp;fileSize=false&amp;amp;timeTravel=false&amp;amp;sourceType=module&amp;amp;lineWrap=true&amp;amp;presets=react%2Cstage-2&amp;amp;prettier=false&amp;amp;targets=&amp;amp;version=7.8.3&amp;amp;externalPlugins=" rel="noopener noreferrer"&gt;repl do Babel&lt;/a&gt; pra você brincar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaração de função: explícita ou &lt;em&gt;Arrow Function&lt;/em&gt;
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Nota da autora: essa é uma posição pessoal. Fique livre em discordar e não utilizar.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Para componentes React &lt;strong&gt;minha preferência&lt;/strong&gt; é para funções explícitas quando não utilizar &lt;strong&gt;HOC&lt;/strong&gt; ou algum "gerador" de componente. Um exemplo claro de função retornando componentes são &lt;code&gt;styled components&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;`
  /* ... */
`&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  Mas ...Por que?
&lt;/h4&gt;

&lt;p&gt;Prefiro funções explícitas pois, por legibilidade, é mais fácil encontrar uma função no meio de diversas outras quando está declarada explicitamente que uma no meio de diversas &lt;code&gt;const&lt;/code&gt;s.&lt;/p&gt;

&lt;p&gt;Também historicamente o React DevTools não pegava o nome do componente a não ser que estivesse sido declarado utilizando função explícita. Hoje a história é outra. O DevTools consegue (nem sempre, discutirei mais a frente) pegar o nome do componente sem problemas.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Arrow Functions&lt;/em&gt; são anônimas, o que dependendo do problema chega-se a outro padrão:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://github.com/yannickcr/eslint-plugin-react/blob/master/docs/rules/display-name.md" rel="noopener noreferrer"&gt;.displayName&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Use quando necessário. Fica difícil depurar código quando o &lt;strong&gt;DevTools&lt;/strong&gt; mostra toda uma árvore de &lt;em&gt;&lt;code&gt;Anonymous&lt;/code&gt; Components&lt;/em&gt;. Não é nem questão de escrever ou não utilizando &lt;em&gt;arrow function&lt;/em&gt;, adicionar &lt;code&gt;.displayName&lt;/code&gt; não mata gatinhos e vai auxiliar bastante mesmo para diminuir a quantidade de &lt;code&gt;styled(AlgumaCoisa)&lt;/code&gt; que pode prejudicar a visualização.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://github.com/facebook/react/blob/90294ead4c627715cb70f20ff448bb0d34ee4c1b/src/renderers/shared/stack/reconciler/ReactCompositeComponent.js#L50-L52" rel="noopener noreferrer"&gt;E vai aparecer bonito na &lt;em&gt;stacktrace&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Smart vs Dumb Components
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;(no geral)&lt;/strong&gt; &lt;em&gt;Dumb Components&lt;/em&gt; são fáceis de &lt;em&gt;mockar&lt;/em&gt;, testar e inclusive de visualizar no Storybook&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Separe sempre que possível seus componentes. Curto e utilizo bastante o &lt;a href="https://storybook.js.org/" rel="noopener noreferrer"&gt;Storybook&lt;/a&gt;. Com ele é possível deixar um componente &lt;em&gt;fullscreen&lt;/em&gt; e inclusive utilizar uma &lt;em&gt;view&lt;/em&gt; inteira da sua aplicação, &lt;em&gt;mockando&lt;/em&gt; seus dados caso ela seja &lt;em&gt;burra&lt;/em&gt; e testar a responsividade da página inteira utilizando o &lt;strong&gt;Chrome DevTools&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://pt-br.reactjs.org/docs/typechecking-with-proptypes.html#default-prop-values" rel="noopener noreferrer"&gt;.defaultProps&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Há duas formas para atribuir valores padrão para as &lt;code&gt;props&lt;/code&gt; em Componentes Funcionais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kitsu&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="k"&gt;return&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hi&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;e&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hi&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kitsu&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Prefira o primeiro formato exceto no caso que descreverei abaixo:&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://pt-br.reactjs.org/docs/optimizing-performance.html#shouldcomponentupdate-in-action" rel="noopener noreferrer"&gt;shouldComponentUpdate()&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;Quando fazíamos componentes usando classes, havia uma forma de otimizar a renderização e deixar explícito para o React quando é para renderizar novamente ou não dependendo de alguns fatores previamente configurados. Esta ferramenta é o &lt;code&gt;shouldComponentUpdate&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyComponent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;shouldComponentUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;nextProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nextState&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// props&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;nextProps&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;

    &lt;span class="c1"&gt;// state&lt;/span&gt;
    &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;state&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt; &lt;span class="o"&gt;!==&lt;/span&gt; &lt;span class="nx"&gt;nextState&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="nf"&gt;render &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&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 componentes criados a partir de classes é possível utilizá-lo para controlar a renderização somente quando há alteração de &lt;code&gt;props&lt;/code&gt; ou do &lt;code&gt;state&lt;/code&gt; e inclusive dizer quais mudanças o componente deveria ativamente ouvir para renderizar ou não o componente.&lt;/p&gt;

&lt;p&gt;Ainda sobre componentes de classes, também existe um &lt;code&gt;shorthand&lt;/code&gt; que faz uma checagem &lt;code&gt;shallow&lt;/code&gt; (raza):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MyComponent&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nc"&gt;PureComponent&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nf"&gt;render &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// ...&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A comparação raza é feita da seguinte forma: ele verifica se algum ítem de &lt;code&gt;props&lt;/code&gt; ou do &lt;code&gt;state&lt;/code&gt; alteraram no primeiro nível dos objetos. Trabalhando com &lt;strong&gt;imutabilidade&lt;/strong&gt; dá pra gerenciar bem quando o componente deve renderizar.&lt;/p&gt;

&lt;h4&gt;
  
  
  E pra Componentes Funcionais?
&lt;/h4&gt;

&lt;p&gt;O &lt;a href="https://pt-br.reactjs.org/docs/react-api.html#reactmemo" rel="noopener noreferrer"&gt;React.memo&lt;/a&gt; é algo novo (veio na versão &lt;code&gt;16.6&lt;/code&gt;) e veio exatamente para auxiliar neste problema, só tem um detalhe: funciona apenas para &lt;code&gt;props&lt;/code&gt; (pois estados utilizando &lt;strong&gt;Hooks&lt;/strong&gt; são executados dentro do próprio &lt;em&gt;render&lt;/em&gt; do componente, não sendo possível uma interceptação do dado pelo &lt;em&gt;React.memo&lt;/em&gt;). Abaixo um exemplo retirado da documentação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/* renderize usando props */&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;areEqual&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;prevProps&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;nextProps&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="cm"&gt;/*
  se prevProps e nextProps renderizam o mesmo resultado,
  retorne true.
  caso contrário, retorne false.
  */&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;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;MyComponent&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;areEqual&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A maneira que o React lida com estado de componentes funcionais foi introduzida na versão 16.8 com a vinda dos &lt;code&gt;Hooks&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Como os &lt;em&gt;Hooks&lt;/em&gt; são executados dentro da própria função de &lt;em&gt;render&lt;/em&gt;, o &lt;code&gt;React.memo&lt;/code&gt; não consegue manusear por fora do componente o que acontece dentro dele.&lt;/p&gt;

&lt;p&gt;E aí que vem o ganho de utilizar &lt;code&gt;.defaultProps&lt;/code&gt; fora dos argumentos do React:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hi&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;defaultProps&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Kitsu&lt;/span&gt;&lt;span class="dl"&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;MemoGreeting&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;memo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode deixar ítens no &lt;code&gt;.defaultProps&lt;/code&gt; e eles ficam disponíveis para comparação na função do &lt;code&gt;React.memo&lt;/code&gt;. Quando você deixa &lt;em&gt;default props&lt;/em&gt; dentro da chamada dos argumentos da função, ele sempre será executado somente após o &lt;em&gt;React.memo&lt;/em&gt;, não sendo possível efetuar a comparação.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;Prop Types&lt;/em&gt; com &lt;em&gt;Spread&lt;/em&gt; de atributos
&lt;/h3&gt;

&lt;p&gt;&lt;small&gt;(Se você usa &lt;strong&gt;TypeScript&lt;/strong&gt; &lt;del&gt;(ou &lt;strong&gt;Flow&lt;/strong&gt;)&lt;/del&gt;, pule uma casa.)&lt;/small&gt;&lt;/p&gt;

&lt;p&gt;No &lt;strong&gt;React Patterns&lt;/strong&gt; tem um exemplo bem bacana, mas gostaria muito de compartilhar um fato quando define-se &lt;code&gt;propTypes&lt;/code&gt; no JavaScript. Pense no exemplo a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;restProps&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyDiv&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;restProps&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Hi&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;name&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;!&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyDiv&amp;gt;&lt;/span&gt;&lt;span class="err"&gt;;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;propTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O mais comum é deixar que o componente &lt;code&gt;MyDiv&lt;/code&gt; tenha sua validação de &lt;em&gt;Prop Types&lt;/em&gt;. Porém se em algum momento você precisar validar no seu componente coisas que já são validadas nos &lt;em&gt;Prop Types&lt;/em&gt; do componente filhe, lembre que o &lt;code&gt;.propTypes&lt;/code&gt; é um objeto.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;Greeting&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;propTypes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="p"&gt;...&lt;/span&gt;&lt;span class="nx"&gt;MyDiv&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;propTypes&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;PropTypes&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;isRequired&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você pode estender os seus &lt;em&gt;Prop Types&lt;/em&gt; com qualquer outro objeto de &lt;em&gt;Prop Types&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Condicionais
&lt;/h3&gt;

&lt;p&gt;Ter condicionais no meio do &lt;code&gt;JSX&lt;/code&gt; é um &lt;em&gt;anti-pattern&lt;/em&gt; bem eficaz, muito utilizado e amplamente difundido por &lt;em&gt;reacters&lt;/em&gt;. É normal encontrar um &lt;em&gt;short-circuit evaluation&lt;/em&gt; ou mesmo um ternariozinho aqui ou lá e retirar esses condicionais torna o código verboso por provavelmente precisar criar mais Componentes. Porém creio que todos que já codaram React também já viram códigos com uma superutilização delas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;vaiChover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;diaDeBanho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;calor&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;vaiChover&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;diaDeBanho&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;calor&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Chuveiro&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/div&lt;/span&gt;&lt;span class="err"&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;Nestes casos o que recomendo como ação básica imediata é: extraia a lógica de condicionais para uma variável a parte:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Component&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;vaiChover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;diaDeBanho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;calor&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="nx"&gt;shouldDisplayChuveiro&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;vaiChover&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;diaDeBanho&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;calor&lt;/span&gt;
  &lt;span class="k"&gt;return &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;shouldDisplayChuveiro&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Chuveiro&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&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;Melhora a legibilidade? Nem tanto.&lt;/p&gt;

&lt;p&gt;Porém em alguns casos é possível jogar essa responsabilidade pro componente filho (claro, quando fizer sentido essa responsabilidade ser repassada para ele). Lembra que você pode fazer seu componente retornar null e não renderizar conteúdo?&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;Chuveiro&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;vaiChover&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;diaDeBanho&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;calor&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;vaiChover&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;diaDeBanho&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;
  &lt;span class="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;calor&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="err"&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;Component&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;props&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="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
      &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Chuveiro&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;      &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* ... */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&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;h3&gt;
  
  
  &lt;a href="https://reactpatterns.com/#proxy-component" rel="noopener noreferrer"&gt;Proxy&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;O site do React Patterns tem um ótimo exemplo simples com um botão:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// Ergo Proxy&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;Button&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;props&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt; &lt;span class="nx"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;button&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;{...&lt;/span&gt;&lt;span class="nx"&gt;props&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas gostaria de estender essa idéia. Na verdade, tá mais para um &lt;em&gt;hack&lt;/em&gt;. No React você &lt;em&gt;grosseiramente&lt;/em&gt; pode utilizar componentes com ponto (&lt;code&gt;.&lt;/code&gt;). Um exemplo da própria documentação do React é a &lt;a href="https://pt-br.reactjs.org/docs/context.html#reactcreatecontext" rel="noopener noreferrer"&gt;Context API&lt;/a&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyContext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createContext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;defaultValue&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="c1"&gt;// Provider&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Provider&lt;/span&gt; &lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="cm"&gt;/* some value */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;

&lt;span class="c1"&gt;// Consumer&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyContext&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Consumer&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;value&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="cm"&gt;/* renderiza algo baseado no valor do context */&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyContext.Consumer&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Ok, eu menti sobre usar componentes contendo ponto no nome, tecnicamente não é o correto. Mas sim, você pode utilizar componentes como atributos de objetos. Isso possibilita a criação de certos componentes "escopando" sua utilização, como por exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyBanner&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;path/to/MyBanner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CloseButton&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Mensagem&lt;/span&gt; &lt;span class="nx"&gt;a11y&lt;/span&gt; &lt;span class="nx"&gt;pro&lt;/span&gt; &lt;span class="nx"&gt;botão&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;fechar&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyBanner.CloseButton&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;
    &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mensagem descritiva sobre a imagem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Conteúdo&lt;/span&gt; &lt;span class="nx"&gt;pro&lt;/span&gt; &lt;span class="nx"&gt;meu&lt;/span&gt; &lt;span class="nx"&gt;banner&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyBanner.Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Cta&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="nx"&gt;handleOnClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt; &lt;span class="nx"&gt;aqui&lt;/span&gt; &lt;span class="nx"&gt;vem&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyBanner.Cta&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyBanner&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E o arquivo do meu componente seria algo como:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="c1"&gt;// MyBanner.js&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;MyBanner&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;div&lt;/span&gt;&lt;span class="s2"&gt;`...`&lt;/span&gt;

&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;CloseButton&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&gt;`...`&lt;/span&gt;
&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;img&lt;/span&gt;&lt;span class="s2"&gt;`...`&lt;/span&gt;
&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;p&lt;/span&gt;&lt;span class="s2"&gt;`...`&lt;/span&gt;
&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Cta&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;styled&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;button&lt;/span&gt;&lt;span class="s2"&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;MyBanner&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Claro que esse padrão é longe de ser algo ideal, eu diria que é muito mais situacional: quando não há um controle sobre criação de componentes que sejam reutilizáveis ou para algo muito específico que vale ter tal escopo.&lt;/p&gt;

&lt;p&gt;Ainda ressalto que o ideal e mais recomendável seria utilizar componentes já existentes:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;MyBanner&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;path/to/MyBanner&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;MyBanner&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;CloseButton&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Mensagem&lt;/span&gt; &lt;span class="nx"&gt;a11y&lt;/span&gt; &lt;span class="nx"&gt;pro&lt;/span&gt; &lt;span class="nx"&gt;botão&lt;/span&gt; &lt;span class="nx"&gt;de&lt;/span&gt; &lt;span class="nx"&gt;fechar&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/CloseButton&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Image&lt;/span&gt;
    &lt;span class="nx"&gt;src&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;https://...&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
    &lt;span class="nx"&gt;alt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mensagem descritiva sobre a imagem&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="o"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Text&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;Conteúdo&lt;/span&gt; &lt;span class="nx"&gt;pro&lt;/span&gt; &lt;span class="nx"&gt;meu&lt;/span&gt; &lt;span class="nx"&gt;banner&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Text&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;  &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Button&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="nx"&gt;handleOnClick&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;E&lt;/span&gt; &lt;span class="nx"&gt;aqui&lt;/span&gt; &lt;span class="nx"&gt;o&lt;/span&gt; &lt;span class="nx"&gt;call&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;to&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nx"&gt;action&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/Button&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/MyBanner&lt;/span&gt;&lt;span class="err"&gt;&amp;gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  E Hooks?
&lt;/h2&gt;

&lt;p&gt;Creio que este é um assunto que vale uma nova postagem só para este assunto e acho que já me estendi em vários outros aspectos.&lt;/p&gt;

&lt;p&gt;Mas tudo que falo para componentes vale para funções ;D&lt;/p&gt;

&lt;h2&gt;
  
  
  Quando refatorar?
&lt;/h2&gt;

&lt;p&gt;Queria usar etimologia para lembrar que sempre dizemos &lt;strong&gt;refatorar&lt;/strong&gt; e nunca &lt;strong&gt;fatorar&lt;/strong&gt;. Ou seja, antes de tudo: faça funcionar. E exatamente por fazer funcionar, ninguém vai fazer um código &lt;a href="https://kotaku.com/the-exceptional-beauty-of-doom-3s-source-code-5975610?post=56177550" rel="noopener noreferrer"&gt;a la John Carmack&lt;/a&gt; de primeira. Também muitos de nós enfrentamos entregas, não há como fugir.&lt;/p&gt;

&lt;p&gt;Faça com calma e coloque testes. Lembre daquele ciclo do &lt;strong&gt;TDD&lt;/strong&gt; e aplique: &lt;strong&gt;red-green-refactor&lt;/strong&gt;. Faça o teste para quebrar; faça funcionar e então faça direito. Ou mesmo:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://wiki.c2.com/?MakeItWorkMakeItRightMakeItFast" rel="noopener noreferrer"&gt;Faça funcionar, faça direito, faça-o executar rapidamente&lt;/a&gt;. - Kent Beck&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Por que refatorar?
&lt;/h2&gt;

&lt;p&gt;Mesmo com a correria de prazos, refatorar o código de uma maneira que utilize padrões já conhecidos ou mesmo sem utilizá-los já é um ganho quando bem executado. Se o produto tem a necessidade de ter futuras manutenções e ser escalável, é necessário ter um código de fácil legibilidade e sem muito atrito para modificações e melhorias.&lt;/p&gt;

&lt;p&gt;Ainda jogo uma analogia com algo da nossa área: para otimizar a rapidez de leitura geralmente bancos de dados gastam mais tempo na parte da escrita para deixá-lo com certa ordenação para facilitar no resgate do dado.&lt;/p&gt;

&lt;p&gt;Creio que para código podemos ter algo semelhante: perca um tempo para escrever um código que fique fácil de dar manutenção pois quando for preciso e chegar a hora da manutenção, terá menos problemas e vai ser mais rápido fazer qualquer alteração.&lt;/p&gt;

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

&lt;p&gt;Eu indico &lt;a href="https://martinfowler.com/books/refactoring.html" rel="noopener noreferrer"&gt;Refactoring, do Martin Fowler&lt;/a&gt; &lt;del&gt;e também o &lt;a href="https://books.google.com.br/books/about/C%C3%B3digo_Limpo.html?id=GXWkDwAAQBAJ&amp;amp;printsec=frontcover&amp;amp;source=kp_read_button&amp;amp;redir_esc=y#v=onepage&amp;amp;q&amp;amp;f=false" rel="noopener noreferrer"&gt;Clean Code, do Uncle Bob&lt;/a&gt;&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;Os pontos abaixo são bem explorados pelos livros e creio que com estas 2 dicas sensacionalistas resumidas você irá conseguir escrever seu código tão desejado:&lt;/p&gt;

&lt;h3&gt;
  
  
  Formatação
&lt;/h3&gt;

&lt;p&gt;Atente-se à formatação do teu código. No &lt;strong&gt;Clean Code&lt;/strong&gt; há partes onde explicam tanto &lt;strong&gt;formatação horizontal&lt;/strong&gt; quanto &lt;strong&gt;formatação vertical&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Em qualquer idioma, ler parágrafos grandes prejudica a leitura de qualquer conteúdo editorial. Da mesma forma, ter código pouco espaçado ou com muito &lt;em&gt;scroll&lt;/em&gt; acaba virando um pesadelo para entender seu funcionamento.&lt;/p&gt;

&lt;h3&gt;
  
  
  Escreva seu código como uma carta de amor para outro desenvolvedor
&lt;/h3&gt;

&lt;p&gt;Levem na brincadeira a afirmação porém escrevam código para que outros desenvolvedores entendam, você inclusive. E não estou dizendo de encher seu código de comentários que muitas vezes podem ser redundantes. Deixe o &lt;strong&gt;seu&lt;/strong&gt; código semântico, não importando se é HTML, JS ou qualquer outra linguagem, e que seja fácil de ser lido e com APIs de fácil utilização. Faça com que seu componente seja fácil de ser utilizado e entendido. Faça uma boa documentação e de fácil manutenção/atualização (ex: &lt;em&gt;Storybook&lt;/em&gt;) e automatize o que for possível (ex: documentar as &lt;em&gt;PropTypes&lt;/em&gt; direto da declaração de interface do &lt;em&gt;TypeScript&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Algo que vejo crescer nos últimos anos é o termo &lt;a href="https://hackernoon.com/the-best-practices-for-a-great-developer-experience-dx-9036834382b0" rel="noopener noreferrer"&gt;Developer Experience (DX)&lt;/a&gt;. Mesmo se seu código não for aberto, ao escrever código que possa ser lido &lt;a href="https://www.reddit.com/r/EILI5/" rel="noopener noreferrer"&gt;até por uma criança de 5 anos&lt;/a&gt; (não literalmente, pfv), isso pode facilitar pra você mesmo quando tiver de dar manutenção 5 anos depois, lembrando &lt;em&gt;zero&lt;/em&gt; em relação ao conhecimento que você possui no momento da escrita do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estrutura
&lt;/h2&gt;

&lt;p&gt;Para estruturar arquivos e código existem diversos padrões. Antes de tudo: dê preferência pro padrão já existente, ainda mais se for um padrão já adotado pelo time.&lt;/p&gt;

&lt;p&gt;Existem diversos padrões: &lt;a href="https://github.com/erikras/ducks-modular-redux" rel="noopener noreferrer"&gt;ducks&lt;/a&gt;, &lt;a href="https://www.freecodecamp.org/news/how-to-write-robust-apps-consistently-with-the-clean-architecture-9bdca93e17b/" rel="noopener noreferrer"&gt;Clean Architecture&lt;/a&gt;...&lt;/p&gt;

&lt;p&gt;Pessoalmente gosto de algo mais livre com uma pegada mais funcional e um pouco de DDD. Caso também seja o teu perfil, recomendo bastante a estrutura do &lt;strong&gt;Dan Abramov&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://react-file-structure.surge.sh/" rel="noopener noreferrer"&gt;https://react-file-structure.surge.sh/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;E eu estenderia também para código, tal como &lt;a href="http://number-none.com/blow/john_carmack_on_inlined_code.html" rel="noopener noreferrer"&gt;John Carmack&lt;/a&gt; sugere. Como citado anteriormente: Se teu módulo (arquivos &lt;strong&gt;ESM&lt;/strong&gt;) começar a ficar grande, quebre em mais arquivos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Estrutura &lt;strong&gt;bonus&lt;/strong&gt;
&lt;/h3&gt;

&lt;p&gt;Tente também não criar uma estrutura de arquivos muito aninhada. Tente sempre deixar o mais &lt;em&gt;flat&lt;/em&gt; possível, ou seja, evite diretórios dentro de diretórios virar uma árvore gigante. Tente sempre deixar o mais perto possível da raiz do pacote/projeto e quebre mais os seus componentes e código se começar a aninhar muito.&lt;/p&gt;

&lt;p&gt;Se seu projeto for um &lt;strong&gt;monorepo&lt;/strong&gt;, extraia/quebre funcionalidades em módulos/pacotes. &lt;a href="https://en.wikipedia.org/wiki/Unix_philosophy" rel="noopener noreferrer"&gt;"Make each program do one thing well"&lt;/a&gt;. Quebre mais seu código e faça com que seus módulos sejam pequenos e que façam apenas uma coisa e bem. Isso também facilitará na hora de trocar um &lt;strong&gt;módulo&lt;/strong&gt; por outro e facilita também na hora de criar testes.&lt;/p&gt;

&lt;h2&gt;
  
  
  E não se esqueça
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PHQEyCNa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://images.uncyc.org/pt/thumb/d/db/Caloi.jpg/300px-Caloi.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PHQEyCNa--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://images.uncyc.org/pt/thumb/d/db/Caloi.jpg/300px-Caloi.jpg" alt="Comercial da Caloi antiga que dizia " width="300" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Use tanto testes quanto estilo de código (&lt;em&gt;Coding Style&lt;/em&gt;) e ferramentas de automatização ao seu favor. Faça interfaces que facilitem o uso de componentes, &lt;em&gt;"Não me faça pensar"&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--HKlCBfZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://d1pkzhm5uq4mnt.cloudfront.net/imagens/capas/mp_64a646094d7cf506020b3c25608a1cda.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--HKlCBfZw--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://d1pkzhm5uq4mnt.cloudfront.net/imagens/capas/mp_64a646094d7cf506020b3c25608a1cda.jpg" alt="Capa do livro " width="240" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quanto mais abstraído teu código e fácil de entender, mais rápido será para fazer alterações, dar manutenção e adicionar funcionalidades.&lt;/p&gt;

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

&lt;p&gt;Desenvolvimento de Software ainda é uma disciplina bem artesanal. Mesmo tendo automações, ainda é necessário escrever código para que programas, &lt;em&gt;sites&lt;/em&gt; e aplicativos funcionem. Ainda não é acessível ter automatizado algo que nos &lt;em&gt;cuspa&lt;/em&gt; códigos, pior ainda para &lt;em&gt;frontend&lt;/em&gt; que ainda temos que além de pensar em fazer um bom código e tanto seu código quanto a saída pro usuário devem ser semânticas, leves e rápidas para rodar em celulares e em leitores de tela por exemplo.&lt;/p&gt;

&lt;p&gt;Outra profissão que gosto de citar é a de arquitete, já que as idéias para padrões de projetos foram inspiradas por um. Só que a diferença é que nós pessoas desenvolvedoras temos que arquitetar sistemas que além de possuir uma base boa e forte, todo o produto deve ser escalável e possível de adicionar novas funcionalidades, algo que para um arquitete seria bem mais limitado.&lt;/p&gt;

&lt;p&gt;Enquanto a tecnologia não evoluir a ponto de escrever programas inteiros usando inteligência artificial e automações, apesar de escrevermos códigos que serão lidos pela máquina, não se esqueça que eles também serão lidos por outros humanos.&lt;/p&gt;

&lt;h2&gt;
  
  
  EDIT
&lt;/h2&gt;

&lt;p&gt;Por favor, se for consumir os livros: "Código Limpo", "Arquitetura Limpa" ou "Codificador limpo" não compre, &lt;del&gt;pirateie&lt;/del&gt;.&lt;/p&gt;

&lt;p&gt;Pois o autor é assumidamente &lt;strong&gt;transfóbico&lt;/strong&gt;. Sei que é um pedido egoísta mas por favor, não consuma artigos de pessoas transfóbicas.&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>refactoring</category>
      <category>react</category>
      <category>braziliandevs</category>
    </item>
    <item>
      <title>Experiências com Svelte por uma pessoa desenvolvedora React (defasado) [pt-BR]</title>
      <dc:creator>Nina Kitsu</dc:creator>
      <pubDate>Thu, 01 Aug 2019 21:29:46 +0000</pubDate>
      <link>https://dev.to/ninetails/experiencias-com-svelte-por-um-desenvolvedor-react-pt-br-4mj9</link>
      <guid>https://dev.to/ninetails/experiencias-com-svelte-por-um-desenvolvedor-react-pt-br-4mj9</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;ARTIGO ANTIGO&lt;/strong&gt; Artigo escrito em agosto de 2019. Na época o Svelte não possuia suporte nativo a TypeScript e o Sveltekit ainda não existia.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Esta não é a primeira versão do Svelte e creio que a grande maioria nunca se importou antes pois não parecia maduro o suficiente. Para mim foi assim, pelo menos. Também sinto que não sou o único que começou a ter interesse na ferramenta após a versão 3.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fszxxzaps6w7coqe9hi0a.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fszxxzaps6w7coqe9hi0a.png" alt="Uma tirinha em inglês onde um garoto aponta que "&gt;&lt;/a&gt;&lt;/p&gt;

...e fiquei empolgada &lt;sup&gt;&lt;sup&gt;fodeu&lt;/sup&gt;&lt;/sup&gt;




&lt;p&gt;Para situar você, meu caro leitor, minha cara leitora e meu caro leitore de único artigo, vou introduzir um pouco sobre Svelte. O texto acabou ficando um pouco longo pois não pretendo dividir em partes dado que faço artigos com pouquíssima freqüência (nula, pra ser sincera). As minhas experiências foram focadas em integrações de Svelte com ferramentas e tecnologias de mercado. Caso você já saiba o que é Svelte, pule para a parte que falo das minhas impressões.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.mariowiki.com%2Fimages%2Fthumb%2F4%2F44%2FSMB_Warpzone.png%2F200px-SMB_Warpzone.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fwww.mariowiki.com%2Fimages%2Fthumb%2F4%2F44%2FSMB_Warpzone.png%2F200px-SMB_Warpzone.png" alt="Imagem do jogo Super Mario Bros, onde o jogador pode pular mundos"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Adiciono também que eu repito muita coisa tanto neste próprio &lt;em&gt;post&lt;/em&gt; quanto de conteúdo de outras postagens. Apesar disto, se você ver que eu passei rápido por um assunto é porque devem ter fontes melhores aprofundadas e eu focarei sobre esse meu tempo experimentando o &lt;em&gt;framework&lt;/em&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é Svelte?
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/9mWg0JLV4NwM8/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/9mWg0JLV4NwM8/giphy.gif" alt="Uma pessoa batendo com a cabeça na mesa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;strong&gt;Oh noes!&lt;/strong&gt; Mais um framework...




&lt;p&gt;&lt;strong&gt;Svelte&lt;/strong&gt; é um framework de componentes com escrita declarativa e que converte seus componentes em código nativo pro navegador.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://svelte.dev/blog/svelte-3-rethinking-reactivity#What_is_Svelte" rel="noopener noreferrer"&gt;acima é um resumido daqui&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Quando fala-se de frameworks para componentização com escrita declarativa nada mais é que escrever componentes tal como hoje os maiores frameworks de mercado fazem (React, Vue, Angular...) e evitar ficar &lt;em&gt;&lt;strong&gt;jQuery&lt;/strong&gt;zando&lt;/em&gt; toda sua aplicação, escrevendo código imperativo que modifica direto pro DOM.&lt;/p&gt;

&lt;p&gt;Já o diferencial desta ferramenta é a segunda parte:&lt;/p&gt;

&lt;p&gt;Na verdade este &lt;em&gt;framework&lt;/em&gt; não é um &lt;em&gt;framework&lt;/em&gt; que dá importância em &lt;em&gt;runtime&lt;/em&gt; como os &lt;em&gt;frameworks&lt;/em&gt; atuais, muito pelo contrário, seu ponto forte é o &lt;strong&gt;compilador&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/SKGo6OYe24EBG/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/SKGo6OYe24EBG/giphy.gif" alt="Bob Esponja abrindo os braços e sai um arco íris"&gt;&lt;/a&gt;&lt;/p&gt;

ele compila seus componentes para código nativo do navegador




&lt;p&gt;O compilador irá transformar todo seu código declarativo e bem estruturado em algo que altere imperativamente o &lt;strong&gt;DOM&lt;/strong&gt;. Diga adeus ao &lt;em&gt;Virtual DOM&lt;/em&gt;. Ele irá &lt;em&gt;&lt;strong&gt;jQuery&lt;/strong&gt;izar&lt;/em&gt; sua aplicação por você enquanto seu código continuará componentizável e de fácil manutenção.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://i.giphy.com/media/VF5doyjvpNfeFLIwjn/giphy.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://i.giphy.com/media/VF5doyjvpNfeFLIwjn/giphy.gif" alt="Uma imagem de um programa de televisão de vendas por telefone"&gt;&lt;/a&gt;&lt;/p&gt;

e não é só isso!




&lt;p&gt;Desde sua concepção foi pensado em gerar aplicações reativas. Recomendo muito a &lt;a href="https://www.youtube.com/watch?v=AdNJ3fydeao" rel="noopener noreferrer"&gt;palestra do Rich Harris sobre "Pensando em reatividade" 🇬🇧&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Antes de tudo, sintaxe!
&lt;/h2&gt;

&lt;p&gt;Recomendo este completíssimo artigo escrito pelo Claudio Holanda: &lt;a href="https://claudioholanda.ch/blog/svelte-a-era-dos-frameworks-compiladores/" rel="noopener noreferrer"&gt;Svelte: A era dos frameworks-compiladores&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  E por onde começar?
&lt;/h2&gt;

&lt;p&gt;O site oficial conta com uma ótima ferramenta ao qual nós desenvolvedores estamos bem acostumados: &lt;a href="https://svelte.dev/repl/" rel="noopener noreferrer"&gt;REPL&lt;/a&gt;. É basicamente o parquinho das pessoas desenvolvedoras e a principal ferramenta usada pela comunidade (no chat - link no final do artigo) para apontar problemas ou erros. Não é necessário baixar nada, programe na esquerda e veja a saída na direita. Simples assim.&lt;/p&gt;

&lt;p&gt;Caso queira um melhor direcionamento sobre as funcionalidades da plataforma, baseado no &lt;strong&gt;REPL&lt;/strong&gt; também foi criada uma ferramenta interativa com &lt;a href="https://svelte.dev/tutorial/basics" rel="noopener noreferrer"&gt;tutoriais&lt;/a&gt; e &lt;a href="https://svelte.dev/examples" rel="noopener noreferrer"&gt;uma galeria com exemplos básicos&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Svelte, hoje vou lhe usar!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2Fw7xQG1ujzuU%2Fhqdefault.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.ytimg.com%2Fvi%2Fw7xQG1ujzuU%2Fhqdefault.jpg" alt="Foto do personagem Coronel Jesuíno, que tinha esta fala e que se tornou meme "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De acordo com a documentação, para inicializar projetos Svelte foi popularizado uma outra ferramenta geradora de código chamado &lt;a href="https://github.com/Rich-Harris/degit" rel="noopener noreferrer"&gt;degit&lt;/a&gt;, também desenvolvida pelo &lt;strong&gt;Rich Harris&lt;/strong&gt;. Basicamente com esta ferramenta você passa um repositório público &lt;em&gt;Git&lt;/em&gt; e ele irá baixar e descompactar a última versão de uma branch na pasta onde você irá desenvolver seu código.&lt;/p&gt;

&lt;p&gt;Para facilitar, foram disponibilizados repositórios de &lt;strong&gt;template&lt;/strong&gt; com a possibilidade de escolher a ferramenta para criação de bundle em duas opções: &lt;strong&gt;Webpack&lt;/strong&gt; e &lt;strong&gt;rollup&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desenvolver em Svelte &lt;del&gt;loucamente&lt;/del&gt; localmente
&lt;/h3&gt;

&lt;p&gt;Para iniciar localmente uma aplicação SPA em Svelte, basta baixar o template:&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;# using rollup&lt;/span&gt;
npx degit sveltejs/template my-svelte-project
&lt;span class="c"&gt;# using webpack&lt;/span&gt;
npx degit sveltejs/template-webpack my-svelte-project
&lt;span class="nb"&gt;cd &lt;/span&gt;my-svelte-project

npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;fonte: &lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;https://svelte.dev/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Ao rodar &lt;code&gt;npm run dev&lt;/code&gt; a aplicação irá subir um servidor local em modo de desenvolvimento apontando para &lt;code&gt;http://localhost:5000/&lt;/code&gt;. Após o desenvolvimento, basta rodar &lt;code&gt;npm run build&lt;/code&gt; e sua aplicação SPA estará pronta para produção com os artefatos criados dentro da pasta &lt;code&gt;public&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Usando o Sapper
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;Desatualizado. Ler sobre &lt;strong&gt;Sveltekit&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;O &lt;strong&gt;Sapper&lt;/strong&gt; é uma aplicação inspirada no &lt;a href="https://nextjs.org/" rel="noopener noreferrer"&gt;Next.js&lt;/a&gt;, um framework bem famoso na comunidade &lt;strong&gt;React&lt;/strong&gt;. Mas uma funcionalidade que me agradou bastante foi a de geração de conteúdo estático, algo bem parecido com o &lt;a href="https://www.gatsbyjs.org/" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt; (porém mais básico, sem GraphQL etc).&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;# for Rollup&lt;/span&gt;
npx degit &lt;span class="s2"&gt;"sveltejs/sapper-template#rollup"&lt;/span&gt; my-app
&lt;span class="c"&gt;# for webpack&lt;/span&gt;
npx degit &lt;span class="s2"&gt;"sveltejs/sapper-template#webpack"&lt;/span&gt; my-app
&lt;span class="nb"&gt;cd &lt;/span&gt;my-app

npm &lt;span class="nb"&gt;install
&lt;/span&gt;npm run dev &amp;amp; open http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;fonte: &lt;a href="https://sapper.svelte.dev/" rel="noopener noreferrer"&gt;https://sapper.svelte.dev/&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Um aviso importante&lt;/strong&gt;: o &lt;em&gt;reload&lt;/em&gt; automático (HMR) pode não funcionar muito bem utilizando Sapper, necessitando constantemente ter que matar e reinicializar a aplicação durante o desenvolvimento ao utilizar códigos durante &lt;em&gt;lifecycle&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Ao executar &lt;code&gt;npm run build&lt;/code&gt;, o Sapper gera uma aplicação Node dentro da pasta &lt;code&gt;__sapper__/build&lt;/code&gt;. Também é possível utilizar &lt;a href="https://expressjs.com/pt-br/" rel="noopener noreferrer"&gt;express&lt;/a&gt; (no template é utilizado um servidor mais leve chamado &lt;a href="https://github.com/lukeed/polka" rel="noopener noreferrer"&gt;Polka&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Para os &lt;em&gt;hypeiros&lt;/em&gt; e amantes de &lt;a href="https://jamstack.org/" rel="noopener noreferrer"&gt;JAM Stack&lt;/a&gt;, como eu mencionei anteriormente também é possível gerar conteúdo estático. Basta rodar &lt;code&gt;npm run export&lt;/code&gt; e ele criará os artefatos para produção na pasta &lt;code&gt;__sapper__/export&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pontos interessantes
&lt;/h2&gt;

&lt;p&gt;Infelizmente &lt;a href="https://github.com/sveltejs/svelte/issues/1639" rel="noopener noreferrer"&gt;não há suporte nativo oficial para TypeScript&lt;/a&gt; mas por um outro ângulo, talvez faça desta ferramenta mais amigável para quem está começando em relação a...&lt;/p&gt;

&lt;h2&gt;
  
  
  Outras ferramentas do gênero
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;Tem alternativas? Tem sim senhor!&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://stenciljs.com/" rel="noopener noreferrer"&gt;Stencil&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;A filosofia do Svelte &lt;a href="https://dev.to/richharris/why-i-don-t-use-web-components-2cia"&gt;não é gerar web components como foco principal 🇬🇧&lt;/a&gt;. Porém também é possível criar &lt;em&gt;custom elements&lt;/em&gt; nativamente conforme &lt;a href="https://github.com/sveltejs/svelte/issues/797" rel="noopener noreferrer"&gt;esta &lt;em&gt;issue&lt;/em&gt;&lt;/a&gt; e utilizar como &lt;code&gt;web components&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O Stencil é desenvolvido pela equipe responsável pelo Ionic (ou seja, projeto "parrudo de responsa") e tem em seu showcase empresas de renome. Mesmo o Svelte tendo uma versão para &lt;a href="https://svelte-native.technology/" rel="noopener noreferrer"&gt;mobile (svelte-native)&lt;/a&gt;, diria que vale a pena ver ambos. Utiliza &lt;strong&gt;TypeScript&lt;/strong&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Algumas alternativas em 2022 (edit)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.solidjs.com/" rel="noopener noreferrer"&gt;SolidJS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://qwik.builder.io/" rel="noopener noreferrer"&gt;Qwik&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  &lt;em&gt;Real laife&lt;/em&gt;
&lt;/h2&gt;

&lt;p&gt;Mesmo sendo clichê de todo artigo brazuca sobre Svelte, repito aqui também um dos maiores cases são as maquininhas verdinhas de pagamento da Stone, usando o Svelte (versão 2 do Svelte).&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpat10pn23h1g5m9wd8lx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fpat10pn23h1g5m9wd8lx.png" alt="Foto da palestra do Rich Harris falando sobre a Stone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como citado no &lt;a href="https://youtu.be/AdNJ3fydeao?t=1498" rel="noopener noreferrer"&gt;vídeo do Rich Harris&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://github.com/stone-payments/pos-mamba-sdk" rel="noopener noreferrer"&gt;open source 😍&lt;/a&gt;.&lt;br&gt;
créditos: &lt;a href="https://github.com/kaisermann" rel="noopener noreferrer"&gt;@kaisermann&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;"Mas quero ver um caso real na web! 😡😡😡"&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Ao lembrar que o criador trabalha &lt;del&gt;no &lt;strong&gt;The New York Times&lt;/strong&gt;&lt;/del&gt; na Vercel dedicado somente ao Svelte (2022), encontrei um &lt;a href="https://twitter.com/sveltejs/status/873087411286192128" rel="noopener noreferrer"&gt;outro case de uso&lt;/a&gt; de quando ele ainda trabalhava no NYT, integrando com &lt;strong&gt;d3&lt;/strong&gt;: &lt;a href="https://www.nytimes.com/interactive/2017/06/08/world/europe/british-general-election-results-analysis.html" rel="noopener noreferrer"&gt;um especial sobre a votação na grã-bretanha&lt;/a&gt;. Também foi desenvolvido numa versão mais antiga do Svelte.&lt;/p&gt;




&lt;h2&gt;
  
  
  Enfim...
&lt;/h2&gt;

&lt;p&gt;Vim de &lt;strong&gt;React&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Fanboy&lt;/em&gt; mesmo, assumida.&lt;/p&gt;

&lt;p&gt;Sempre tinha um detalhe ou outro e que sempre me motivou a não trocar de &lt;em&gt;framework&lt;/em&gt; do coração.&lt;/p&gt;

&lt;p&gt;Já tinha visto algo bem superficial sobre o Svelte e tinha achado interessante porém sempre passava batido por não ter ouvido muito sobre utilização.&lt;/p&gt;

&lt;p&gt;Passou um tempo e após três versões &lt;em&gt;major&lt;/em&gt; surgiram muitos cases bem legais e pensei em finalmente dar uma chance e aprender mais sobre.&lt;/p&gt;

&lt;h3&gt;
  
  
  E por onde comecei?
&lt;/h3&gt;

&lt;p&gt;Sinceramente digo que quando eu começo a aprender algo novo, me sinto intimidada em ir direto na documentação por mais que ela seja boa. Tutoriais e artigos também nem sempre são completos ou abrangentes e geralmente deixam passar algo. Optei então por um curso na Udemy (variando de R$ 28 - 60, quando tem promoção... &lt;del&gt;clichê de pitches: não estou ganhando nada em citar eles 😞&lt;/del&gt;) ministrado pelo Maximilian Schwarzmüller: &lt;a href="https://www.udemy.com/sveltejs-the-complete-guide/" rel="noopener noreferrer"&gt;Svelte.js - The Complete Guide (em inglês)&lt;/a&gt;, do Academind.&lt;/p&gt;

&lt;p&gt;É um curso que, apesar de básico/iniciante, cobre muito bem diversas partes das funcionalidades principais contidas no Svelte 3 (versão atual no momento da postagem) e é bem didático.&lt;/p&gt;

&lt;h3&gt;
  
  
  Componentização
&lt;/h3&gt;

&lt;p&gt;Como todo &lt;em&gt;framework&lt;/em&gt; atual, seu desenvolvimento é voltado a componentização da UI. Achei a parte da criação de componentes bem semelhante ao &lt;strong&gt;Vue.js&lt;/strong&gt; no caso de ter tanto o código de marcação (&lt;em&gt;Markup&lt;/em&gt;), os estilos e o JavaScript num único arquivo.&lt;/p&gt;

&lt;p&gt;Dentro do JavaScript, é possível escrever direto em ES6. Como citado anteriormente, ainda não possui suporte a TypeScript nativo, porem...&lt;/p&gt;

&lt;h3&gt;
  
  
  Preprocessadores
&lt;/h3&gt;

&lt;p&gt;Como o código no Svelte é compilado, é possível utilizar &lt;a href="https://www.npmjs.com/package/svelte-preprocess" rel="noopener noreferrer"&gt;preprocessadores&lt;/a&gt; de um jeito bem trivial. Como se trata de uma ferramenta de terceiro (módulo não oficial porém com muitos mantenedores), sua integração pode não ser das melhores.&lt;/p&gt;

&lt;p&gt;É possível integrar outras linguagens ao escrever componentes como TypeScript e CoffeScript para aplicação; Pug (antigo Jade) para &lt;em&gt;Markup&lt;/em&gt; (HTML) e Postcss, SASS, Less e Stylus para estilização. É bem simples para integrar.&lt;/p&gt;

&lt;p&gt;Dei umas brincadas usando TypeScript e testei usar Stylus e não tive muitos problemas na utilização, porém tive outros problemas (que foram agregados num ítem a parte no final do artigo) com...&lt;/p&gt;

&lt;h3&gt;
  
  
  Ferramentas e Integrações
&lt;/h3&gt;

&lt;p&gt;É bem completo o suporte do Svelte para ferramentas de integração.&lt;/p&gt;

&lt;h4&gt;
  
  
  ESLint
&lt;/h4&gt;

&lt;p&gt;Adicione este plugin oficial: &lt;a href="https://github.com/sveltejs/eslint-plugin-svelte3" rel="noopener noreferrer"&gt;eslint-plugin-svelte3&lt;/a&gt;. Simples assim.&lt;/p&gt;

&lt;p&gt;Sua configuração é bem trivial e como não se trata de um &lt;em&gt;preset&lt;/em&gt;, é bom lembrar que a ativação das regras devem ser feitas individualmente dentro de &lt;code&gt;rules&lt;/code&gt; no arquivo de configuração.&lt;/p&gt;

&lt;h4&gt;
  
  
  Testes
&lt;/h4&gt;

&lt;p&gt;Para quem veio de &lt;strong&gt;React&lt;/strong&gt; já deve conhecer o &lt;code&gt;react-testing-library&lt;/code&gt; do Kent C. Dodds. Quando a ferramenta se popularizou e generalizou dando origem a outras &lt;a href="https://testing-library.com/" rel="noopener noreferrer"&gt;Testing Libraries&lt;/a&gt;, e o Svelte não ficou de fora: &lt;a href="https://github.com/testing-library/svelte-testing-library" rel="noopener noreferrer"&gt;@testing-library/svelte&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Ele requer um transformador para o Jest: &lt;a href="https://www.npmjs.com/package/jest-transform-svelte" rel="noopener noreferrer"&gt;jest-transform-svelte&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prettier
&lt;/h4&gt;

&lt;p&gt;Esse "embelezador" de código também não poderia ficar de fora. Basta adicionar &lt;a href="https://github.com/UnwrittenFun/prettier-plugin-svelte" rel="noopener noreferrer"&gt;este plugin&lt;/a&gt; e adicionar um &lt;code&gt;override&lt;/code&gt; nas configurações do Prettier conforme descrito na documentação.&lt;/p&gt;

&lt;h4&gt;
  
  
  Storybook
&lt;/h4&gt;

&lt;p&gt;Sim, é possível ter um &lt;a href="https://storybook.js.org/docs/guides/guide-svelte/" rel="noopener noreferrer"&gt;Storybook com componentes escritos em Svelte&lt;/a&gt;. &lt;a href="https://www.npmjs.com/package/@storybook/svelte#todos" rel="noopener noreferrer"&gt;Seu suporte ainda é básico&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Famoso "saiba mais"
&lt;/h4&gt;

&lt;p&gt;&lt;a href="https://github.com/sveltejs/integrations" rel="noopener noreferrer"&gt;Com um famoso clique aqui&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  E estilos?
&lt;/h3&gt;

&lt;p&gt;Existem certas características que eu já adianto:&lt;/p&gt;

&lt;h4&gt;
  
  
  todo &lt;em&gt;css&lt;/em&gt; escrito num arquivo de componente será &lt;em&gt;escopado&lt;/em&gt; para aquele componente somente
&lt;/h4&gt;

&lt;p&gt;Ao compilar, o Svelte altera os seletores e adiciona classes para evitar conflitos de estilo. E esta funcionalidade é padrão do &lt;em&gt;framework&lt;/em&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  não é possível utilizar interpolação de variáveis JavaScript dentro da &lt;em&gt;tag&lt;/em&gt; &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;.
&lt;/h4&gt;

&lt;p&gt;Porém nada impede de repassar tais valores utilizando &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/CSS/Using_CSS_custom_properties" rel="noopener noreferrer"&gt;variáveis CSS&lt;/a&gt;: &lt;a href="https://svelte.dev/repl/c28c244c8a414530acf291942585340f?version=3.6.7" rel="noopener noreferrer"&gt;exemplo leviano&lt;/a&gt;. Claro que também é possível alterar estilos &lt;em&gt;inline&lt;/em&gt; utilizando o atributo &lt;code&gt;style&lt;/code&gt;, porém lembre que por boas práticas...&lt;/p&gt;

&lt;h4&gt;
  
  
  o Svelte assume que o &lt;em&gt;CSS&lt;/em&gt; deve ser intocável
&lt;/h4&gt;

&lt;p&gt;Ou seja, o que estiver dentro da &lt;em&gt;tag&lt;/em&gt; &lt;code&gt;&amp;lt;style&amp;gt;&lt;/code&gt;, após a transformação dos seletores em classes escopadas é um código pronto para ser extraído para um arquivo separado (&lt;code&gt;extract-text-webpack-plugin&lt;/code&gt;, estou falando de ti).&lt;/p&gt;

&lt;p&gt;Não sei nem se é possível utilizar &lt;strong&gt;CSS-in-JS&lt;/strong&gt;, inclusive. Porém lembre do &lt;em&gt;front-end&lt;/em&gt; raiz, onde utilizamos classes para definir diferentes estilos ao invés de alterá-los em tempo de execução.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas... Não tem &lt;em&gt;Virtual DOM&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;É inegável que o &lt;em&gt;pattern&lt;/em&gt; de &lt;em&gt;Virtual DOM&lt;/em&gt; do React é performático (palavras sob influência da minha &lt;em&gt;fanboyzisse&lt;/em&gt;, não leve a sério!), porém pela filosofia do Svelte de compilar seu código para uma aplicação que utiliza e altera direta e cirurgicamente o &lt;strong&gt;DOM&lt;/strong&gt;, ter um &lt;em&gt;Virtual DOM&lt;/em&gt; seria redundante além de adicionar um &lt;em&gt;runtime&lt;/em&gt; talvez desnecessário.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reatividade
&lt;/h3&gt;

&lt;p&gt;O que também me chamou muita atenção foi a atualização de variáveis de forma reativa. No código, basta adicionar uma instrução específica pro Svelte: "&lt;a href="https://svelte.dev/docs#3_$_marks_a_statement_as_reactive" rel="noopener noreferrer"&gt;&lt;code&gt;$:&lt;/code&gt;&lt;/a&gt;".&lt;/p&gt;

&lt;p&gt;Faz parte da sintaxe do JavaScript, é válido e até tem um nome específico: &lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Statements/label" rel="noopener noreferrer"&gt;etiqueta&lt;/a&gt;. No JavaScript é utilizado como controle de fluxo em loops e em outras linguagens, geralmente como controle em &lt;code&gt;goto&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Resumindo, toda vez que uma atribuição de variável, expressão ou execução de função é utilizada à direita do sinal &lt;code&gt;$:&lt;/code&gt; será calculado ou executado novamente em caso de mudança de valores de variáveis utilizadas.&lt;/p&gt;

&lt;h3&gt;
  
  
  Stores
&lt;/h3&gt;

&lt;p&gt;Como toda biblioteca de componentização de UI, não poderia faltar um gerenciador de estado. E suas &lt;a href="https://svelte.dev/docs#svelte_store" rel="noopener noreferrer"&gt;Stores&lt;/a&gt; nativas foram desenvolvidas nesta versão já pensando em reatividade, utilizando um padrão já conhecido das pessoas desenvolvedoras que é o &lt;strong&gt;pub-sub&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;E para usos simples, há um &lt;em&gt;shorthand&lt;/em&gt; (escrita facilitada) onde facilita o uso de dados da &lt;em&gt;Store&lt;/em&gt; sem se preocupar com &lt;a href="https://svelte.dev/tutorial/auto-subscriptions" rel="noopener noreferrer"&gt;&lt;em&gt;subscribe&lt;/em&gt; ou &lt;em&gt;unsubscribe&lt;/em&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  Loops Eficazes
&lt;/h4&gt;

&lt;p&gt;Outro ponto que achei legal é que mesmo lidando direto com o &lt;strong&gt;DOM&lt;/strong&gt;, o Svelte se vira bem em relação a loops. Claro que infelizmente não é algo automático pois o Svelte precisa saber qual a key para cada elemento porém é possível trabalhar com eficácia na hora de &lt;a href="https://svelte.dev/docs#each" rel="noopener noreferrer"&gt;utilizar loops&lt;/a&gt;, evitando repaints.&lt;/p&gt;

&lt;h3&gt;
  
  
  E falando em &lt;em&gt;shorthands&lt;/em&gt;...
&lt;/h3&gt;

&lt;p&gt;Gostei bastante da escrita de componentes, para as tarefas mais triviais sempre tem uma forma mais reduzida de se escrever, por exemplo, um &lt;em&gt;two-way bind&lt;/em&gt;; repassar um &lt;em&gt;evento&lt;/em&gt;, seja &lt;a href="https://svelte.dev/docs#createEventDispatcher" rel="noopener noreferrer"&gt;personalizado&lt;/a&gt; ou não; alternar classes &lt;em&gt;CSS&lt;/em&gt;; usar &lt;em&gt;rest-spread&lt;/em&gt; ou até mesmo...&lt;/p&gt;

&lt;h3&gt;
  
  
  Transições e animações!
&lt;/h3&gt;

&lt;p&gt;Algo que eu realmente não esperava vir de brinde. Para animações, efeitos e transições triviais o Svelte possui uma &lt;a href="https://svelte.dev/docs#svelte_transition" rel="noopener noreferrer"&gt;mini biblioteca&lt;/a&gt; com uma coleção delas, e de fácil implementação.&lt;/p&gt;

&lt;p&gt;Também é possível utilizar &lt;a href="https://svelte.dev/tutorial/custom-css-transitions" rel="noopener noreferrer"&gt;funções de animação e &lt;em&gt;easing&lt;/em&gt; personalizadas&lt;/a&gt;, mas aí meu amigo:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconteudo.imguol.com.br%2Fc%2Fentretenimento%2F5b%2F2016%2F10%2F14%2Fnazare-tedesco-vila-de-senhora-do-destino-2004-vira-meme-mundial-1476485254931_1080x703.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fconteudo.imguol.com.br%2Fc%2Fentretenimento%2F5b%2F2016%2F10%2F14%2Fnazare-tedesco-vila-de-senhora-do-destino-2004-vira-meme-mundial-1476485254931_1080x703.jpg" alt="Meme da Nazaré pensando e com as contas flutuando na tela"&gt;&lt;/a&gt;&lt;/p&gt;

...é muita matemática rs. Deixo esta parte pra galera que curte desenvolver jogos ou nunca faltou em uma aula de álgebra linear.




&lt;h3&gt;
  
  
  &lt;em&gt;Tags&lt;/em&gt; especiais
&lt;/h3&gt;

&lt;p&gt;O Svelte também possui alguns componentes nativos que auxiliam no desenvolvimento de um código mais declarativo. &lt;a href="https://svelte.dev/repl/c731dc73439f45c38448127485a4954a?version=3.6.8" rel="noopener noreferrer"&gt;Por exemplo, fica bem trivial obter a largura do viewport&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Dentre as &lt;em&gt;tags especiais&lt;/em&gt; há funcionalidades como alterar &lt;em&gt;tags&lt;/em&gt; no &lt;em&gt;head&lt;/em&gt; dentro do Sapper, usar recursividade no próprio componente, usar componentes dinâmicos...&lt;/p&gt;

&lt;h3&gt;
  
  
  Compilador opinativo
&lt;/h3&gt;

&lt;p&gt;Tanto o compilador quanto os &lt;em&gt;linters&lt;/em&gt; de sintaxe (pelo menos digo isto em relação ao plugin de Svelte para Visual Studio Code) avisam quando há erros triviais de acessibilidade (imagem sem &lt;code&gt;alt&lt;/code&gt;) e código &lt;code&gt;css&lt;/code&gt; não utilizados pelo componente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Reatividade (parte 2)
&lt;/h3&gt;

&lt;p&gt;Quando ouço reatividade, a primeira coisa que veio à minha cabeça foi &lt;strong&gt;RxJS&lt;/strong&gt; (digo pelo nome da &lt;em&gt;lib&lt;/em&gt;)...&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gifer.com%2F54fJ.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fi.gifer.com%2F54fJ.gif" alt="meme de uma pessoa americana olhando pra câmera e ficando confusa"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pensei levianamente comigo: "e se eu trocasse a &lt;em&gt;store&lt;/em&gt; nativa com &lt;em&gt;autosubscribe&lt;/em&gt; por um &lt;strong&gt;Observable&lt;/strong&gt;?" Tinha lido que haviam certas compatibilidades entre ambos e decidi testar por conta própria. Para minha surpresa:&lt;/p&gt;

&lt;p&gt;&lt;iframe src="https://codesandbox.io/embed/svelte-with-rxjs-7uvxx"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;sup&gt;(desculpe a bagunça no código)&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Sim, o Svelte integra bem com &lt;strong&gt;RxJS&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;edit&lt;/strong&gt;: infelizmente o exemplo acima está rodando com &lt;strong&gt;Svelte v3.6&lt;/strong&gt;. Quando houve a atualização para a v3.7 acabou quebrando. Por enquanto eu fixei o codesandbox de exemplo na versão v3.6 do Svelte. Agradecimentos ao &lt;a href="https://github.com/kaisermann" rel="noopener noreferrer"&gt;@kaisermann&lt;/a&gt; novamente por ter me avisado :D&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;Deixo um lembrete:&lt;/strong&gt; o Svelte não lida tão bem enquanto ainda não tiver recebido algo do stream (&lt;em&gt;timeouts&lt;/em&gt;). Para evitar possíveis erros, recomendo uma das seguintes soluções: mesclar com um outro Stream, contendo um valor &lt;em&gt;nullable&lt;/em&gt; e emitindo antes da resposta, assim podendo checar dentro de um &lt;code&gt;{#if}&lt;/code&gt; se já foi emitido algum valor ou englobar o stream numa &lt;em&gt;Promise&lt;/em&gt;/&lt;em&gt;generator&lt;/em&gt; e utilizar &lt;code&gt;{#async}&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Mas ...&lt;em&gt;runtime&lt;/em&gt;?
&lt;/h3&gt;

&lt;p&gt;Ok, eu menti quando falei que o Svelte não possui uma &lt;em&gt;lib&lt;/em&gt; de &lt;em&gt;runtime&lt;/em&gt;. Não tem, claro, para &lt;em&gt;Virtual DOM&lt;/em&gt; pois como expliquei, seria redundante. Porém a &lt;em&gt;runtime&lt;/em&gt; é bem enxuta. São praticamente funções que lembram &lt;strong&gt;Hooks&lt;/strong&gt; do &lt;strong&gt;React&lt;/strong&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;a href="https://svelte.dev/docs#Run_time" rel="noopener noreferrer"&gt;documentação&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;Lifecycle&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;Os pares &lt;code&gt;onMount&lt;/code&gt; &amp;amp; &lt;code&gt;onDestroy&lt;/code&gt; relativos a renderização e &lt;code&gt;beforeUpdate&lt;/code&gt; &amp;amp; &lt;code&gt;afterUpdate&lt;/code&gt; relativos a atualização do componente.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;em&gt;Context&lt;/em&gt;
&lt;/h4&gt;

&lt;p&gt;&lt;code&gt;setContext&lt;/code&gt; &amp;amp; &lt;code&gt;getContext&lt;/code&gt;. Também semelhante a contextos no React.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;code&gt;preloading&lt;/code&gt;
&lt;/h4&gt;

&lt;p&gt;Este é exclusivo do &lt;strong&gt;Sapper&lt;/strong&gt;. Este é executado quando utiliza-se diretivas nos &lt;em&gt;links&lt;/em&gt;, carregando e executando dados antes mesmo do usuário clicar no elemento (no evento de &lt;code&gt;mouseover&lt;/code&gt;, predizendo sua ação).&lt;/p&gt;

&lt;h3&gt;
  
  
  E claro, SSR!
&lt;/h3&gt;

&lt;p&gt;Fica a critério do desenvolvedor. Como anteriormente citado, o &lt;a href="https://sapper.svelte.dev/" rel="noopener noreferrer"&gt;Sapper&lt;/a&gt; auxilia neste aspecto. Como anteriormente citado, esta ferramenta foi inspirada no &lt;strong&gt;Next.js&lt;/strong&gt;. Claro que é possível juntar tudo num &lt;em&gt;bundle&lt;/em&gt; utilizando somente o Svelte e criar sua SPA.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fimages%2Fb7fc556c96a04f7c0fcd7f5ef141c4bc%2Ftenor.gif" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmedia1.tenor.com%2Fimages%2Fb7fc556c96a04f7c0fcd7f5ef141c4bc%2Ftenor.gif" alt="Apresentadora Oprah Winfrey distribuindo prêmios para a platéia"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Porém usando o Sapper, é possível estender a funcionalidade da sua aplicação para utilizar um servidor com SSR (podendo inclusive utilizar &lt;a href="https://expressjs.com/pt-br/" rel="noopener noreferrer"&gt;Express&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Ou no melhor dos casos, exportar uma aplicação &lt;a href="https://jamstack.org/" rel="noopener noreferrer"&gt;JAM Stack&lt;/a&gt; utilizando o &lt;code&gt;sapper export&lt;/code&gt; (algo como um &lt;a href="https://www.gatsbyjs.org/" rel="noopener noreferrer"&gt;Gatsby&lt;/a&gt; simplificado), gerando artefatos estáticos, prontos para subir para um CDN. O próprio Svelte lida &lt;em&gt;automagicamente&lt;/em&gt; com a parte de &lt;em&gt;hidratação&lt;/em&gt; da aplicação.&lt;/p&gt;

&lt;h3&gt;
  
  
  Problemas que tive
&lt;/h3&gt;

&lt;p&gt;Claro que nem foi somente louros. Contarei algumas experiências:&lt;/p&gt;

&lt;h4&gt;
  
  
  Jest
&lt;/h4&gt;

&lt;p&gt;Tive alguns problemas ao utilizar &lt;strong&gt;Stylus&lt;/strong&gt;. Para testes, foi contornado utilizando um &lt;a href="https://gist.github.com/ninetails/2f84baab9518006c5d45263f57726cc4" rel="noopener noreferrer"&gt;transformador próprio&lt;/a&gt; (neste exemplo estou utilizando somente Stylus, mas é possível integrar qualquer um existente. Aconselho a utilizar este transformador personalizado pois o &lt;code&gt;jest-transformer-svelte&lt;/code&gt; e a maioria dos outros pacotes similares possuem dependência com &lt;strong&gt;rollup&lt;/strong&gt;, pessoalmente considero desnecessário e cria arquivos não referenciando o arquivo original. Apesar disto, lembro aqui que a cobertura de código é um tanto confusa para arquivos Svelte, senão inexistente, ou seja, não muito confiável. Logo aconselharia a descartar cobertura de código em projetos Svelte.&lt;/p&gt;

&lt;h4&gt;
  
  
  Prettier
&lt;/h4&gt;

&lt;p&gt;Algo que me fez deixar preprocessadores em segundo plano foi que tive muitos problemas ao utilizar o plugin para Prettier. Este funciona muito bem para código de estilos feitos em CSS porém a integração com o Stylus não é bem definida e tive muitos problemas como formatação errônea. Como o plugin não integrava muito bem com preprocessadores, acabava transformando o código em algo ilegível e não &lt;em&gt;parseável&lt;/em&gt;, e, para evitar escrever muitos &lt;strong&gt;prettier-ignore&lt;/strong&gt;, recomendo evitar o uso de preprocessadores.&lt;/p&gt;

&lt;p&gt;Para estilos em específico, vi também que ao utilizar um preprocessador o compilador não chega a verificar e validar estilos não utilizados pelo componente.&lt;/p&gt;

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

&lt;p&gt;Teve um &lt;em&gt;bug&lt;/em&gt; em específico no ESLint (&lt;a href="https://github.com/eslint/eslint/issues/11940" rel="noopener noreferrer"&gt;já corrigido&lt;/a&gt;) usando &lt;strong&gt;Sapper&lt;/strong&gt;. Como o &lt;strong&gt;lint-staged&lt;/strong&gt; passa o nome do arquivo e os arquivos de rota com parâmetro do &lt;em&gt;Sapper&lt;/em&gt; (e do Next.js 9) usam colchetes, o ESLint interpretava os colchetes como parâmetro de busca do &lt;em&gt;Bash&lt;/em&gt; e não encontrava o arquivo, mesmo &lt;em&gt;escapando&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;em&gt;HMR&lt;/em&gt;
&lt;/h3&gt;

&lt;p&gt;Outra dor de cabeça que tive, utilizando &lt;strong&gt;Sapper&lt;/strong&gt; é que o &lt;em&gt;live reload&lt;/em&gt; pode não funcionar muito bem ao utilizar funcionalidades do &lt;em&gt;lifecycle&lt;/em&gt; do &lt;em&gt;Sapper&lt;/em&gt; como o &lt;em&gt;preloading&lt;/em&gt;. Caso for utilizar o Svelte puro não terá problemas, porém ao utilizar o &lt;strong&gt;SSR&lt;/strong&gt; do &lt;em&gt;Sapper&lt;/em&gt;, ele meio que se perde ao ter modificações no lado do código do servidor sendo necessário reiniciar a aplicação dependendo da modificação.&lt;/p&gt;

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

&lt;p&gt;&lt;sup&gt;(como ensinado nas aulas de redação, tem que ter um, claro!)&lt;/sup&gt;&lt;/p&gt;

&lt;p&gt;Não me considero uma &lt;em&gt;early adopter&lt;/em&gt;... &lt;em&gt;hypera&lt;/em&gt; talvez. Porém a minha experimentação foi positiva e muito melhor do que eu esperava. Como disse, &lt;em&gt;balançou meu coração&lt;/em&gt; que era anteriormente exclusivo do &lt;strong&gt;React&lt;/strong&gt;. Muitas das funcionalidades acima listadas não são nem um pouco triviais de implementar nem no meu &lt;em&gt;framework&lt;/em&gt; favorito.&lt;/p&gt;

&lt;p&gt;Ainda é novidade e não há &lt;em&gt;mercado&lt;/em&gt; para sua utilização por aqui (Brasil). Porém na minha opinião ainda tem muito potencial. Claro que muito do que eu falei tem meu viés. Mesmo curtindo React, meu perfil é muito mais tentar ir para o lado do SSR e otimizações estáticas, não curtindo tanto manter somente em &lt;em&gt;SPA&lt;/em&gt;, &lt;em&gt;mobile&lt;/em&gt; (e consequentemente &lt;em&gt;webcomponents&lt;/em&gt; e &lt;em&gt;micro frontend&lt;/em&gt;) e tentar aliviar ao máximo a execução da aplicação no navegador do usuário. Logo este framework acertou em cheio minhas expectativas.&lt;/p&gt;

&lt;p&gt;Espero em breve ter &lt;em&gt;Meetups&lt;/em&gt; à medida que sua adoção cresça (tenho esperanças rs).&lt;/p&gt;




&lt;blockquote&gt;
&lt;p&gt;Este post foi criado como uma resposta ao pedido do &lt;a href="https://github.com/felipefialho" rel="noopener noreferrer"&gt;@felipefialho&lt;/a&gt; para &lt;a href="https://github.com/frontendbr/forum/issues/1199#issuecomment-512836768" rel="noopener noreferrer"&gt;falar sobre minhas experiências com o Svelte&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gostaria de agradecer a galera do &lt;a href="https://discord.gg/Xf9zzW9" rel="noopener noreferrer"&gt;Discord&lt;/a&gt; por terem ajudado em alguns pontos deste artigo.&lt;br&gt;
Também agradeço o &lt;a href="https://github.com/kaisermann" rel="noopener noreferrer"&gt;@kaisermann&lt;/a&gt; novamente, por ter ajudado a escrever este artigo.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Também:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Curto conversas mais informais e memes antigos... Dificilmente escrevo para a comunidade não sendo nos fóruns. Não é minha intenção ofender ninguém com postagens deste tipo. Peço também para não me ofender nos comentários lá embaixo se não achou graça neste post e achou que isto estragou o conteúdo. A tentativa foi para tentar deixar o conteúdo do post mais leve para leitura. Peço desculpas pelos erros, principalmente de concordância, pois vou alterando o texto de acordo com o que me passa pela cabeça e nem sempre os &lt;code&gt;diffs&lt;/code&gt; ficam harmoniosos. Ainda mais tendo este texto como um compilado de tudo que passei durante esse tempo de experimentação. As opiniões expressadas são pessoais e sobre este específico momento. Nunca as tome como verdade e tanto minhas opiniões como as ferramentas descritas podem mudar e evoluir e se tornarem futuramente divergentes deste texto. &lt;em&gt;BTW&lt;/em&gt; eu adicionei as imagens sem me preocupar em normalizá-las ou &lt;em&gt;copyrights&lt;/em&gt; pois são somente ilustrativas (inclusive podem parar de funcionar pois &lt;em&gt;hotlinkei ilegalmente&lt;/em&gt;, sendo bem amador mesmo). Este &lt;em&gt;post&lt;/em&gt; não possui monetização (pelo menos não para mim, autor...). Adicionalmente, peço para levar na brincadeira sobre minha posição sobre React. Não existe &lt;em&gt;melhor framework&lt;/em&gt;, e sim o melhor framework é aquele que melhor se adequa ao produto e ao time.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  Join Us!
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fradioimg.s3.amazonaws.com%2Fconnectingvets%2Fstyles%2Fnts_image_cover_tall_775x425%2Fs3%2Fposter.jpg%3F1OjrvU_4ezS4q42xtvfUeQ8DhRM3qrmP%26itok%3DfLua2OFq%26c%3De343bb5d7f1eb529d074ad2775302016" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fradioimg.s3.amazonaws.com%2Fconnectingvets%2Fstyles%2Fnts_image_cover_tall_775x425%2Fs3%2Fposter.jpg%3F1OjrvU_4ezS4q42xtvfUeQ8DhRM3qrmP%26itok%3DfLua2OFq%26c%3De343bb5d7f1eb529d074ad2775302016" alt="Imagem do Tio Sam usada no alistamento americano"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/frontendbr/forum/issues" rel="noopener noreferrer"&gt;Forum Front-end Brasil&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://discord.gg/Xf9zzW9" rel="noopener noreferrer"&gt;Discord Svelte Brasil&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Referências
&lt;/h2&gt;

&lt;p&gt;(os conteúdos exclusivos em inglês eu deixei uma bandeirinha unicode do lado: 🇬🇧)&lt;/p&gt;

&lt;h3&gt;
  
  
  Meta 🇬🇧
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://svelte.dev/" rel="noopener noreferrer"&gt;Site&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svelte.dev/docs" rel="noopener noreferrer"&gt;Documentação&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sapper.svelte.dev/" rel="noopener noreferrer"&gt;Sapper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://svelte.dev/chat" rel="noopener noreferrer"&gt;Svelte @ Discord (oficial)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Posts relacionados
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/richharris/why-i-don-t-use-web-components-2cia"&gt;Why I don't use web components 🇬🇧&lt;/a&gt;, por &lt;a href="https://dev.to/richharris"&gt;Rich Harris&lt;/a&gt; (post obviamente viesado, porém recomendo ler os comentários)&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://blog.geekhunter.com.br/svelte-o-framework-javascript-que-nao-e-um-framework/" rel="noopener noreferrer"&gt;Svelte: o framework JavaScript que não é um framework&lt;/a&gt;, por &lt;a href="https://blog.geekhunter.com.br/author/thiago-frias/" rel="noopener noreferrer"&gt;Thiago Frias&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://claudioholanda.ch/blog/svelte-a-era-dos-frameworks-compiladores/" rel="noopener noreferrer"&gt;Svelte: A era dos frameworks-compiladores&lt;/a&gt;, por Claudio Holanda&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://escoladejavascript.com/crud-com-svelte-3-e-fireabase/" rel="noopener noreferrer"&gt;Svelte 3 + Firebase: Criando um CRUD com a nova ferramenta JS&lt;/a&gt;, onde o &lt;a href="https://dev.to/sergiosouzalima"&gt;Sergio Lima&lt;/a&gt; ensina a fazer uma aplicação integrada com o Firebase&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://peteroshaughnessy.com/posts/disappearing-frameworks/" rel="noopener noreferrer"&gt;Disappearing Frameworks 🇬🇧&lt;/a&gt;, por Peter O'Shaughnessy&lt;/li&gt;
&lt;li&gt;&lt;a href="https://alligator.io/svelte/getting-started-with-svelte" rel="noopener noreferrer"&gt;Getting Started with Svelte 3 🇬🇧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://dev.to/valentinogagliardi/svelte-3-tutorial-for-the-impatient-react-developer-3i26"&gt;Svelte 3 Tutorial for The Impatient (React) Developer 🇬🇧&lt;/a&gt;, por &lt;a href="https://dev.to/valentinogagliardi"&gt;Valentino Gagliardi&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Com direito a tradução dos últimos dois artigos feita pelo &lt;a href="https://medium.com/@oieduardorabelo" rel="noopener noreferrer"&gt;Eduardo Rabelo&lt;/a&gt;:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@oieduardorabelo/svelte-3-come%C3%A7ando-com-svelte-3-1c38983850b6" rel="noopener noreferrer"&gt;Svelte 3: Começando com Svelte 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://medium.com/@oieduardorabelo/svelte-3-guia-para-o-desenvolvedor-impaciente-935389f0c08a" rel="noopener noreferrer"&gt;Svelte 3: Guia para o Desenvolvedor (React) Impaciente&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Vídeos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://youtu.be/AdNJ3fydeao" rel="noopener noreferrer"&gt;Rich Harris - Rethinking reactivity 🇬🇧&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://youtu.be/qqt6YxAZoOc" rel="noopener noreferrer"&gt;Computer, build me an app - Rich Harris - JSConf EU 2018 🇬🇧&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Cursos
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://www.udemy.com/sveltejs-the-complete-guide/" rel="noopener noreferrer"&gt;Svelte.js - The Complete Guide 🇬🇧&lt;/a&gt;, por &lt;a href="https://www.youtube.com/channel/UCSJbGtTlrDami-tDGPUV9-w" rel="noopener noreferrer"&gt;Maximilian Schwarzmüller&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Changelog
&lt;/h2&gt;

&lt;h3&gt;
  
  
  2019-08-06
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adicionado breve referência sobre Storybook&lt;/li&gt;
&lt;li&gt;Patchfix do codesandbox fixando o Svelte na versão 3.6&lt;/li&gt;
&lt;li&gt;Adicionado o post do Sergio Lima nas Referências&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  2022-10-19
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;Adicionando descrição para as imagens (espero não ter pulado nenhuma)&lt;/li&gt;
&lt;li&gt;Alteração de pronomes e utilização de linguagem neutra (posso ter também passado batido por algo)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Licença deste texto
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://pt.wikipedia.org/wiki/Beerware" rel="noopener noreferrer"&gt;Beerware&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>svelte</category>
      <category>webdev</category>
      <category>braziliandevs</category>
    </item>
  </channel>
</rss>
