<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Hebert Montarroyos</title>
    <description>The latest articles on Forem by Hebert Montarroyos (@hmontarroyos).</description>
    <link>https://forem.com/hmontarroyos</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%2F1045444%2F8703cc19-6a53-4dd2-ad59-652904290515.jpeg</url>
      <title>Forem: Hebert Montarroyos</title>
      <link>https://forem.com/hmontarroyos</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/hmontarroyos"/>
    <language>en</language>
    <item>
      <title>CSS Art: June - 14 de Junho Dia Mundial do Doador de Sangue</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Wed, 05 Jun 2024 12:54:05 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/css-art-june-14-de-junho-dia-mundial-do-doador-de-sangue-9fj</link>
      <guid>https://forem.com/hmontarroyos/css-art-june-14-de-junho-dia-mundial-do-doador-de-sangue-9fj</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend-2024-05-29"&gt;Frontend Challenge v24.04.17&lt;/a&gt;, CSS Art: June.&lt;/em&gt;&lt;/p&gt;

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

&lt;p&gt;Aproveitando o tema livre para escolher algo que represente o mês de junho, podendo ser um lugar, lembrança ou até mesmo uma data, eu resolvi aproveitar para colocar esse tema em pauta que é tão importante e ajuda a salva milhões de vida por ano, que é o de doar sangue, e nada melhor do que aproveitar para falar e exaltar a todos os que se propõem a doar um pouco do que tem, para salvar vidas em todo mundo, não podia deixar passar essa data, que inclusive é a mesma do meu aniversário, e com isso tenho muito orgulho do movimento e apoio a todos que doam ;) &lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;iframe height="600" src="https://codepen.io/hmontarroyos/embed/RwmVejM?height=600&amp;amp;default-tab=result&amp;amp;embed-version=2"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

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

&lt;p&gt;Pensando no dia mundial do doador de sangue, eu pensei em enfatizar o órgão responsável por fazer todo o bombeamento de sangue no nosso corpo, o mais importante para termos vida ou um dos mais, a partir dae achei interessante que fosse feito usando inteiramente o css.&lt;br&gt;
 Para isso eu utilizei das &lt;em&gt;pseudo-classes&lt;/em&gt; &lt;strong&gt;before&lt;/strong&gt; e &lt;strong&gt;after&lt;/strong&gt; para criar as formas e para a animação trabalhei muito com os &lt;strong&gt;transforms&lt;/strong&gt; dentro dos meus &lt;strong&gt;keyframes&lt;/strong&gt; para criar toda essa animação de parecer que o coração está pulsando, alternando no seu tamanho de tempo em tempos e deixando com um time de infinite, para ser constante. &lt;/p&gt;

&lt;p&gt;Feito essa parte que seria talvez a mais chamativa queria dar uma mensagem de conscientização, mas que não fosse apenas uma mensagem, mas algo funcional sem precisar ser uma aplicação grande seguindo o conceito se &lt;em&gt;SPA&lt;/em&gt;, para isso adicionei um button e estilizei ele para que ficasse com a paleta que escolhi usando algumas fontes gratuitas no &lt;a href="https://fonts.google.com/"&gt;google fonts&lt;/a&gt;, com o link de redirecionar para a página do &lt;a href="https://www.hemorio.rj.gov.br/"&gt;Hemorio&lt;/a&gt; que é uma instituição localizada aqui no estado do Rio de Janeiro no Brasil, que recolhe doação de sangue para o banco de sangue daqui. &lt;/p&gt;

&lt;p&gt;Para o background achei interessante colocar uma imagem de fundo em vetor, que representa bem a mensagem da doação ser algo mundial e que independente de cor, gênero, religião entre outros, somos todos iguais, e isso só mostra que devemos nos unir em prol de salvar inúmeras vidas.&lt;/p&gt;

&lt;p&gt;Além disso, queria colocar uma mensagem final e para isso nada melhor que a frase: &lt;/p&gt;

&lt;p&gt;&lt;em&gt;"Doe sangue, salve vidas. Seja a esperança hoje!"&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;E para combinar com essa frase animei usando o &lt;strong&gt;animation&lt;/strong&gt;, para dar aquela impressão que tinha alguém digitando, além disso, achei interessante controlar essa animação com &lt;strong&gt;JavaScript&lt;/strong&gt; para que pudesse aumentar ou diminuir o time da animação, para isso criei uma função que acessa o meu seletor ali na minha DOM e com o &lt;strong&gt;setTimeout&lt;/strong&gt; define um time de animação. &lt;/p&gt;

&lt;p&gt;Achei também para que não ficar um vazio a aplicação ficaria bacana com um Header bem sutil, e para isso eu fiz usando novamente os &lt;strong&gt;keyframes&lt;/strong&gt; para alterar as cores da nossa paleta imitando uma artéria. &lt;/p&gt;

&lt;p&gt;É isso galera espero que curtam, e lembre-se não só dia 14 de junho, mas todos os dias que quiserem os postos de cada cidade ficam sempre buscando novos doadores.&lt;br&gt;
Grande abraço a todos e espero que curtam, todo o código segue livre no &lt;a href="https://codepen.io/hmontarroyos/pen/RwmVejM?editors=1010"&gt;CodePen&lt;/a&gt;.  &lt;/p&gt;

</description>
      <category>frontendchallenge</category>
      <category>devchallenge</category>
      <category>css</category>
      <category>frontend</category>
    </item>
    <item>
      <title>Minha Colaboração com o Hacktoberfest 2023</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Fri, 27 Oct 2023 18:03:43 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/minha-colaboracao-com-o-hacktoberfest-2023-80d</link>
      <guid>https://forem.com/hmontarroyos/minha-colaboracao-com-o-hacktoberfest-2023-80d</guid>
      <description>&lt;h3&gt;
  
  
  Vamos lá, do começo
&lt;/h3&gt;

&lt;p&gt;Então galera como falei antes nos posts anteriores, este é meu primeiro hacktoberfest, porém acabei começando um pouco tardio por uma série de fatores, eu não conhecia o evento e só na metade de outubro vim saber dele e poder participar, devido a problemas pessoais não consegui antes.&lt;/p&gt;

&lt;p&gt;Além de contribuidor eu também participei como mantenedor de um repositório, o qual se trata de uma biblioteca de componentes para React, a FeboUI, segue o link do seu &lt;a href="https://github.com/HMontarroyos/FeboUI" rel="noopener noreferrer"&gt;repositorio&lt;/a&gt;. &lt;/p&gt;

&lt;p&gt;Fiz também um artigo falando como foi a experiência de ser mantenedor de um projeto no hacktoberfest 2023, segue o &lt;a href="https://dev.to/hmontarroyos/febo-ui-no-hacktoberfest-2023-88p"&gt;link&lt;/a&gt; caso queiram conferir. &lt;/p&gt;

&lt;h3&gt;
  
  
  Um pouco sobre minha participação no hacktoberfest 2023
&lt;/h3&gt;

&lt;p&gt;Como eu entrei já um pouco mais tarde no evento e sendo minha primeira vez como participante do hacktoberfest, eu estava um pouco perdido, e após ler alguns guias aqui na comunidade pude entender como funcionava o evento, e no próprio site do &lt;a href="https://hacktoberfest.com/" rel="noopener noreferrer"&gt;hacktoberfest&lt;/a&gt;, pude ler sobre suas regras e ae então ficou mais fácil.&lt;/p&gt;

&lt;p&gt;Na minha visão eu achava que qualquer projeto open source valeria, mas tinha algumas diretrizes que tinha que seguir como, por exemplo, ter a flag #hacktoberfest ou #hacktoberfest-accepted, isso também me ajudou entender como preparar meu repositório, para ser um mantenedor. &lt;/p&gt;

&lt;p&gt;Devido a isso eu comecei testando em alguns repositórios de testes no hacktoberfest alguns PRs e também fiz algumas contribuições algumas não valeram como foi o caso de um repositório em que se tratava de ajudar a galera que estava começando eu crie um método que calculava a idade com base na data passada, porém esse repositório acabou entrando como spam e infelizmente não contou como voto valido no hacktoberfest. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F683zh123p5k2l2vidn77.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F683zh123p5k2l2vidn77.png" alt="Pr Excluded "&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tive outras contribuições em projetos, open source, porém como não tinha a flag do hacktoberfest e por outras diretrizes acabou não contando, devido a isso vi algo na regra, que não tinha problema em fazer, colaborar no meu próprio projeto em que estava mantendo e com isso inspirar a galera a colaborar com ele. &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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1dc0bfvmm5sgxkrnkbh.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fy1dc0bfvmm5sgxkrnkbh.png" alt="rule"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E como isso estava dentro das regras, eu peguei alguns problemas conhecidos e outras features que era necessário implementar na FeboUI e fiz com isso, o que me valeu os 4PRs validos para o hacktoberfest, mas não só por isso que colaborei no meu repositório e sim para fazer com que a galera se sentisse motivada a ajudar também, visto que ele se enquadrou em um repositório open source valido no hacktoberfest. &lt;/p&gt;

&lt;p&gt;Outros pontos que vi e acho interessante acrescentar, e também como mantenedor, mesmo que os PRs que fiz em outros repositórios não valeram para o hacktoberfest ainda, sim, pude contribuir com o open source e acho que esse é o foco principal do evento.&lt;/p&gt;

&lt;p&gt;Não deixe para a última hora, falo isso por experiência própria, tanto que o próximo hacktoberfest espero começar logo antes, além de também ser paciente, pois os mantenedores de projetos recebem muitas solicitações e ter que avaliar isso um por um requer um certo tempo, então também esteja disposto a fazer alterações com base no feedback que foi fornecido caso haja alguma mudança que forem solicitadas. &lt;/p&gt;

&lt;h3&gt;
  
  
  Minhas colaborações
&lt;/h3&gt;

&lt;p&gt;Dito tudo isto galera aqui estão minhas 4 colaborações validas no hacktoberfest 2023 &lt;/p&gt;

&lt;p&gt;🎃 &lt;a href="https://github.com/HMontarroyos/FeboUI/pull/13" rel="noopener noreferrer"&gt;feat: add Component PriceFormat&lt;/a&gt;&lt;br&gt;
🎃&lt;a href="https://github.com/HMontarroyos/FeboUI/pull/14" rel="noopener noreferrer"&gt;feat: add news props in component Price Format&lt;/a&gt;&lt;br&gt;
🎃&lt;a href="https://github.com/HMontarroyos/FeboUI/pull/15" rel="noopener noreferrer"&gt;fix: adjust component Video&lt;/a&gt;&lt;br&gt;
🎃&lt;a href="https://github.com/HMontarroyos/FeboUI/pull/16" rel="noopener noreferrer"&gt;feat: add component FlatList&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos que vamos galera. &lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Let's code! 🚀
&lt;/h3&gt;

</description>
      <category>hack23contributor</category>
      <category>hacktoberfest</category>
      <category>hacktoberfest23</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Febo UI no Hacktoberfest 2023</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Thu, 26 Oct 2023 23:00:13 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/febo-ui-no-hacktoberfest-2023-88p</link>
      <guid>https://forem.com/hmontarroyos/febo-ui-no-hacktoberfest-2023-88p</guid>
      <description>&lt;h3&gt;
  
  
  Introdução
&lt;/h3&gt;

&lt;p&gt;Mais uma vez aqui galera, dessa vez venho trazer minha experiência como mantenedor de um repositório que está participando do hacktoberfest23.&lt;/p&gt;

&lt;p&gt;É minha primeira vez participando do evento, acabei até entrando um pouco tarde já na metade do mês quase no final, já que esse mês foi um pouco corrido para mim por motivos pessoais, mas ao saber do evento e ter o conhecimento sobre tal, logo procurei participar tanto como colaborador como mantenedor trazendo um projeto que tem um valor muito sentimental para mim, como desenvolvedor, além de desde o momento de sua criação, fazer com que o mesmo fosse open source para que outros devs possam aprender e também contribuir com o mesmo, e vi no &lt;a href="https://hacktoberfest.com/"&gt;hacktoberfest&lt;/a&gt; uma oportunidade perfeita de trazer ele. &lt;/p&gt;

&lt;h3&gt;
  
  
  O que é o Febo UI ?
&lt;/h3&gt;

&lt;p&gt;Vou falar um pouco do que se trata o repositório que trouxe como mantenedor nesse hacktoberfest. &lt;/p&gt;

&lt;p&gt;O &lt;a href="https://www.feboui.com.br"&gt;FeboUI&lt;/a&gt; é uma biblioteca de componentes para a biblioteca React, ela visa simplificar o desenvolvimento trazendo componentes reutilizáveis simples de utilizar, e com uma gama de personalização para cada componente.&lt;br&gt;
Atualmente eu não lancei ainda sua versão 1.0.0 por conta de não ter tempo para revisar tudo, visto que tem ainda pequenas correções a se fazer nela, além de muitos outros componentes já pré-lançados em branchs a parte no backlog pronto para mergear na branch principal. &lt;/p&gt;

&lt;p&gt;Mas infelizmente por conta da correria do dia a dia, é somente eu para poder atualizar toda a documentação do seu storybook, além de testar subir tudo e atualizar o pacote com os novos componentes, então na última versão lançada até o momento ainda consta algumas pequenas falhas de alguns componentes que por sinal, eu abri algumas issues para que quem puder ajudar no hacktoberfest ajuste lá e contribua como um colaborador, de um projeto open source que só visa trazer melhorias para a comunidade. &lt;/p&gt;

&lt;p&gt;Atualmente você consegue achar o &lt;a href="https://www.npmjs.com/package/febo-ui"&gt;FeboUI&lt;/a&gt; na página oficial do NPM para instalar, ou via Yarn caso deseje, na sua versão &lt;em&gt;0.1.36 Beta&lt;/em&gt;. &lt;/p&gt;

&lt;p&gt;Também segue o link para seu &lt;a href="https://github.com/HMontarroyos/FeboUI"&gt;repositório&lt;/a&gt;, o qual tem algumas &lt;a href="https://github.com/HMontarroyos/FeboUI/issues"&gt;issues&lt;/a&gt; abertas para colaborar no hacktoberfest.&lt;/p&gt;

&lt;p&gt;Para isso, nele tem um arquivo chamado &lt;code&gt;CONTRIBUTORS.md&lt;/code&gt; a qual eu deixei uma breve instrução para que todo PR aberto seja colocado seguindo a padronização, seus dados como contribuidor do projeto da seguinte a convenção abaixo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="gu"&gt;#### Name: [Hebert Montarroyos](https://github.com/HMontarroyos)&lt;/span&gt;
&lt;span class="p"&gt;-&lt;/span&gt; Place: Rio de Janeiro, Brazil
&lt;span class="p"&gt;-&lt;/span&gt; Bio: Fullstack Developer
&lt;span class="p"&gt;-&lt;/span&gt; GitHub: &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nv"&gt;Hebert Montarroyos&lt;/span&gt;&lt;span class="p"&gt;](&lt;/span&gt;&lt;span class="sx"&gt;https://github.com/HMontarroyos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Independente do hacktoberfest fique a vontade para contribuir com o projeto, a intenção dele é essa mesmo crescer com a comunidade para uma lib completa de componentes, facilitando ainda mais o desenvolvimento web totalmente open source. &lt;/p&gt;

&lt;p&gt;Espero por vocês lá ;) &lt;/p&gt;

&lt;h3&gt;
  
  
  Prós e Contras
&lt;/h3&gt;

&lt;p&gt;Como eu acabei começando um pouco mais tarde no hacktoberfest, como falei acima, não posso culpar a comunidade de não ter tido muitos colaboradores no repositório em si, então não sei nem se isso seria um ponto contra, já que partiu de mim infelizmente chegar tardio ao evento.&lt;/p&gt;

&lt;p&gt;Mas como ponto totalmente excelente e que além de conhecer outros repositórios open source pude divulgar o FeboUI ainda mais, para ter um alcance maior na comunidade e não só com a finalização do hacktoberfest, espero que vocês continue a nos apoiar e vamos juntos construir nossa lib de componentes React. &lt;/p&gt;

&lt;p&gt;✨ Agradeço a todos que contribuíram com o FeboUI. ✨&lt;/p&gt;

&lt;h3&gt;
  
  
  O que vem a seguir ?
&lt;/h3&gt;

&lt;p&gt;Como dito antes e importantíssimo que todos que colaboram ou agora que conheceram a nossa lib, possam continuar ajudando com novas features, corrigindo bugs entre outras soluções e assim criar uma lib muito melhor, mesmo após a finalização do hacktoberfest desse ano.&lt;/p&gt;

&lt;p&gt;Novamente deixo meu agradecimento não só como mantenedor do FeboUI, mas como contribuidor em outros projetos do hacktoberfest23. &lt;/p&gt;

&lt;p&gt;Vamos que vamos galera. &lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Let's code! 🚀
&lt;/h3&gt;

</description>
      <category>hack23maintainer</category>
      <category>hacktoberfest</category>
      <category>hacktoberfest23</category>
      <category>opensource</category>
    </item>
    <item>
      <title>Trilhando o meu primeiro Hacktoberfest 2023</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Thu, 26 Oct 2023 19:40:44 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/trilhando-o-meu-primeiro-hacktoberfest-39l0</link>
      <guid>https://forem.com/hmontarroyos/trilhando-o-meu-primeiro-hacktoberfest-39l0</guid>
      <description>&lt;p&gt;Olá rede, muito prazer me chamo Hebert Montarroyos, sou Desenvolvedor FullStack, é meu primeiro contato com o &lt;a href="https://hacktoberfest.com/"&gt;hacktoberfest&lt;/a&gt;, na verdade, acabei entrando um pouco mais tarde já na metade de outubro, porém pretendo me comprometer e além de colaborar com a comunidade, pretendo manter um projeto, que já tenho faz um tempo open source, para que outros devs possam ajudar e também aprender com ele. &lt;/p&gt;

&lt;p&gt;Durante o Hacktoberfest, vou explorar projetos de código aberto alinhados aos meus interesses e habilidades. Seja codificando, corrigindo erros, melhorando a documentação ou sugerindo recursos, estou pronto para me envolver. Acredito que o código aberto é sobre colaboração e inovação. Espero conectar-me com pessoas que compartilham essa paixão pela tecnologia e o desejo de fazer a diferença no mundo através de contribuições com o open source. &lt;/p&gt;

&lt;p&gt;Há um tempo escrevi um artigo ensinando como colaborar com projetos open source, deixo o &lt;a href="https://dev.to/hmontarroyos/como-contribuir-com-projeto-open-source-e-apoiar-a-comunidade-5g7a"&gt;link&lt;/a&gt; aqui também. &lt;/p&gt;

&lt;p&gt;Além de divulgar ainda mais meu projeto open source que se trata de uma biblioteca de componentes para React a qual deixo o &lt;a href="https://github.com/HMontarroyos/FeboUI"&gt;link&lt;/a&gt; aqui também, caso queiram colaborar e também está com a flag do #hacktoberfest2023.&lt;/p&gt;

&lt;p&gt;Dito tudo isto fico aberto a novas oportunidades, caso queiram trocar alguma ideia só me chamar por aqui ou em alguma rede social minha, um ótimo hacktoberfest a todos, e vamos codar. &lt;/p&gt;

&lt;h3&gt;
  
  
  🚀 Let's code! 🚀
&lt;/h3&gt;

</description>
      <category>hacktoberfest</category>
      <category>hacktoberfest23</category>
      <category>opensource</category>
    </item>
    <item>
      <title>21 Extensões Essenciais do Chrome para Aprimorar o Desenvolvimento Web</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Sat, 09 Sep 2023 17:04:51 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/21-extensoes-essenciais-do-chrome-para-aprimorar-o-desenvolvimento-web-4n37</link>
      <guid>https://forem.com/hmontarroyos/21-extensoes-essenciais-do-chrome-para-aprimorar-o-desenvolvimento-web-4n37</guid>
      <description>&lt;p&gt;&lt;em&gt;Aprimore seu Fluxo de Trabalho com essas extensões especializadas e Aumente sua Eficiência no Desenvolvimento Web&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Para quem usa o Google Chrome, para desenvolvimento web, já deve ter notado que ele é um poderoso amigo na hora de depurar seus códigos através do &lt;a href="https://developer.chrome.com/docs/devtools/"&gt;Web development tools&lt;/a&gt;, nativo nele, onde você pode ver seus console.log, analisar o que esta sendo salvo na memória do navegador ou até o que aquela requisição está vindo da API, que você está consumindo.&lt;br&gt;
Além de tudo isso o Chrome em sua loja oficial, &lt;a href="https://chrome.google.com/webstore/category/extensions?hl=pt-br"&gt;chrome web store&lt;/a&gt;, tem diversas extensões desenvolvidas prontas para uso para facilitar a vida de qualquer desenvolvedor web, pensando nisso vou trazer aqui 21 extensões que eu venho feito uso, há algum tempo, vamos lá.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/allow-cors-access-control/lhobafahddgcelffkeicbaginigeejlf"&gt;1.Allow CORS: Access-Control-Allow-Origin&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Agp4uIa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kv4x6phtcmjo25v8qxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Agp4uIa1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3kv4x6phtcmjo25v8qxy.png" alt="Extensão Allow CORS" width="800" height="421"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta extensão elá basicamente adiciona facilmente a regra (Access-Control-Allow-Origin: *) ao cabeçalho de resposta, isto é muito útil para quebrar um galho, quando dá erro de CORS da API e sua requisição é bloqueada pelo navegador, com ela você consegue desativar ou ativar e também passar parâmetros adicionais.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/colorzilla/bhlhnicpbhignbdhedgjhgdocnmhomnp?hl=pt"&gt;2. ColorZilla&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OXP1lXlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/behnkndcry0118467231.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OXP1lXlS--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/behnkndcry0118467231.png" alt="Extensão ColorZilla" width="800" height="362"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com o ColorZilla você pode obter uma leitura de cores de qualquer ponto do seu navegador, ajustar rapidamente essa cor e colá-la em outro programa, seletor de cores. Isso é muito útil para descobrir que cor e determinado elemento daquela página e através disso você conseguir salvar sua cor em rgb ou outro formato que ele atende, para uso depois no seu CSS.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/clear-cache/cppjkneekbjaeellbfkmgnhonkkjfpdn"&gt;3. Clear Cache&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--w_EeP9C8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gk13zozymt2sglleyvt1.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--w_EeP9C8--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gk13zozymt2sglleyvt1.jpg" alt="Extensão Clear Cache" width="640" height="400"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Basicamente através dessa extensão você consegue limpar todo o seu cache e dados de navegação com um único clique de um botão, sendo bem útil também quando quiser limpar os dados salvos na memória do navegador, pois ele também tem uma opção para limpar somente isso.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/css-peeper/mbnbehikldjhnfehhnaidhjhoofhpehk"&gt;4. CSS Peeper&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--BybBO_2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5y98jnkdpohl8wdog1j.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--BybBO_2i--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/f5y98jnkdpohl8wdog1j.png" alt="Extensão CSS Peeper" width="800" height="380"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Através desta extensão é possível selecionar elementos da página, seja eles textos, imagens ou até componentes inteiros e através disso extrair seu CSS. Isso é muito útil quando você quer reaproveitar determinado elemento para seu site ou então, quer apenas saber o que utilizou dentro daquela aplicação, sem dúvida de toda a lista é um das extensões com maior poder para quem trabalha no front-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/editthiscookie/fngmhnnpilhplaeedifhccceomclgfbg"&gt;5. EditThisCookie&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ppA0AkE1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nkbxda9lbde9jdoe3aoh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ppA0AkE1--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nkbxda9lbde9jdoe3aoh.png" alt="Extensão EditThisCookie" width="800" height="849"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;EditThisCookie é um gerenciador de cookies. Você pode adicionar, excluir, editar, procurar, proteger e bloquear cookies. Isso é bastante útil seja para você limpar os seus cookies de navegação de um determinado site ou quando você está trabalhando com alguma aplicação e deseja criar um cookie fake, através desta extensão com apenas alguns cliques isso é possível.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/fake-filler/bnjjngeaknajbdcgpfkgnonkmififhfo"&gt;6. Fake Filler&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--SC9CYXH7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shgonzccyav06fuubtw8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--SC9CYXH7--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/shgonzccyav06fuubtw8.png" alt="Extensão Fake Filler" width="800" height="711"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esta extensão é maravilhosa quando você quer testar seus próprios formulários ou de algum site, de maneira rápida, ao clicar sobre a extensão ela automaticamente verifica se tem algum formulário na página, caso tenha já preenche de maneira aleatória com dados fakes como no exemplo acima. Basicamente um preenchedor de formulário que preenche todas as entradas em uma página com dados falsos/fictícios.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/json-viewer/gbmdgpbipfallnflgajpaliibnhdgobh"&gt;7. JSON Viewer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--jCzdLxAJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbypkia4ocbabqkz6wf9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--jCzdLxAJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/sbypkia4ocbabqkz6wf9.png" alt="Extensão JSON Viewer" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa extensão diferente das demais, ela já vem habilitada por default no momento que é instalada, basicamente ela facilita sua vida ao se deparar com algum arquivo JSON vindo de alguma API, por exemplo, o que ela faz e exatamente deixar seu JSON mais bonito e personalizável, como no exemplo acima que é um GET onde traz meus dados da minha API, consigo visualizar sem estar tudo embolado no navegador, graças a essa extensão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/lighthouse/blipmdconlkpinefehnmjammfjpmpbjk"&gt;8. Lighthouse&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--pUmdvKEU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vo1643fjih6qd3k4i9hn.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--pUmdvKEU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vo1643fjih6qd3k4i9hn.png" alt="Extensão Lighthouse" width="800" height="324"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O Lighthouse é uma ferramenta automatizada de código aberto para melhorar o desempenho, a qualidade e a correção de seus aplicativos da web. Essa extensão após instalada você só ira conseguir ver ela dentro do próprio dev tools do chrome, aonde ele irá agora ter uma aba personalizada somente dele, com isso você consegue testar o desempenho, consegue vê se seu site está tendo acessibilidade com todos os públicos, também consegue gerir o SEO do seu site para monitorar como ele está sendo apresentado nas páginas, além de muitas outras funcionalidades.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/octotree-github-code-tree/bkhaagjahfmjljalopjnoealnfndnagc"&gt;9. Octotree — GitHub code tree&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--6UfrvABm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1b1ixiraif6sd2vzgia.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--6UfrvABm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1b1ixiraif6sd2vzgia.png" alt="Extensão Octotree — GitHub code tree" width="800" height="361"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse cara é um facilitador de vidas, toda vez que você está vendo algum repositório no &lt;a href="https://github.com/"&gt;github&lt;/a&gt;, já deve ter se deparado de ter que entrar em cada pasta para vê o que cada uma faz né. Basicamente com essa extensão isso vai mudar, por que ao ter ela instalada qualquer repositório que você entrar a partir de agora no github, ela irá aparecer ali do lado esquerdo e ao passar o mouse sobre ela ira abrir essa aba, que você consegue facilmente vê tudo que tem dentro da pasta src, por exemplo, sem ter que entrar nela, facilitando sua visita rápida pelo repositório em questão.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/material-icons-for-github/bggfcpfjbdkhfhfmkjpbhnkhnpjjeomc"&gt;10. Material Icons for GitHub&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LEcJKe1E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlmu6k02acjtcaqxp26u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LEcJKe1E--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/mlmu6k02acjtcaqxp26u.png" alt="Extensão Material Icons for GitHub" width="328" height="585"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A decima extensão o print da extensão anterior já deve ter entregado, basicamente para quem curte utilizar o &lt;a href="https://marketplace.visualstudio.com/items?itemName=PKief.material-icon-theme"&gt;Material no VSCode&lt;/a&gt;, por exemplo, e está habituado, com essa coleção de ícones, ficará melhor ainda com essa coleção agora no seu repositório do github, basicamente com ela instalada e habilitada você tem acesso agora ao Material icons no GitHub.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/material-devtools-theme-c/jmefikbdhgocdjeejjnnepgnfkkbpgjo"&gt;11. Material DevTools Theme Collection&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--v9gY68FO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2uidxqgwz6r5xc4wz0y.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--v9gY68FO--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y2uidxqgwz6r5xc4wz0y.png" alt="Extensão Material DevTools Theme Collection" width="800" height="325"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para os amantes de Material, ae vai mais uma extensão massa para complementar a lista, através dela é possível alterar todo o tema do dev tools nativo do chrome, dando um ar mais parecido com nosso VSCode.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/window-resizer/kkelicaakdanhinjdeammmilcgefonfh"&gt;12. Window Resizer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--rTUVwfUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nd75qw27irnw94h3zvfi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--rTUVwfUk--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nd75qw27irnw94h3zvfi.png" alt="Extensão Window Resizer" width="488" height="613"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Window Resizer é a extensão perfeita quando se quer trabalhar com responsividade para ajustar os elementos da sua aplicação nos mais variados formatos de tela, ao clicar sobre a extensão elá lhe entrega diversos tamanhos onde você pode customizar e testar como cada componente está sendo exibido na página em cada dispositivo, além de te dar uma régua para verificar cada píxel da página, sem dúvida facilita em muito o trabalho no front-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/whatfont/jabopobgcpjmedljpbcaablpmlmfcogm"&gt;13. WhatFont&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--l-TARNcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31ebf1nhlz5h8eis7ab1.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--l-TARNcA--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/31ebf1nhlz5h8eis7ab1.png" alt="Extensão WhatFont" width="800" height="368"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com esta extensão, assim como o nome já diz, ela basicamente consegue capturar qual a fonte foi escolhida para o texto em questão, da página, apenas clicando nela e posicionando o mouse acima do texto desejado, elá identifica qual a fonte foi escolhida.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/web-developer-checklist/iahamcpedabephpcgkeikbclmaljebjp"&gt;14. Web Developer Checklist&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Cj4YRS1a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13yw6e7wfm0d0u4igeps.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Cj4YRS1a--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/13yw6e7wfm0d0u4igeps.png" alt="Extensão Web Developer Checklist" width="800" height="370"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Web Developer Checklist é uma extensão que ajuda os desenvolvedores a garantir que seus sites ou aplicativos web atendam a uma lista de boas práticas e diretrizes recomendadas para garantir um alto nível de qualidade e usabilidade. Com a Web Developer Checklist, os desenvolvedores podem verificar se o site ou aplicativo web atende aos padrões de design, desenvolvimento e segurança, como no exemplo acima no site oficial da Apple, ela pontou alguns pontos a melhorar e elogiou outros como concluídos.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/web-developer/bfbameneiokkgbdmiekhjnmfkcnldhhm"&gt;15. Web Developer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--OUVIdaLb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k50w39m9aj1i8hwe4h9s.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--OUVIdaLb--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/k50w39m9aj1i8hwe4h9s.png" alt="Extensão Web Developer" width="800" height="113"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa sem dúvida é minha preferida de toda a lista, extensão famosa pau para toda obra, basicamente o que ela faz é o seguinte, ela adiciona um botão de barra de ferramentas com várias ferramentas de desenvolvedor web, mas não é qualquer ferramenta, ela consegue desabilitar o JavaScript e CSS da página, consegue resetar o CSS da página, habilita ou desabilita cookies, Popups entre muitas outras funcionalidades, uma gama de ferramentas perfeitas para desenvolvimento front-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/wappalyzer-technology-pro/gppongmhjkpfnbhagpmjfkannfbllamg"&gt;16. Wappalyzer — Technology profiler&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3W4jv5bq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hmxdvecnuabrt6b9w621.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3W4jv5bq--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/hmxdvecnuabrt6b9w621.png" alt="Extensão Wappalyzer — Technology profiler" width="800" height="348"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Wappalyzer é uma extensão de análise de tecnologia que permite identificar as tecnologias utilizadas em um site ou aplicação web. Com o Wappalyzer, você pode descobrir quais sistemas de gerenciamento de conteúdo (CMS), frameworks, linguagens de programação, bancos de dados e outras tecnologias estão sendo usadas em um determinado site, como no exemplo acima que utilizei ela para algumas das tecnologias usadas no site da Blizzard.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/visbug/cdockenadnadldjbbgcallicgledbeoc"&gt;17. VisBug&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--4KB7uv99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g0k8vznsvyr2nn1hqnlr.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--4KB7uv99--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g0k8vznsvyr2nn1hqnlr.png" alt="Extensão VisBug" width="800" height="321"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa extensão é tipo o mod God nos games, com ela habilitada após instalada em qualquer site ela permite aos desenvolvedores web editar facilmente o design e o layout de uma página web em tempo real, sem dúvida uma ótima extensão para se ter como desenvolvedor front-end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/site-palette/pekhihjiehdafocefoimckjpbkegknoh"&gt;18. Site Palette&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--iazJXF_v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmo6vcdqvv38x9ogaqkv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--iazJXF_v--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/dmo6vcdqvv38x9ogaqkv.png" alt="Extensão Site Palette" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;É uma excelente ferramenta, basicamente você ao habilitar consegue ter acesso a toda paleta de cores que foi feita no site em questão. Essa extensão eu vou deixar, mas como menção honrosa aqui, já utilizei muito no passado, porém agora ela se tornou uma extensão paga, então na minha opinião é, mas valida para quem trabalha somente com a parte de ui/ux e tem muitos projetos com isso, pois para usar somente uma vez não sei se valeria tanto a pena, mas fica a sua escolha, de qualquer modo não dá para não negar que se trata de uma excelente ferramenta.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/save-svg-as-png/dihlbjcdgfoehmhbklciidmolbmabkki"&gt;19. Save SVG as PNG&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s---xsrQ9A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5dghd323pcyy617h0geu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s---xsrQ9A---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5dghd323pcyy617h0geu.png" alt="Extensão Save SVG as PNG" width="800" height="457"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa extensão o uso dela é bem simples, ela serve para salvar imagens SVG como PNG. Você pode navegar até um arquivo .svg, clique com o botão direito nele e clique no item do menu de contexto ‘Salvar SVG como PNG’.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/react-developer-tools/fmkadmapgofadopljbjfkapdkoienihi"&gt;20. React Developer Tools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--LW2ZG6hJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inlo24uqvooxz4mg47tk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--LW2ZG6hJ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/inlo24uqvooxz4mg47tk.png" alt="Extensão React Developer Tools" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O React Developer Tools é uma extensão imprescindível para quem desenvolve aplicações web com &lt;a href="https://react.dev/"&gt;React&lt;/a&gt;, ao ser instalada ela adiciona uma nova aba no dev tools do chrome, que permite aos desenvolvedores inspecionar e depurar aplicações React. Além dela não se exclusiva do chrome estando também no &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/react-devtools/"&gt;Mozilla Firefox&lt;/a&gt; e outros navegadores populares. Essa ferramenta oferece um conjunto de funcionalidades valiosas para desenvolvedores que trabalham com o React. Você só consegue ter acesso a essa aba nova no dev tools, somente em aplicações React onde o próprio navegador faz essa identificação, podendo gerenciar as props e estados entre outras funcionalidades nativas do React.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;a href="https://chrome.google.com/webstore/detail/redux-devtools/lmhkpmbekcpmknklioeibfkpmmfibljd"&gt;21. Redux DevTools&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--MAa7gmmQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czsiovhihk2nt6escjoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--MAa7gmmQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/czsiovhihk2nt6escjoq.png" alt="Extensão Redux DevTools" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Redux DevTools, essa extensão assim como a de cima o React Developer Tool, também cria uma nova aba no dev tools, porém dessa vez para aplicações que utilizem do &lt;a href="https://redux.js.org/"&gt;Redux&lt;/a&gt;, uma biblioteca de gerenciamento de estado para JavaScript em sua aplicação, com diversas funcionalidades únicas no seu dev tools.&lt;/p&gt;

&lt;h3&gt;
  
  
  Resumo
&lt;/h3&gt;

&lt;p&gt;Existem muitas outras extensões que eu não cheguei a trazer aqui para não ficar muito grande o artigo, que qualquer coisa posso trazer uma parte 2 ou 3 sobre o assunto caso tenha alguma necessidade. Essas extensões são ótimas, pois além das funcionalidades nativas do Chrome, como o Web Development Tools, que permite depurar códigos de forma eficaz, a &lt;a href="https://chrome.google.com/webstore/category/extensions?hl=pt-br"&gt;Chrome Web Store&lt;/a&gt; oferece uma ampla variedade de extensões desenvolvidas para otimizar o fluxo de trabalho dos desenvolvedores, além dessas pode se fazer uma pesquisa e achar outras mais, ficaria grato também se quisesse deixar o nome das extensões que vocês costumam usar para seu desenvolvimento, aumentando ainda mais nossa lista e ajudando ainda mais a comunidade. Essas extensões que eu trouxe foram para o navegador Chrome, porém muitas delas aqui citadas também existem para outros navegadores como no Mozilla, por exemplo, fica a seu critério buscar compatibilidade com demais navegadores.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>extensions</category>
      <category>frontend</category>
      <category>productivity</category>
    </item>
    <item>
      <title>Explorando a lib usehooks-ts para Desenvolvimento no React</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Sat, 02 Sep 2023 17:37:45 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/explorando-a-lib-usehooks-ts-para-desenvolvimento-no-react-338n</link>
      <guid>https://forem.com/hmontarroyos/explorando-a-lib-usehooks-ts-para-desenvolvimento-no-react-338n</guid>
      <description>&lt;p&gt;&lt;em&gt;Essa lib é uma boa escolha para quem curte hooks personalizáveis, além de ser em Typescript, o que facilita na hora de desenvolver e conhecer os recursos que essa poderosa lib, traz consigo.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Vamos lá, &lt;a href="https://usehooks-ts.com/"&gt;usehooks-ts&lt;/a&gt; o que falar desse camarada que facilita em muitos aspectos a vida do dev. Ela é uma biblioteca que fornece uma coleção de hooks personalizados, para uso em projetos React com TypeScript. Esses hooks abrangem uma variedade de funcionalidades, desde manipulação de estado até interações com APIs externas.&lt;/p&gt;

&lt;p&gt;Essa biblioteca é útil porque oferece uma maneira conveniente de reutilizar lógica em seus componentes React. Em vez de escrever a mesma lógica repetidamente em vários componentes, você pode simplesmente importar os hooks correspondentes da biblioteca e usá-los em seus componentes.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de hooks disponíveis nessa biblioteca incluem o &lt;code&gt;useLocalStorage&lt;/code&gt;, que permite armazenar dados no localStorage do navegador, e o &lt;code&gt;useFetch&lt;/code&gt;, que facilita a realização de requisições HTTP.&lt;/p&gt;

&lt;p&gt;Basicamente elá e uma biblioteca de hooks personalizados, feito em &lt;a href="https://www.typescriptlang.org/"&gt;Typescript&lt;/a&gt;, mas se você tiver caído de paraquedas e não saber o que são hooks personalizados, eu fiz uma matéria sobre o assunto, vou deixar o &lt;a href="https://dev.to/hmontarroyos/do-conceito-a-implementacao-criando-e-utilizando-hooks-personalizados-no-react-4gah"&gt;link aqui.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E caso você nem faça ideia do que são os hooks no React, um breve resumo que eu poderia dar, seria que os Hooks são uma característica introduzida no React, que permitem que você use o estado e outros recursos do React em componentes funcionais. Antes da introdução dos hooks, o React principalmente se baseava em componentes de classe para gerenciar o estado e o ciclo de vida.&lt;/p&gt;

&lt;p&gt;Voltando a falar sobre essa lib, se você estiver trabalhando em um projeto React com TypeScript, o uso dessa biblioteca pode simplificar seu código e aumentar sua produtividade. No entanto, é importante revisar a documentação e entender como cada hook funciona antes de usá-lo em seu projeto, eu irei trazer alguns pontos positivos e também negativos de utilizar essa lib, assim como alguns métodos populares dela, juntamente como instalar em seu projeto react.&lt;/p&gt;

&lt;h3&gt;
  
  
  Vantagens do usehooks-ts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Produtividade:&lt;/strong&gt; Essa lib fornece um acervo de hooks personalizados e amplamente testados na comunidade, o que pode acelerar o desenvolvimento, fornecendo implementações comuns de funcionalidades que você pode simplesmente importar e usar em seus componentes, como o &lt;code&gt;useLocalStorage&lt;/code&gt; ou &lt;code&gt;useFetch&lt;/code&gt;,citados anteriormente.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reutilização de código:&lt;/strong&gt; Hooks personalizados encapsulam lógica complexa em componentes, tornando mais fácil e eficiente a reutilização desse código em toda a aplicação.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Type Safety (Segurança de Tipos):&lt;/strong&gt; Como o usehooks-ts é projetada com TypeScript, isso pode ajudar a melhorar a segurança de tipos em seu código, o que pode evitar muitos erros comuns.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alto Acervo:&lt;/strong&gt; Essa lib possui muitos hooks atualmente em sua versão, o que lhe facilita utilizar dela em vários projetos, como, por exemplo, o hook &lt;code&gt;useDarkMode&lt;/code&gt; que é um hook onde permite adicionar um tema escuro ao seu aplicativo, muito útil na maioria das aplicações.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desvantagens do usehooks-ts
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Limitações:&lt;/strong&gt; Bibliotecas de hooks personalizados podem não atender a todas as necessidades da sua aplicação, o que pode exigir soluções adicionais ou personalizadas, mesmo falando sobre seu alto acervo de métodos, pode ser que em sua aplicação específica algo nessa lib não atenda, e por isso não seja necessário utilizar ela no codigo.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Curva de Aprendizado:&lt;/strong&gt; Possa ser que alguns hooks dessa lib, seja necessário dar uma estudada, mas afundo para entender como implementar, mesmo estando tudo bem documentado, vale a pena colocar esse ponto.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tamanho do Bundle:&lt;/strong&gt; Como toda boa dependência, isso pode aumentar o tamanho do bundle da sua aplicação, caso tenha muitas dependências instaladas em seu projeto, isso possa vir futuramente afetar o desempenho.&lt;/p&gt;

&lt;h3&gt;
  
  
  Como fazer o uso do usehooks-ts em seus projetos
&lt;/h3&gt;

&lt;p&gt;Instale a biblioteca usehooks-ts usando o npm ou o yarn.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm i usehooks-ts&lt;/code&gt;&lt;br&gt;
ou&lt;br&gt;
&lt;code&gt;yarn add usehooks-ts&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Vou dar um exemplo a seguir de como fazer o uso dessa lib em seu projeto, no nosso caso, vou utilizar do hook &lt;code&gt;useFetch&lt;/code&gt;, para fazer uma chamada simples a essa API gratuita de fatos aleatórios do ilustre &lt;a href="https://www.instagram.com/chucknorris/"&gt;Chuck Norris&lt;/a&gt;, a &lt;a href="https://api.chucknorris.io/"&gt;chucknorris.io&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para isso criei um componente chamado &lt;em&gt;ChuckNorrisFactsRandom&lt;/em&gt; , que o único objetivo desse componente será exibir uma série de fatos icônicos sobre nosso Chuck Norris aleatoriamente, ou seja, toda vez que recarregar a página esses fatos serão recarregados visto que estaremos fazendo um Get para essa API, onde nosso endpoint sempre nos devolve um fato randômico.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useFetch&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usehooks-ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ChuckNorrisJoke&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;value&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;ChuckNorrisFactsRandom&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useFetch&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ChuckNorrisJoke&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="s2"&gt;`https://api.chucknorris.io/jokes/random`&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;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&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;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Error: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;message&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt; &lt;span class="na"&gt;style&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;fontStyle&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;italic&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;value&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Loading...&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;ChuckNorrisFactsRandom&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E no meu App eu vou chamar esse componente para renderizar na minha aplicação.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;ChuckNorrisFactsRandom&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./Components&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;ChuckNorrisFactsRandom&lt;/span&gt; &lt;span class="p"&gt;/&amp;gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E o resultado é esse, nada estilizado mesmo, só para amostrar um exemplo de uso real de um dos hooks dessa biblioteca.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--qtl3rp_W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1nhyp1m82io0lsesxx3e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--qtl3rp_W--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1nhyp1m82io0lsesxx3e.png" alt="Componente ChuckNorrisFactsRandom, onde faz a chamada a API através do hook useFetch, renderizado na tela " width="800" height="290"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Hooks populares do usehooks-ts
&lt;/h3&gt;

&lt;p&gt;Eu vou usar alguns dos próprios exemplos que tem na biblioteca, para mais detalhes é só dar uma olhada mesmo na própria documentação do &lt;a href="https://usehooks-ts.com/"&gt;usehooks-ts&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;useDarkMode:&lt;/strong&gt; Esse hook permite adicionar um tema escuro ao seu aplicativo. Veja o exemplo abaixo, ao pressionar cada botão ele vai mudar, depois é só você criar um arquivo no seu CSS global de temas, para implementar de fato essa funcionalidade, podendo até mesmo ter a opção de desativar ou ativar o tema, separado em métodos diferentes.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useDarkMode&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usehooks-ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;isDarkMode&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;disable&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useDarkMode&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Current theme: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;isDarkMode&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dark&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;light&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;p&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toggle&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Toggle&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;enable&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Enable&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;disable&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Disable&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;useHover:&lt;/strong&gt; Esse hook ele permite você verificar se tem algum elemento na página sobre o efeito de &lt;em&gt;hover&lt;/em&gt; utilizando de JavaScript para isso ao invés do CSS. No exemplo abaixo ao posicionar o mouse sobre a palavra &lt;em&gt;unhovered&lt;/em&gt; ela é substituída por &lt;em&gt;hovered&lt;/em&gt;, ao tirar ele volta para o que estava anterior.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useHover&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usehooks-ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&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;hoverRef&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useRef&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;isHover&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useHover&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hoverRef&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt; &lt;span class="na"&gt;ref&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;hoverRef&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`The current div is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isHover&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`hovered`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`unhovered`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;useLocalStorage:&lt;/strong&gt; Esse hook permite armazenar e recuperar dados no localStorage do navegador. No exemplo abaixo ele poderia ser facilmente combinado com o &lt;code&gt;useDarkMode&lt;/code&gt;,para salvar o tema no navegador do usuário, no nosso caso fizemos diferente, mas também é uma opção. No nosso caso salvamos uma variável booleana chamada, &lt;em&gt;darkTheme&lt;/em&gt; no nosso &lt;em&gt;LocalStorage&lt;/em&gt;, e através do clique nesse botão seu valor e alterado para true ou false.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight tsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useLocalStorage&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;usehooks-ts&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;isDarkTheme&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setDarkTheme&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useLocalStorage&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;darkTheme&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleTheme&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;setDarkTheme&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="na"&gt;prevValue&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;prevValue&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toggleTheme&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;`The current theme is &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;isDarkTheme&lt;/span&gt; &lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="s2"&gt;`dark`&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`light`&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



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

&lt;p&gt;A biblioteca &lt;em&gt;usehooks-ts&lt;/em&gt; é uma valiosa ferramenta para desenvolvedores React que desejam aprimorar a produtividade e a legibilidade de seu código. Ela oferece uma coleção de hooks personalizados pré-construídos, projetados para simplificar tarefas comuns no desenvolvimento de aplicativos React com TypeScript. Esses hooks abstraem a complexidade de tarefas como gerenciamento de estado, requisições de API e interações com o ciclo de vida dos componentes, permitindo que os desenvolvedores se concentrem mais na lógica de negócios de suas aplicações. Embora a &lt;em&gt;usehooks-ts&lt;/em&gt; possa acelerar o desenvolvimento, é importante considerar cuidadosamente as vantagens e desvantagens de sua utilização em um projeto específico, bem como a conformidade com as práticas recomendadas de desenvolvimento.&lt;/p&gt;

</description>
      <category>react</category>
      <category>typescript</category>
      <category>hooks</category>
      <category>functional</category>
    </item>
    <item>
      <title>Construindo Aplicações Web com a Poderosa Stack MERN</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Thu, 24 Aug 2023 16:47:24 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/construindo-aplicacoes-web-com-a-poderosa-stack-mern-4f13</link>
      <guid>https://forem.com/hmontarroyos/construindo-aplicacoes-web-com-a-poderosa-stack-mern-4f13</guid>
      <description>&lt;p&gt;&lt;em&gt;Guia Passo a Passo da Stack MERN: Do Início ao Uso em Projetos Reais&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;A Stack MERN é um conjunto de tecnologias amplamente utilizadas para desenvolver aplicações web modernas e eficientes. Nada mais é do que um acrônimo composta por essas 4 tecnologias: &lt;a href="https://www.mongodb.com/pt-br" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;, &lt;a href="https://expressjs.com/pt-br/" rel="noopener noreferrer"&gt;Express.js&lt;/a&gt;, &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;React&lt;/a&gt; e &lt;a href="https://nodejs.org/pt-br" rel="noopener noreferrer"&gt;Node.js&lt;/a&gt;, essa stack oferece uma abordagem completa, para a criação de aplicações full-stack. Neste artigo, exploraremos cada componente da stack MERN, suas características distintas e os prós e contras de estudá-la seguindo minha percepção, que tive ao usa-lá, logicamente como sempre falo, cada um pode ter suas próprias vantagens ou desvantagens, além de deixar um exemplo de caso de uso real de uma aplicação web utilizando dessa stack.&lt;/p&gt;

&lt;p&gt;Essa Stack ela é dividida da seguinte maneira, o React fica responsável por toda a parte no lado do cliente, o front-end da aplicação, deixando o Express.js e o Node.js na parte do servidor, juntamente com o MongoDB no back-end, onde é usado como o banco de dados da aplicação.&lt;/p&gt;

&lt;p&gt;Existe outra stack muito similar a essa, que é a MEAN, fazendo basicamente a mesma coisa, porém no lugar do React, se utiliza do &lt;a href="https://angular.io/" rel="noopener noreferrer"&gt;Angular&lt;/a&gt; para gerir a parte do front-end da aplicação.&lt;/p&gt;

&lt;p&gt;Eu vou falar um pouco de cada uma aqui de forma resumida, trazendo alguns pontos fortes e fracos de se usar cada tecnologia, pretendo depois trazer um artigo a parte, falando detalhadamente sobre cada tecnologia em questão, para não alongar muito aqui.&lt;/p&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://www.mongodb.com/pt-br" rel="noopener noreferrer"&gt;1. MongoDB&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;O MongoDB é um banco de dados NoSQL orientado a documentos, que oferece flexibilidade e escalabilidade para as aplicações.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Flexibilidade de Esquema: Os documentos são armazenados em formato JSON-like (BSON), permitindo que os esquemas se adaptem às mudanças ao longo do desenvolvimento.&lt;/li&gt;
&lt;li&gt;Escalabilidade Horizontal: O MongoDB suporta a distribuição de dados em clusters, facilitando o aumento de capacidade à medida que o tráfego aumenta.&lt;/li&gt;
&lt;li&gt;Desenvolvimento Rápido: A ausência de esquema rígido acelera o processo de desenvolvimento, permitindo iterações mais ágeis.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Desvantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Complexidade de Modelagem: A ausência de um esquema definido pode resultar em modelos de dados mal estruturados, exigindo uma abordagem cuidadosa na modelagem.&lt;/li&gt;
&lt;li&gt;Menos Adequado para Dados Relacionais: Aplicações que dependem fortemente de relações complexas entre os dados podem encontrar desafios ao usar um banco de dados NoSQL, como é o caso do MongoDB.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://expressjs.com/pt-br/" rel="noopener noreferrer"&gt;2. Express.js&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;O Express.js é um framework para criação de aplicativos web em Node.js. Ele simplifica a criação de APIs e o manuseio de rotas e requisições.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Simplicidade: O Express oferece uma abordagem minimalista, permitindo aos desenvolvedores criar rapidamente endpoints e configurar middleware.&lt;/li&gt;
&lt;li&gt;Ampla Comunidade e Documentação: Sendo um dos frameworks mais populares para Node.js, o Express tem uma comunidade ativa e vasta documentação.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Desvantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Estrutura Flexível: A falta de estrutura rígida pode levar a inconsistências na organização do código, especialmente em projetos maiores.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://react.dev/" rel="noopener noreferrer"&gt;3. React&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;O React é uma biblioteca JavaScript desenvolvida pelo Facebook para construir interfaces de usuário interativas e reativas, no lado do cliente.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Componentização: O React promove a criação de componentes reutilizáveis, agilizando o desenvolvimento e a manutenção.&lt;/li&gt;
&lt;li&gt;Renderização Eficiente: Utilizando o conceito de Virtual DOM, o React atualiza apenas as partes necessárias da interface, melhorando o desempenho.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Desvantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Curva de Aprendizado Inicial: Para desenvolvedores novos no conceito de componentes e JSX, pode haver uma curva de aprendizado inicial.&lt;/li&gt;
&lt;/ul&gt;

&lt;h4&gt;
  
  
  &lt;a href="https://nodejs.org/pt-br" rel="noopener noreferrer"&gt;4. Node.js&lt;/a&gt;
&lt;/h4&gt;

&lt;p&gt;O Node.js é um ambiente de execução JavaScript do lado do servidor. Ele permite que os desenvolvedores construam aplicativos web escaláveis e em tempo real.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Vantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;JavaScript Unificado: Usar a mesma linguagem (JavaScript) em todo o stack simplifica a comunicação e a colaboração entre os desenvolvedores.&lt;/li&gt;
&lt;li&gt;Não Bloqueante: O modelo de E/S não bloqueante do Node.js permite um alto desempenho e escalabilidade em aplicações que dependem de muitas operações de I/O.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;em&gt;Desvantagens:&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Gerenciamento de Eventos: O modelo baseado em eventos pode tornar o código complexo em casos de fluxos de controle complexos.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Essas foram algumas vantagens e desvantagens que encontrei ao longo dos anos utilizando dessa stack, teria muitas outras, mas é assunto para um próximo artigo. Sinta-se a vontade para concordar ou discordar sobre os pontos que citei até aqui.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens de Estudar a Stack MERN
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Tecnologias Modernas: A stack MERN é composta por tecnologias atualizadas e amplamente adotadas na indústria.&lt;/li&gt;
&lt;li&gt;Flexibilidade: A flexibilidade das tecnologias permite adaptar-se a diferentes tipos de projetos e requisitos.&lt;/li&gt;
&lt;li&gt;Comunidades Ativas: Cada componente da stack possui uma comunidade ativa, facilitando a obtenção de suporte e aprendizado contínuo.&lt;/li&gt;
&lt;li&gt;Linguagem Unificada: Você pode escrever tudo com Javascript, sem a necessidade de ter a curva de aprendizado de utilizar outra linguagem em alguma tecnologia do acrônimo.&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Desvantagens de Estudar a Stack MERN
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;Curva de Aprendizado: Cada tecnologia possui sua própria curva de aprendizado, o que pode ser desafiador para desenvolvedores iniciantes.&lt;/li&gt;
&lt;li&gt;Complexidade: A integração de quatro tecnologias diferentes pode aumentar a complexidade do desenvolvimento e da depuração.&lt;/li&gt;
&lt;li&gt;Tecnologias em Evolução: As tecnologias podem evoluir rapidamente, exigindo que os desenvolvedores estejam atualizados constantemente.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Apontando aqui os prós e contras dessa Stack que achei, vou dar um exemplo prático de caso de uso de como utilizar ela em um projeto real.&lt;/p&gt;

&lt;h2&gt;
  
  
  Utilizando a Stack MERN em um projeto real
&lt;/h2&gt;

&lt;p&gt;Para este artigo, vou dar um exemplo simples de uma aplicação real, que será uma espécie de To Do List, onde o usuário consegue adicionar suas tarefas(To Do) e também atualizar caso tenha necessidade e posteriormente excluí-las, esses To Dos então são mandados para nossa API onde persistirá no nosso banco de Dados em questão.&lt;/p&gt;

&lt;h4&gt;
  
  
  Front-end da Aplicação
&lt;/h4&gt;

&lt;p&gt;Vamos começar criando nossa aplicação no front-end, do lado do cliente utilizando do React, para isso execute o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npx create-react-app todo_list — template typescript&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após isso vamos utilizar de algumas libs que vão facilitar a criação do nosso projeto como o &lt;a href="https://axios-http.com/" rel="noopener noreferrer"&gt;Axios&lt;/a&gt;, na hora de fazer nossa chamada a nossa API, e para estilizar eu não vou focar muito nisso, então optei por utilizar os componentes já prontos do &lt;a href="https://mui.com/" rel="noopener noreferrer"&gt;MaterialUI&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install @mui/material axios @mui/icons-material — save&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Optei por usar o &lt;a href="https://create-react-app.dev/" rel="noopener noreferrer"&gt;CRA&lt;/a&gt; afins de já vi os recursos prontos para startar nossa aplicação, porém vamos refatorar, já que tem muita coisa que não vamos usar nela, e deixar somente o que importa, ao fim de tudo isso a estrutura do seu projeto ficará algo assim.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gcw58xcv6815gekdnp1.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9gcw58xcv6815gekdnp1.png" alt="Arquitetura React front-end"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como estou utilizando o &lt;a href="https://www.typescriptlang.org/" rel="noopener noreferrer"&gt;TypeScript&lt;/a&gt; no projeto, tive que criar uma pasta chamada types para poder tipar manualmente a biblioteca de icons do material que até o momento deste artigo não estava tipada nativamente, então é só criar uma pasta com o nome de &lt;em&gt;types&lt;/em&gt; dentro de &lt;em&gt;src&lt;/em&gt;, e dentro dela crie um arquivo chamado &lt;em&gt;mui-icons-material.d.ts&lt;/em&gt; e adicione o seguinte trecho.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="kr"&gt;declare&lt;/span&gt; &lt;span class="kr"&gt;module&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/icons-material/Delete&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;SvgIconProps&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;@mui/material/SvgIcon&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;DeleteIcon&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="nx"&gt;SvgIconProps&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;JSX&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;Element&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;DeleteIcon&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;Feito isso, o TypeScript vai parar de dar erro de tipagens, futuramente ao chamar essa lib no código.&lt;/p&gt;

&lt;p&gt;Antes mesmo de criar nosso back-end utilizando das outras tecnologias da stack MERN, vamos já deixar nosso front-end preparado, para isso crie uma pasta chamada &lt;em&gt;server&lt;/em&gt; no &lt;em&gt;src&lt;/em&gt; da aplicação, e dentro dela crie um arquivo chamado &lt;em&gt;api.tsx&lt;/em&gt;, dentro desse arquivo você fará a seguinte chamada a nossa API, para nossas rotas via Axios.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;AxiosResponse&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;axios&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;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;http://localhost:3001/toDos&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;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;axios&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;baseURL&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;baseUrl&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;ToDo&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchToDos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ToDo&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;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;response&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;AxiosResponse&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ToDo&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;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&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;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;data&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error fetching toDos:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;addToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;task&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error adding toDo:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toggleToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;
&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error toggling toDo:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;deleteToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error deleting toDo:&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="k"&gt;throw&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Feito isto nossas futuras rotas já estará tudo configurada, chamadas via Axios na nossa aplicação e exportado todos os métodos do nosso CRUD, vamos agora importar ele no nosso arquivo principal &lt;em&gt;App&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;useEffect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;Container&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;TextField&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Button&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ListItem&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;ListItemText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;Checkbox&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;IconButton&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mui/material&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;DeleteIcon&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;@mui/icons-material/Delete&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;ToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;fetchToDos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;addToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;toggleToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="nx"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./server/api&lt;/span&gt;&lt;span class="dl"&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;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;toDos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setToDos&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ToDo&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;([]);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;toDoText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setToDoText&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="nf"&gt;useEffect&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="nf"&gt;loadToDos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="p"&gt;[]);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;loadToDos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;fetchedToDos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;fetchToDos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="nf"&gt;setToDos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;fetchedToDos&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;handleAddToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &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="k"&gt;if &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoText&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;addToDo&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;toDoText&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;false&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="nf"&gt;setToDoText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;loadToDos&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;handleToggleToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;toggleToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;loadToDos&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;handleDeleteToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nf"&gt;loadToDos&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;Container&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;h1&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="nx"&gt;To&lt;/span&gt; &lt;span class="nx"&gt;Do&lt;/span&gt; &lt;span class="nx"&gt;List&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="sr"&gt;/h1&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;TextField&lt;/span&gt;
        &lt;span class="nx"&gt;label&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Adicionar To Do&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;outlined&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;
        &lt;span class="nx"&gt;fullWidth&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="nx"&gt;toDoText&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
        &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;setToDoText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&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="sr"&gt;/&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;variant&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;contained&lt;/span&gt;&lt;span class="dl"&gt;"&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;handleAddToDo&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;Adicionar&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="nx"&gt;List&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;toDos&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;toDo&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ListItem&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="nx"&gt;toDo&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="o"&gt;&amp;gt;&lt;/span&gt;
            &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;Checkbox&lt;/span&gt;
              &lt;span class="nx"&gt;checked&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
              &lt;span class="nx"&gt;onChange&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleToggleToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDo&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;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;completed&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;ListItemText&lt;/span&gt; &lt;span class="nx"&gt;primary&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;text&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="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;IconButton&lt;/span&gt; &lt;span class="nx"&gt;onClick&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;handleDeleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDo&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="o"&gt;&amp;gt;&lt;/span&gt;
              &lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;DeleteIcon&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="sr"&gt;/IconButton&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;/ListItem&lt;/span&gt;&lt;span class="err"&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;/List&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;/Container&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;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pronto nosso front-end está finalizado por hora, dessa maneira você já consegue ver algo como o exemplo abaixo, porém ainda não tem como adicionar, pois as rotas ainda não foram criadas no nosso back-end, então vamos criá-las agora.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab8a2ipl6f4lnxgl078y.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fab8a2ipl6f4lnxgl078y.png" alt="Aplicação TO DO front-end"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  Back-end da Aplicação
&lt;/h4&gt;

&lt;p&gt;Para criar nosso back-end em NodeJS e Express.js vamos fazer o seguinte. Primeiro crie uma pasta chamada &lt;em&gt;todo_list_api&lt;/em&gt; e dentro dessa pasta rode o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm init -y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso irá criar nossa configuração do &lt;a href="https://docs.npmjs.com/cli/v9/configuring-npm/package-json" rel="noopener noreferrer"&gt;package.json&lt;/a&gt;, após isso rode o seguinte comando para instalar o express.js e o &lt;a href="https://mongoosejs.com/" rel="noopener noreferrer"&gt;mongoose&lt;/a&gt;, que é uma biblioteca de modelagem de objetos para Node.js, projetada para trabalhar com o MongoDB, isso vai facilitar em muito na hora de montar nossos schemas.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install express mongoose&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Após isso também vamos instalar e configurar o TypeScript para trabalhar com ele.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install typescript@latest — save-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Esse comando vai instalar a versão mais atual do TypeScript até o momento, após isso é necessário ainda passar as configurações para o compilador do TypeScript, para isso crie um arquivo na raiz do projeto chamado &lt;em&gt;tsconfig.json&lt;/em&gt;, e dentro dele cole o seguinte trecho de código, basicamente isto são algumas configurações básicas para utilizar o TypeScript no nosso projeto, existem muitas outras do que somente estas, por hora vão bastar somente elas.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;compilerOptions&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="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;target&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;ES2018&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;module&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;commonjs&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;outDir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./dist&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;rootDir&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./src&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;strict&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;esModuleInterop&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vamos precisar também dessa lib instalada no nosso código.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install — save-dev ts-node&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;O &lt;a href="https://typestrong.org/ts-node/" rel="noopener noreferrer"&gt;ts-node&lt;/a&gt; é uma ferramenta que permite executar arquivos TypeScript diretamente no Node.js sem a necessidade de compilação prévia.&lt;/p&gt;

&lt;p&gt;Pode ser que alguma lib que você venha instalar necessite de seu &lt;em&gt;@types&lt;/em&gt; por conta do TypeScript, então é só procurar na web ou na própria doc da documentação em questão, que você acha para instalar, caso necessite dependendo da versão usada.&lt;/p&gt;

&lt;p&gt;Vamos já adiantar também e instalar outra biblioteca para salvar nossas variáveis de ambiente, na hora de fazer a chamada ao MongoDB Atlas, não ficar exposto no código nosso login e senha, já que isso seria uma falha crítica de segurança, para isso vamos utilizar essa lib chamada, &lt;a href="https://www.npmjs.com/package/dotenv" rel="noopener noreferrer"&gt;dotenv&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install dotenv&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Feito isso vamos criar um arquivo na nossa raiz do nosso projeto chamado &lt;em&gt;.env&lt;/em&gt;, a princípio pode deixá-lo vazio, que será lá que ficarão nossas variáveis de ambiente, onde quando for subir essas informações para algum repositório lembre-se de criar um arquivo chamado, &lt;em&gt;&lt;a href="https://git-scm.com/docs/gitignore" rel="noopener noreferrer"&gt;.gitignore&lt;/a&gt;&lt;/em&gt; e colocar para ignorar esse .env, por default já vem, porém, sempre é bom olhar isso.&lt;/p&gt;

&lt;p&gt;Após isso feito vamos criar a nossa estrutura de pastas, para trabalhar mais organizado na nossa API, no meu caso eu estou usando um padrão de Arquitetura em Camadas. Nesse padrão, o código é organizado em diferentes camadas, cada uma com uma responsabilidade específica. As camadas mais comuns e que vamos usar nesse exemplo são o Model, Controller, Repository e Service, breve vou criar um artigo explicando o porquê desse padrão é o que cada um faz por boas práticas, mas para não se alongar muito apenas siga essa estrutura por hora, para darmos prosseguimento ao projeto.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffd8go3cwijfh9q4bxhj7.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffd8go3cwijfh9q4bxhj7.png" alt="Arquitetura Nodejs back-end"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu criei toda nossa estrutura que vamos precisar nesse exemplo acima, com seus respectivos arquivos vazio até o momento e que vamos começar a codificar, como pode ser visto a maioria das pastas tem um arquivo &lt;em&gt;index.ts&lt;/em&gt;, isso costuma ser uma boa prática, pois na hora de fazer o import, por padrão o compilador sempre busca pelo valor index por default, caso contrário teria que especificar o nome do arquivo dentro da pasta, na hora do import.&lt;/p&gt;

&lt;p&gt;Vamos começar agora modelar os nossos dados da nossa aplicação, para isso vamos criar nosso modelo, lá no nosso model e já vamos preparar nosso schema através do mongoose para falar o que vai ser mandado para o MongoDB.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Document&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="kr"&gt;interface&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="nx"&gt;Document&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nl"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nl"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;boolean&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;toDoSchema&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Schema&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;Schema&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
  &lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="na"&gt;completed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Boolean&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;required&lt;/span&gt;&lt;span class="p"&gt;:&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="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;model&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toDoSchema&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Feito isto, já tendo o nosso modelo criado, vamos agora criar a nossa conexão com o nosso banco de dados, que no nosso caso eu vou utilizar o &lt;a href="https://www.mongodb.com/cloud/atlas/register" rel="noopener noreferrer"&gt;Mongo Atlas&lt;/a&gt; que é a solução projetada para hospedar e operar bancos de dados MongoDB na nuvem.&lt;/p&gt;

&lt;p&gt;Para isso você tem que ter uma conta no site do &lt;a href="https://account.mongodb.com/account/login" rel="noopener noreferrer"&gt;MongoDB&lt;/a&gt;, para poder criar um Cluster no Mongo Atlas.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folf36pjwjmpkaylfd2wc.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Folf36pjwjmpkaylfd2wc.png" alt="novo projeto mongo atlas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você terá que criar um projeto para trabalhar, é só clicar no botão &lt;em&gt;New Project&lt;/em&gt;, você vai inserir o nome do seu projeto e logo em seguida, ele vai pedir para você adicionar outros e-mails caso tenha mais alguém no projeto com você, no nosso caso só ir em next, já que o seu e-mail cadastrado na sua conta já será o Owner do projeto por default.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ux487kuvq7zihbnlf8k.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8ux487kuvq7zihbnlf8k.png" alt="novo database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui é a parte crucial, é onde você vai criar seu cluster, se atente algumas informações, na hora de definir o nome lembre-se que ele não poderá mais ser alterado, então escolha com sabedoria no nosso caso, vamos usar toDoList, o fornecedor eu deixei a AWS mesmo, mas fica a seu critério e a região, é outro ponto importante eu recomendo colocar sempre a região, mas próxima de você no meu caso eu coloquei o Brasil, escolhi também a versão gratuita e depois disso só clicar em &lt;em&gt;create&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa8wkoqtdydpxl545n86.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ffa8wkoqtdydpxl545n86.png" alt="create DB"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isto, você será redirecionado para essa página onde será necessário criar seu usuário com sua chave única.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepy9girrelrn31e19y8y.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fepy9girrelrn31e19y8y.png" alt="criando usuario e senha para o mongo Atlas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso será necessário colocar seu IP para conectar a seu cluster, basta clicar no botão &lt;em&gt;Add My Current IP Address&lt;/em&gt;, que ele vai adicionar seu IP atual a lista de permitidos para acessar seu cluster.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fito8ugr0p9ck8l5nq7pb.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fito8ugr0p9ck8l5nq7pb.png" alt="Adicionando seu IP ao cluster"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Feito isto, parabéns, você já tem seu cluster criado para conectar a sua API.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfj8bxgyvgbuh47iowhq.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fxfj8bxgyvgbuh47iowhq.png" alt="overview database"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas para isso agora vamos precisar de alguns dados que serão adicionados a nossas variáveis de ambiente, para conectar com o Mongo Atlas. Ao clicar em &lt;em&gt;connect&lt;/em&gt; irá abrir essas opçõ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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce39xf54ck0iuwsrqntd.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fce39xf54ck0iuwsrqntd.png" alt="connect Mongo Atlas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você irá selecionar a opção &lt;em&gt;Drivers&lt;/em&gt; e irá abrir essa nova janela.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcno4px48xjb62cvwku90.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcno4px48xjb62cvwku90.png" alt="connect Mongo Atlas com a API"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesta janela você irá copiar toda essa linha que está selecionada na imagem, lembre-se isso são os dados sensíveis da sua aplicação, por isso eu deixei oculto aqui, e você vai substituir o password pela senha que você criou, la para seu usuário acessar seu cluster, tudo isso irá ficar em suas variáveis de ambientes, eu vou estar amostrando como eu fiz aqui com minhas variáveis de ambientes, é só replicar modificando com as suas próprias variáveis do seu banco.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fesukatqe5pzwjveto8ml.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fesukatqe5pzwjveto8ml.png" alt="variaveis de ambiente"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Seu arquivo .env, deve ficar desse jeito e agora no nosso arquivo &lt;em&gt;db&lt;/em&gt; iremos fazer a nossa conexão com o Mongo Atlas criado.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;mongoose&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;config&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;dotenvConfig&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;dotenv&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nf"&gt;dotenvConfig&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;async&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nf"&gt;connect&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;baseUrl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`mongodb+srv://&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_USER&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;:&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_PASSWORD&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;@&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_CLUSTER_URL&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;MONGODB_DATABASE&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="na"&gt;options&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;any&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
    &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;useNewUrlParser&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;useUnifiedTopology&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;mongoose&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;baseUrl&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;MongoDB connected sucess&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;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;error&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feito isto, já temos a nossa chamada com o nosso banco de Dados criado, a partir do nosso método &lt;em&gt;connect&lt;/em&gt;, que será chamado posteriormente no nosso &lt;em&gt;server&lt;/em&gt;, para conectar nosso banco de dados com nossa aplicação.&lt;/p&gt;

&lt;p&gt;Agora vamos criar nosso &lt;em&gt;repository&lt;/em&gt;, que é responsável por lidar com a camada de acesso a dados. Ele fornece uma abstração sobre como os dados são armazenados e recuperados. O principal objetivo é isolar o restante do código da lógica específica do armazenamento, tornando mais fácil a troca ou atualização do mecanismo de armazenamento sem afetar o restante do sistema, para isso vamos criar nosso CRUD básico aqui dividido nos nossos métodos de buscar, criar, atualizar e deletar um toDo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="nx"&gt;toDoModel&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../model/toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ToDoRepository&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDoModel&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;find&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDoModel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDoModel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;updateToDoData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDoModel&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDoModel&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findByIdAndUpdate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;new&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;findByIdAndDelete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ToDoRepository&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Criei uma classe com os métodos do CRUD e por fim exportei uma instância da classe para ser usada no meu &lt;em&gt;service&lt;/em&gt; que vou criar agora, poderia também ter usado de outro paradigma como o funcional, porém optei nesse projeto utilizar do paradigma de classes, seguindo, vamos criar agora nosso service.&lt;/p&gt;

&lt;p&gt;No nosso service, ele é onde a lógica de negócios da aplicação é implementada, nele que vamos chamar os nossos métodos criados no nosso repository.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;toDoRepository&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../repository&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toDo&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../model/toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ToDoService&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&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="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDoRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDoRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;updateToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="nx"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;Partial&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nx"&gt;toDo&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDoRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateToDoData&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;updateData&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kr"&gt;string&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;toDoRepository&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ToDoService&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Após isso, já com nosso &lt;em&gt;repository&lt;/em&gt; e &lt;em&gt;service&lt;/em&gt; criados e a vez de criarmos nosso &lt;em&gt;controller&lt;/em&gt; que será responsável, como intermediário entre as solicitações do usuário e o restante do sistema. Ele que vai receber as solicitações, processar os dados necessários, interagir com os serviços apropriados e decidir qual visão (ou saída) deve ser apresentada ao usuário. Para isso vamos criar nosso CRUD básico aqui agora, da seguinte maneira.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;toDoService&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../service&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ToDoController&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;try&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;toDos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;toDoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error fetching toDos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&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;newToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;toDoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;text&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;201&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;newToDo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error creating toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;updateToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toDoId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;body&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&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;updatedToDo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;toDoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;updateToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;completed&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;updatedToDo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error updating toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;

  &lt;span class="k"&gt;async&lt;/span&gt; &lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Request&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;Response&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt; &lt;span class="nb"&gt;Promise&lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="k"&gt;void&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;toDoId&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;params&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

    &lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;toDoService&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;deleteToDo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;204&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;status&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;500&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;error&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Error deleting toDo&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;});&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="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="k"&gt;new&lt;/span&gt; &lt;span class="nc"&gt;ToDoController&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Para deixar mais organizado eu utilizei alguns &lt;em&gt;status code http&lt;/em&gt;, para que o nosso front consiga tratar essas informações.&lt;/p&gt;

&lt;p&gt;Agora para organizar melhor nossa aplicação, vamos criar nosso arquivo de &lt;em&gt;routes&lt;/em&gt;, onde ficarão nossas chamadas do nosso controller.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;toDoController&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;../controller&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;router&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;Router&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/toDos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toDoController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;getAllToDos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;post&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/toDos&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toDoController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createToDo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;put&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/toDos/:toDoId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toDoController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;updateToDo&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;router&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;delete&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;/toDos/:toDoId&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;toDoController&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;deleteToDo&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;router&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Desse jeito, utilizando do Express.js do MERN, podemos criar um roteador chamado &lt;em&gt;router&lt;/em&gt; usando &lt;code&gt;express.Router()&lt;/code&gt;. Um roteador permite definir as rotas separadamente para modularizar o código e organizar as diferentes partes da aplicação.&lt;/p&gt;

&lt;p&gt;Agora precisamos criar nosso &lt;em&gt;server&lt;/em&gt;, que será nosso endpoint de nossa aplicação para chamar nossa porta e rodar ela.&lt;/p&gt;

&lt;p&gt;Mas antes disso vamos instalar duas ultimas biblioteca para facilitar nossa vida, primeiro vamos instalar essa.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install cors&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Isso vai resolver possíveis dores de cabeça no futuro, o pacote &lt;em&gt;cors&lt;/em&gt; serve para lidar com políticas de mesma origem (Same-Origin Policy) em navegadores e permite que um servidor conceda permissão para que recursos em um determinado domínio sejam acessados de outro domínio. Isso é particularmente útil quando você está construindo APIs que serão acessadas por diferentes origens. Certifique-se de configurá-lo adequadamente para suas necessidades de segurança e autenticação, no nosso caso esta configuração já vai resolver.&lt;/p&gt;

&lt;p&gt;Logo após vamos instalar essa aqui.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install -g nodemon&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;A opção &lt;em&gt;-g&lt;/em&gt; indica que você está instalando o pacote globalmente no seu sistema, o que significa que o &lt;em&gt;nodemon&lt;/em&gt; ficará disponível para uso em qualquer projeto, em qualquer pasta.&lt;/p&gt;

&lt;p&gt;O &lt;em&gt;nodemon&lt;/em&gt; é uma ferramenta que ajuda a desenvolver aplicativos com o Node.js reiniciando automaticamente o servidor toda vez que um arquivo do projeto é modificado. Isso é especialmente útil durante o desenvolvimento, pois permite que você veja as alterações imediatamente, sem precisar reiniciar o servidor manualmente a cada vez.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight typescript"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;express&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;express&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;cors&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;cors&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;connect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./config/db&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;toDoRoutes&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./routes&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;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;express&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;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;3001&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;cors&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;
&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;express&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;json&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt;

&lt;span class="nf"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;use&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;toDoRoutes&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;listen&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`Server is running on port &lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;PORT&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;});&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Por último, não esqueça de alterar o endpoint, no seu &lt;em&gt;package.json&lt;/em&gt; no &lt;em&gt;main&lt;/em&gt; que vem por padrão &lt;em&gt;index.js&lt;/em&gt; para no nosso caso &lt;em&gt;server.ts&lt;/em&gt; e adicione esse comando ao nosso package.json nos seus scripts:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;“start”: “nodemon src/server.ts”&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;E após isso execute esse comando para rodar nossa API.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm start&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Se você seguiu todo esse tutorial, sua API já vai estar rodando e conectada ao seu banco de dados deste jeito.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2dlmxm4cxtj4p5ntw8n.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fb2dlmxm4cxtj4p5ntw8n.png" alt="API rodando"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora vamos voltar na nossa aplicação no front-end que deixamos rodando e vamos testar nossas funcionalidades.&lt;/p&gt;

&lt;p&gt;Se você seguiu tudo até aqui, creio eu que esteja funcionando perfeitamente, basta deixar tanto o servidor da API ligado e deixar sua aplicação rodando na porta 3000, e você vai ver algo como isso, já sendo possível adicionar e excluir seus toDos.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9f0zoty0qj7evpo033r.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fa9f0zoty0qj7evpo033r.png" alt="Aplicação Finalizada"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E você também pode ver seus toDos salvos no seu banco de dados lá no Mongo Atlas deste jeito.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tedvctaay00a6tmzhkh.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2tedvctaay00a6tmzhkh.png" alt="RO DOs salvos no Mongo Atlas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Pronto, feito isto já temos uma aplicação totalmente funcional full-stack construído com base na stack MERN, utilizando de todas as tecnologias do acrônimo.&lt;/p&gt;

&lt;p&gt;Eu não foquei em estilização, ou nem na parte de segurança da nossa API, como também não foquei nos testes, apenas testei na minha máquina por um cliente como o &lt;a href="https://www.postman.com/" rel="noopener noreferrer"&gt;Postman&lt;/a&gt; para vê se todas as rotas estavam funcionando normalmente, acho que isso é assunto para outro artigo, mas sinta-se livres para usar esse exemplo como base de algum projeto e publicar em seus portifólios, pode, por exemplo, evoluir deixar a API modularizada com login e cada usuário ter seus próprios toDos salvos no banco separado, enfim ideias é o que não faltam para continuar essa aplicação.&lt;/p&gt;

&lt;p&gt;Em outro artigo futuro irei amostrar como fazer o deploy de sua aplicação back-end, ao invés de ter que utilizar em seu localhost, toda vez ligando seu servidor.&lt;/p&gt;

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

&lt;p&gt;A Stack MERN oferece um ambiente robusto para o desenvolvimento de aplicações web modernas e escaláveis. Ela combina a flexibilidade do MongoDB, a agilidade do Express.js, a interatividade do React e a eficiência do Node.js. Enquanto apresenta desafios de aprendizado e complexidade, os benefícios da MERN Stack são evidentes em projetos que exigem interfaces dinâmicas, escalabilidade e desenvolvimento ágil. Ao estudar essa stack, os desenvolvedores estarão bem equipados para enfrentar os desafios e demandas do desenvolvimento web, projetando uma aplicação de ponta a ponta, desde o front-end até o back-end do seu negócio, logicamente cada projeto tem sua especificação e não pode ser uma bala de prata de sempre utilizá-la para tudo, visto seus prós e contras, fica a seu critério de estudá-la ou utilizá-la em seus projetos.&lt;/p&gt;

</description>
      <category>mongodb</category>
      <category>express</category>
      <category>react</category>
      <category>node</category>
    </item>
    <item>
      <title>Do Conceito à Implementação: Criando e Utilizando Hooks Personalizados no React</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Fri, 18 Aug 2023 13:08:55 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/do-conceito-a-implementacao-criando-e-utilizando-hooks-personalizados-no-react-4gah</link>
      <guid>https://forem.com/hmontarroyos/do-conceito-a-implementacao-criando-e-utilizando-hooks-personalizados-no-react-4gah</guid>
      <description>&lt;p&gt;&lt;em&gt;Além de useState e useEffect: Desenvolva seus próprios Hooks, que Melhoram a Produtividade e a Qualidade do Código.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O React é uma biblioteca JavaScript amplamente utilizada para a criação de interfaces de usuário interativas e reativas. Uma das características mais marcantes do React é a introdução dos Hooks, que revolucionaram a forma como os componentes funcionais são construídos e gerenciados. Neste artigo, exploraremos o que são os Hooks, porque eles são importantes, como criar seus próprios Hooks personalizados e como utilizá-los para melhorar a experiência de desenvolvimento.&lt;/p&gt;

&lt;h2&gt;
  
  
  O que são Hooks no React?
&lt;/h2&gt;

&lt;p&gt;Os Hooks ou numa tradução literal ganchos, são funções especiais que permitem que você ligue recursos de estado e comportamento aos componentes funcionais do React. Antes da introdução dos Hooks, a criação de componentes que possuíam estado e ciclo de vida complexos era mais comumente realizada através de componentes de classe, como o componentDidMount() por exemplo. No entanto, com a adoção de Hooks, é possível escrever componentes funcionais mais legíveis, reutilizáveis e fáceis de testar.&lt;/p&gt;

&lt;p&gt;Existem diversos hooks integrados nativamente no react, eu não vou prolongar muito o assunto, pois pretendo trazer um artigo somente para isso, mas posso citar brevemente alguns como o useState, useEffect, useContext entre outros que breve irei trazer uma review de como usá-los e o que cada um faz.&lt;/p&gt;

&lt;p&gt;O foco aqui deste artigo e falar um pouco sobre os hooks e ensinar como criar seus próprios hooks personalizáveis no react. Vou citar também, pelo meu ponto de vista, suas vantagens e desvantagens de criar seus próprios hooks.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens dos Hooks
&lt;/h2&gt;

&lt;h4&gt;
  
  
  1. Maior Legibilidade
&lt;/h4&gt;

&lt;p&gt;Os Hooks permitem que você divida a lógica do componente em unidades menores e específicas, tornando o código mais legível e fácil de compreender.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Reutilização de Lógica
&lt;/h4&gt;

&lt;p&gt;Você pode criar Hooks personalizados para encapsular lógica específica e reutilizá-los em diversos componentes, promovendo a modularidade e evitando repetição de código.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Facilidade de Teste
&lt;/h4&gt;

&lt;p&gt;Os componentes funcionais com Hooks são mais simples de testar, uma vez que a lógica está desacoplada em unidades menores e as dependências podem ser injetadas facilmente.&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Melhoria na Performance
&lt;/h4&gt;

&lt;p&gt;O React otimiza automaticamente a renderização de componentes com base nas dependências dos Hooks, resultando em melhorias de performance.&lt;/p&gt;

&lt;h2&gt;
  
  
  Possíveis Desvantagens
&lt;/h2&gt;

&lt;p&gt;Embora os Hooks ofereçam muitas vantagens, é importante estar ciente de suas possíveis desvantagens:&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Curva de Aprendizado
&lt;/h4&gt;

&lt;p&gt;A transição de componentes de classe para componentes funcionais com Hooks pode exigir uma curva de aprendizado para desenvolvedores que não estão familiarizados com essa abordagem.&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Abstração Excessiva
&lt;/h4&gt;

&lt;p&gt;Em alguns casos, a abstração da lógica em Hooks personalizados pode tornar o código mais complexo e difícil de entender, se não for feita de maneira cuidadosa.&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Performance Pobre em Casos Extremos
&lt;/h4&gt;

&lt;p&gt;Embora a maioria das aplicações se beneficie da otimização automática dos Hooks, casos extremos podem levar a problemas de performance se os Hooks não forem utilizados de forma adequada.&lt;/p&gt;

&lt;p&gt;Dito isso, apontei algumas possíveis vantagens no meu ponto de vista e desvantagens, sinta-se livre para concordar ou discordar dos pontos aqui citados, vamos agora para como criar seus hooks e por que criá-los.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando Seus Próprios Hooks Personalizados
&lt;/h2&gt;

&lt;p&gt;A criação de Hooks personalizados é uma prática poderosa que permite encapsular lógica e funcionalidade específicas para seu aplicativo.&lt;/p&gt;

&lt;p&gt;Vamos criar primeiramente dentro de nosso projeto React, uma pasta chamada &lt;strong&gt;“hooks”&lt;/strong&gt;, é uma boa convenção utilizar desse nome, mas não chega a ser um requisito.&lt;/p&gt;

&lt;p&gt;Assim como também é uma boa prática começar ao dar o nome para seu hook de chamar de &lt;strong&gt;“use”&lt;/strong&gt;, como exemplo os nativos do próprio react, useRef, etc.&lt;/p&gt;

&lt;p&gt;No nosso caso, eu vou criar um hook personalizado de exemplo para um site de advogados. Neste cenário, um advogado pode precisar rastrear o tempo gasto em diferentes casos e atividades.&lt;/p&gt;

&lt;p&gt;Vamos criar um Hook chamado &lt;code&gt;useTimeTracker&lt;/code&gt; que permite ao advogado registrar o tempo gasto em uma atividade específica.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--CCvwhDL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jul37o6bjqyqy1emk81g.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--CCvwhDL4--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/jul37o6bjqyqy1emk81g.png" alt="Pasta hooks criada juntamente com seu arquivo onde ficara seu hook" width="489" height="130"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No componente &lt;code&gt;useTimeTracker&lt;/code&gt; vamos fazer o seguinte:&lt;br&gt;
&lt;/p&gt;

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

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;useTimeTracker&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;timeEntries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setTimeEntries&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useState&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;addTimeEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;newEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="na"&gt;timestamp&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nb"&gt;Date&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;toISOString&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;
    &lt;span class="p"&gt;};&lt;/span&gt;
    &lt;span class="nx"&gt;setTimeEntries&lt;/span&gt;&lt;span class="p"&gt;([...&lt;/span&gt;&lt;span class="nx"&gt;timeEntries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;newEntry&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="nx"&gt;timeEntries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addTimeEntry&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;useTimeTracker&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora, vamos considerar como um componente de um site de advogados poderia utilizar esse Hook personalizado, para isso vamos criar dentro da nossa pasta de componentes o arquivo &lt;code&gt;TimeTrackingComponent&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;React&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;react&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;useTimeTracker&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;../hooks/useTimeTracker&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;TimeTrackingComponent&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;timeEntries&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;addTimeEntry&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;useTimeTracker&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setActivity&lt;/span&gt;&lt;span class="p"&gt;]&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="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;setHours&lt;/span&gt;&lt;span class="p"&gt;]&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="nx"&gt;useState&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;

  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;handleAddTimeEntry&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
      &lt;span class="nx"&gt;addTimeEntry&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;parseFloat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
      &lt;span class="nx"&gt;setActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
      &lt;span class="nx"&gt;setHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;''&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
  &lt;span class="p"&gt;};&lt;/span&gt;

  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Registro de Tempo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h2&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"text"&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Atividade"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;setActivity&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&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="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;input&lt;/span&gt;
          &lt;span class="na"&gt;type&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"number"&lt;/span&gt;
          &lt;span class="na"&gt;placeholder&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;"Horas"&lt;/span&gt;
          &lt;span class="na"&gt;value&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
          &lt;span class="na"&gt;onChange&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&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;setHours&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;target&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="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt; &lt;span class="na"&gt;onClick&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;handleAddTimeEntry&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Registrar Tempo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;button&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;Registros de Tempo&lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;h3&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;timeEntries&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;map&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;index&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="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="na"&gt;key&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;index&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
              Atividade: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;activity&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;, Horas: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;hours&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;, Data: &lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="nx"&gt;entry&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;timestamp&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
            &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;li&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
          &lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;
        &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
      &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="nt"&gt;div&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;TimeTrackingComponent&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;E no nosso App, vamos chamar esse componente, da seguinte maneira:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight jsx"&gt;&lt;code&gt;&lt;span class="k"&gt;import&lt;/span&gt; &lt;span class="nx"&gt;TimeTrackingComponent&lt;/span&gt; &lt;span class="k"&gt;from&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;./components/TimeTrackingComponent&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;


&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;TimeTrackingComponent&lt;/span&gt;&lt;span class="p"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;export&lt;/span&gt; &lt;span class="k"&gt;default&lt;/span&gt; &lt;span class="nx"&gt;App&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

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

&lt;/div&gt;



&lt;p&gt;Neste exemplo, o Hook &lt;code&gt;useTimeTracker&lt;/code&gt; encapsula a lógica de registro de tempo e gerenciamento de entradas. O componente &lt;code&gt;TimeTrackingComponent&lt;/code&gt; utiliza esse Hook para permitir que o advogado registre suas atividades e as horas gastas em cada atividade. Isso proporciona um código mais limpo e reutilizável, além de uma experiência mais intuitiva para o usuário.&lt;/p&gt;

&lt;p&gt;O uso de Hooks personalizados permite que a lógica de negócios seja separada dos componentes de apresentação, facilitando a manutenção, o teste e a reutilização do código. No contexto de um site de advogados, o Hook &lt;code&gt;useTimeTracker&lt;/code&gt; poderia ser estendido para incluir recursos adicionais, como a categorização das atividades, a geração de relatórios de tempo, entre outros.&lt;/p&gt;

&lt;p&gt;Esse código poderia ficar melhor refatorado utilizando de outras abordagens e até estilizado, porém como esse não é o foco, resolvi focar somente na criação e explicação dos hooks, fazendo tudo do modo que coloquei aqui, você terá algo assim sendo renderizado em sua tela.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ue1ifgzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5e0hqsstey85ta5ak02x.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ue1ifgzj--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/5e0hqsstey85ta5ak02x.png" alt="Componente TimeTrackingComponent " width="800" height="267"&gt;&lt;/a&gt;&lt;/p&gt;

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

&lt;p&gt;Os Hooks no React trouxeram uma nova maneira de desenvolver componentes funcionais poderosos e reutilizáveis. Eles melhoram a legibilidade, a reutilização de lógica e a facilidade de teste dos componentes, além de promover uma experiência de desenvolvimento mais moderna e eficiente. Criar seus próprios Hooks personalizados é uma prática recomendada para encapsular lógica específica e promover a modularidade em seu código. No entanto, é importante pesar as vantagens e desvantagens para escolher a abordagem certa para cada situação.&lt;/p&gt;

&lt;p&gt;Lembre-se de que, como qualquer ferramenta, os Hooks devem ser usados com sabedoria e discernimento para garantir que seu código seja limpo, eficiente e fácil de manter.&lt;/p&gt;

&lt;p&gt;Além de não ter a questão se é ou não melhor que componentes de classes, apenas outra abordagem de se trabalhar, breve também pretendo trazer um artigo falando um pouco da abordagem de Classes no React, no mais é isso e aproveitem e utilizem bastante como bem desejar em seus códigos.&lt;/p&gt;

</description>
      <category>react</category>
      <category>hooks</category>
      <category>state</category>
      <category>functional</category>
    </item>
    <item>
      <title>Como contribuir com projeto open source e apoiar a comunidade</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Thu, 10 Aug 2023 13:29:31 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/como-contribuir-com-projeto-open-source-e-apoiar-a-comunidade-5g7a</link>
      <guid>https://forem.com/hmontarroyos/como-contribuir-com-projeto-open-source-e-apoiar-a-comunidade-5g7a</guid>
      <description>&lt;p&gt;&lt;em&gt;Navegando no Universo Open Source do GitHub, Do Fork ao Merge&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Em um mundo cada vez mais conectado e orientado pela colaboração, contribuir para projeto open source no GitHub se tornou uma maneira empolgante e acessível de participar ativamente do desenvolvimento de software. E para quem está se perguntando o que é Open Source?&lt;/p&gt;

&lt;p&gt;Eu lhe respondo com o seguinte, os sistemas de Código Aberto(Open Source) são repositórios que fornecem acesso ao código-fonte, permitindo que membros da comunidade contribuam, mantenham, corrijam, criem variações e compartilhem, com a condição de que suas modificações também permaneçam acessíveis como código aberto.&lt;/p&gt;

&lt;p&gt;Neste artigo eu vou trazer o básico de como colaborar com algum projeto open source, com um exemplo de um projeto que colaborei, além de após ter feito o fork do projeto sempre deixar ele atualizado para novas atualizações dá master principal do projeto em questão.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Escolha o projeto que ira contribuir, e faça um fork dele
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2hzdlxl043yk46bwybz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fs2hzdlxl043yk46bwybz.png" alt="fork_project"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Eu vou dar um exemplo prático de um repositório que colaborei recentemente que é um repo, onde cataloga uma, variedades de recursos do front end como uma espécie de enciclopédia, seja libs, linguagens, termos entre outros, vou deixar aqui os devidos créditos ao &lt;a href="https://github.com/paradite" rel="noopener noreferrer"&gt;Zhu Liang&lt;/a&gt;, dono do repositório e também deixo o &lt;a href="https://github.com/paradite/frontend-encyclopedia" rel="noopener noreferrer"&gt;link&lt;/a&gt; dele, caso vocês queriam colaborar, acho super valido.&lt;/p&gt;

&lt;p&gt;Não esquece de deixar a estrela no repositório escolhido, que isso ajuda bastante como apoio para o criador ;)&lt;/p&gt;

&lt;p&gt;Após você escolher qual projeto open source irá colaborar, é só fazer o fork dele e você será levado para outra tela de confirmação, onde ele irá fazer uma cópia desse repositório para os seus repositórios onde você poderá agora trabalhar nele.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn96w2oa6fav1qrnhwz3d.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn96w2oa6fav1qrnhwz3d.png" alt="create_fork"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  2. Faça um clone do projeto forkado para sua máquina
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8p3xb8h0pxrzba2xv826.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F8p3xb8h0pxrzba2xv826.png" alt="clone"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso você verá que o repositório já aparece como um dos seus repos, no seu perfil, ele acabou de fazer uma cópia dele através do fork. Feito isso você pode escolher de qual maneira irá clonar o repositório para sua máquina e mandar ver.&lt;/p&gt;

&lt;p&gt;Já com o projeto em sua máquina é uma boa prática você criar uma branch para trabalhar nessa nova atualização que você irá fazer, respeitando as boas práticas do GitFlow, sem sujar a main ou master principal da sua aplicação.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git checkout -b NOME_DA_NOVA_BRANCH&lt;/code&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  3. Após finalizar suas atualizações abra um Pr para o repositório original
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgb4qjsitul17llzc50wm.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgb4qjsitul17llzc50wm.png" alt="open pr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após ter finalizado tudo que você tinha que fazer, faça seu &lt;em&gt;commit&lt;/em&gt; e logo em seguida o &lt;em&gt;push&lt;/em&gt; para seu repositório forkado e logo em seguida na interface do github, você ira escolher a opção de Abrir um novo Pr.&lt;/p&gt;

&lt;p&gt;Ao clicar sobre essa opção é muito importante você verificar qual a base está sendo comparada e de qual branch elá e, feito isto, estando tudo certo, só clicar em &lt;em&gt;Create pull request&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9hh2vgiqh7ajok3nvfo.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fn9hh2vgiqh7ajok3nvfo.png" alt="pr open"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;O resultado ficará assim, não precisa se preocupar com os revisores, pois o dono do repositório será notificado, assim como você também consegue ver todos os prs abertos para esse repo no canto superior, como na imagem abaixo.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqge93qs9bd2okhmqr1h8.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqge93qs9bd2okhmqr1h8.png" alt="prs_opens"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h4&gt;
  
  
  4. Após esperar e ter seu Pr aprovado, agora é a vez de atualizar seu fork com as atualizações da branch principal do projeto
&lt;/h4&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cy8xh68v2rx80ko93tu.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1cy8xh68v2rx80ko93tu.png" alt="closed mergead pr"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estando tudo ok, com seu Pr, muito provável que ele seja aprovado e consequentemente mergeado como foi o meu acima.&lt;/p&gt;

&lt;p&gt;Após isso você já consegue ver seu nome como colaborador do projeto em questão na página inicial dele, ajudando contribuir com uma comunidade maior e melhor, sempre ajudando a crescer mais ainda.&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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyt59n7dqdevesgh1oe4.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ftyt59n7dqdevesgh1oe4.png" alt="contributors"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após isso é interessante você deixar seu fork atualizado, com a branch principal do repositório original.&lt;/p&gt;

&lt;p&gt;Na sua máquina vá para a branch principal na pasta do seu repositório, seja ela a master ou a main e rode os seguintes comandos:&lt;/p&gt;

&lt;p&gt;Se você ainda não tiver adicionado o repositório original como um remote, esse comando fará exatamente isso.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git remote add upstream URL_DO_REPOSITÓRIO_ORIGINAL&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Após isso, certifique de estar na sua branch principal, e use o seguinte comando para, buscar as mudanças da branch principal do repositório original.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git fetch upstream&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Após buscar as mudanças, você pode mesclar as alterações da branch principal do repositório original na sua branch principal usando o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git merge upstream/master&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
Se houver conflitos entre as suas alterações na branch principal e as alterações do repositório original, o Git informará. Resolva esses conflitos manualmente, faça um novo commit e continue o processo.&lt;/p&gt;

&lt;p&gt;E por último, após mesclar as alterações do repositório original na sua branch principal local, você precisará enviar essas alterações para o seu fork no GitHub usando o seguinte comando:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;git push origin master&lt;br&gt;
&lt;/code&gt;&lt;br&gt;
ou se a sua principal for a main é só substituir pelo nome dá master.&lt;/p&gt;

&lt;p&gt;Agora você pode criar novas branchs, a partir da sua principal e continuar colaborando como novas features, fix entre outros para o projeto original, sempre repetindo esses mesmo passos e deixando sempre o seu fork, atualizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Bom, feito isso você já poderá se considerar como um colaborador open source, e partir para muitos outros projetos ajudando ainda mais a comunidade a crescer e se tornar melhor. Lembrem-se sistemas, open source nem sempre precisa ser códigos, assim como o exemplo que eu trouxe aqui não foi, você pode ver uma documentação que precisa ser alterada, ou um assets de melhor qualidade para aquele projeto, entre infinitas possibilidades, esteja de mente aberta e boa força de vontade para colaborar, no mais é isso, parabéns pela escolha e vamos que vamos.&lt;/p&gt;

</description>
      <category>opensource</category>
      <category>git</category>
      <category>github</category>
      <category>coding</category>
    </item>
    <item>
      <title>Explore agora 10 APIs gratuitas para dar vida às suas ideias geek</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Wed, 02 Aug 2023 11:48:14 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/explore-agora-10-apis-gratuitas-para-dar-vida-as-suas-ideias-geek-2cba</link>
      <guid>https://forem.com/hmontarroyos/explore-agora-10-apis-gratuitas-para-dar-vida-as-suas-ideias-geek-2cba</guid>
      <description>&lt;p&gt;&lt;em&gt;Dê um Upgrade nos Seus Projetos Geek com Essas 10 APIs Gratuitas!&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;O mundo Geek é uma verdadeira galáxia repleta de paixões e interesses, compartilhados por milhões de entusiastas em todo o mundo. Dos amantes de jogos e animes aos aficionados por RPGs e board games, essa comunidade fervorosa busca constantemente novas formas de aprofundar suas experiências nesses universos fantásticos. É justamente para satisfazer essa sede de conhecimento e criatividade que neste artigo eu trago uma seleção especial de 10 APIs gratuitas, capazes de proporcionar aos desenvolvedores e fãs da cultura Geek uma imersão ainda mais profunda em seus temas favoritos.&lt;/p&gt;

&lt;p&gt;Eu mesmo já fiz uso, de quase todas as APIs listadas aqui em meu projeto, e as que ainda não fiz eu já testei aqui no meu cliente, fazendo uma chamada, só para ver seu retorno e futuramente pretendo implementar em um projeto real.&lt;/p&gt;

&lt;p&gt;Lembrando a todos que essa lista, até o atual momento da publicação desse artigo, está funcionando, porém, não me responsabilizo caso algum dos links para alguma das APIs listadas pare de funcionar, pois cada uma é mantida por uma equipe independente, dito isto vamos a nossa lista.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://developer.marvel.com/"&gt;1. Marvel API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_Gw3gtXu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zs65qhtxww5f0bkkerg5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_Gw3gtXu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/zs65qhtxww5f0bkkerg5.png" alt="Web Site API Marvel" width="800" height="359"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vamos abrir a lista com essa maravilhosa API da Marvel, o qual já utilizei em alguns de meus projetos, a utilização da Marvel API é gratuita, porém, é necessário obter uma chave de acesso (API key) para poder fazer as requisições e ter acesso aos dados. Ao oferecer esses recursos valiosos, a Marvel API se torna uma ferramenta essencial para desenvolvedores criarem aplicativos, sites ou projetos relacionados ao vasto universo da Marvel, proporcionando uma experiência imersiva e enriquecedora para os fãs de todas as idades.&lt;/p&gt;

&lt;p&gt;Essa API de todas as listadas é a única que é oficial dos próprios criadores sendo mantida pela própria Disney, ela foi desenvolvida para fornecer aos desenvolvedores e fãs acesso a uma vasta gama de recursos relacionados ao universo da Marvel. Através dela, é possível obter informações detalhadas sobre personagens, quadrinhos, séries, imagens e capas, eventos e criadores associados à Marvel, é o principal disso é que ela e atualizada constantemente com as últimas hqs ou series lançadas do universo Marvel, vale muito a pena testar.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://kitsu.docs.apiary.io/#"&gt;2. Kitsu API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9umFAVDR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ktget13j89e5z6jed84e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9umFAVDR--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ktget13j89e5z6jed84e.png" alt="Web Site API Kitsu" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa outra API não menos importante, é a Kitsu API, criada para fornecer acesso a uma ampla gama de informações relacionadas a animes e mangás. Ela é oferecida pela plataforma Kitsu, que é uma comunidade online dedicada aos fãs de animações japonesas e quadrinhos.&lt;/p&gt;

&lt;p&gt;Essa API oferece uma série de recursos valiosos que permitem aos desenvolvedores e fãs obterem detalhes sobre animes, mangás, personagens, entre outros. Utilizando o formato JSON:API, a Kitsu API segue um padrão bem estruturado que facilita a integração com outros aplicativos e sistemas.&lt;/p&gt;

&lt;p&gt;A utilização da Kitsu API é gratuita, porém também requer uma chave de acesso (API key) para efetuar as requisições e acessar os dados. Com a Kitsu API, desenvolvedores podem criar aplicativos, websites e ferramentas que ampliam a experiência dos fãs de animes e mangás, proporcionando uma plataforma dinâmica e interativa para explorar, compartilhar e descobrir novos conteúdos relacionados a todo esse universo dos animes.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://pokeapi.co/"&gt;3. Poké API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--YCHPphes--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/863vqvb0sf83b8w8vqfg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--YCHPphes--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/863vqvb0sf83b8w8vqfg.png" alt="Web Site API Poké" width="800" height="327"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa API é outra que já utilizei bastante também, a PokeAPI, foi desenvolvida para fornecer informações abrangentes sobre o mundo dos Pokémons.&lt;/p&gt;

&lt;p&gt;Essa API oferece acesso a dados detalhados sobre os Pokémon, suas habilidades, tipos, movimentos, imagens de cada pokémon, jogos e muito mais.&lt;/p&gt;

&lt;p&gt;Utilizando a PokeAPI, desenvolvedores e fãs podem explorar os diversos aspectos desse universo e criar aplicativos, como a maravilhosa pokédex marca icônica do anime, manga e jogos que lista cada pokémon existente nesse mundo.&lt;/p&gt;

&lt;p&gt;Atualmente está na sua versão V2, a qual em sua versão beta até o momento já, tem suporte para GraphQL, e conta com atualizações constantes sempre que lança uma nova geração de pokémons. Segundo os próprios desenvolvedores dessa API em seu github oficial eles relataram que recebem mais de 330 milhões de solicitações por mês, bastante coisa hein, por isso vou deixar o link aqui caso vocês queiram, para ajudar como colaborador o projeto fazendo uma pequena &lt;a href="https://opencollective.com/pokeapi#backer"&gt;doação&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://rickandmortyapi.com/"&gt;4. The Rick and Morty API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--icmJd49_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6py959fst0j28cdhd7we.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--icmJd49_--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6py959fst0j28cdhd7we.png" alt="Web Site API Rick and Morty" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outra API de fácil uso, com um retorno muito legal para os fãs, a Rick and Morty API foi desenvolvida para proporcionar uma imersão no incrível universo da famosa série de animação “Rick and Morty”. Essa API oferece acesso a uma variedade de informações detalhadas sobre os episódios, personagens, locais, status, imagens e muito mais, presentes nesse universo.&lt;/p&gt;

&lt;p&gt;Utilizando essa API , desenvolvedores e fãs têm a oportunidade de explorar a riqueza desse universo animado e criar aplicativos, sites e projetos que enriquecem a experiência dos espectadores e aficionados de “Rick and Morty”.&lt;/p&gt;

&lt;p&gt;Atualmente ela já conta com suporte a GraphQL, além de ser bem performática, toda paginada, costuma trazer até 20 itens por página. Até o momento essa API tem cadastrado 826 personagens em sua base, um número bem grande, contando desde personagens e lugares bem conhecidos até, personagens que apareceram somente uma vez na série.&lt;/p&gt;

&lt;p&gt;Para quem utiliza o Insomnia ou o Postman como seus clientes vou deixar as coleções respectivas para eles, dessas chamadas, para começar a usar a API com esta &lt;a href="https://github.com/loopDelicious/rick-and-morty-postman"&gt;coleção Postman&lt;/a&gt; criada por &lt;a href="https://github.com/loopDelicious"&gt;loopDelicious&lt;/a&gt; . E caso opte pelo Insomnia, você pode usar esta &lt;a href="https://github.com/filfreire/rick-and-morty-insomnia"&gt;coleção Insomnia&lt;/a&gt; criada por &lt;a href="https://github.com/filfreire"&gt;filfreire&lt;/a&gt;, respectivos créditos aos autores.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://api.chucknorris.io/"&gt;5. Chuck Norris.io&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--dNh-_hyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62ml2t11um99o1kmq6eh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--dNh-_hyU--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/62ml2t11um99o1kmq6eh.png" alt="Web Site API Chuck Norris.io" width="800" height="364"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Outra API bem famosa no mundo Dev é essa, a Chuck Norris.IO criada para proporcionar acesso a uma das figuras mais icônicas e lendárias da cultura pop: o lendário Chuck Norris. Essa API é dedicada a fornecer fatos e piadas humorísticas sobre Chuck Norris, explorando as lendas e mitos que cercam esse famoso artista marcial e ator.&lt;/p&gt;

&lt;p&gt;Ao utilizar a Chuck Norris.IO API, desenvolvedores e fãs podem desfrutar de uma série de curiosidades engraçadas sobre Chuck Norris, que se tornou uma sensação na internet devido aos chamados “Chuck Norris Facts”. Essas piadas, frequentemente exageradas e absurdas, retratam Chuck Norris como uma figura invencível e superpoderosa.&lt;/p&gt;

&lt;p&gt;A utilização dessa API é gratuita e não requer autenticação ou chave de acesso, tornando-a acessível para todos os desenvolvedores e fãs de Chuck Norris.&lt;/p&gt;

&lt;p&gt;Com essa API é possível fazer aquele app para zoar a galera legal, como, por exemplo, uma das chamadas dessa API traz algum fato aleatório sobre Chuck Norris como esse: “Chuck Norris não tem latência de disco porque o disco rígido sabe se apressar.”, lembrando que todos os “Chuck Norris Facts” estão em inglês, vale a pena conferir, certamente irá proporcionar momentos de diversão e descontração para todos que a utilizarem.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://deckofcardsapi.com/"&gt;6. Deck of Cards An API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--FDhcYaXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgayck2k72zz3vf53ak3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--FDhcYaXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/bgayck2k72zz3vf53ak3.png" alt="Web Site API Deck of Card" width="800" height="279"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa API é maravilhosa para quem quer aprender conceitos bem importantes sobre programação como conceitos de filas, pilhas, etc. Através dela você pode criar qualquer variação de jogos de cartas de baralho, como buraco, poker, paciência entre outros.&lt;/p&gt;

&lt;p&gt;A Deck of Cards API fornecer acesso a um baralho de cartas virtual e todas as suas funcionalidades. Essa API permite que desenvolvedores criem aplicativos, jogos e projetos interativos que envolvam a manipulação e exibição de cartas de baralho.&lt;/p&gt;

&lt;p&gt;Com ela, é possível simular um baralho completo de cartas, embaralhar, distribuir e realizar diversas operações relacionadas ao mundo dos jogos de cartas de forma programática.&lt;/p&gt;

&lt;p&gt;A utilização da Deck of Cards API é gratuita e não requer autenticação ou chave de acesso.&lt;/p&gt;

&lt;p&gt;Através dela é possível criar uma ampla variedade de jogos de cartas, soluções para cassinos online, ferramentas de treinamento de poker e muito mais, tudo de forma programática e interativa. A Deck of Cards API permite trazer a diversão dos jogos de cartas para a era digital, proporcionando aos desenvolvedores uma ferramenta poderosa e versátil para criar experiências únicas e envolventes para os jogadores, eu que cresci com meu tio jogando o famoso paciência spider que vinha no windows, depois vou fazer uma aplicação para ele,espero que ele curta ;) .&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://swapi.dev/"&gt;7. SWAPI — The Star Wars API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--I7pt2CuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1p8099xw9jqnksxxtzg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--I7pt2CuX--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/c1p8099xw9jqnksxxtzg.png" alt="Web Site API Star Wars" width="800" height="323"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Essa API é bem famosa no mundo Dev, ainda, mas na comunidade fã de Star War, a Star Wars API (SWAPI) oferece acesso a uma ampla coleção de dados relacionados ao universo de Star Wars. Desenvolvida por fãs e entusiastas da franquia, a SWAPI disponibiliza informações detalhadas sobre filmes, personagens, planetas, naves, espécies e muito mais.&lt;/p&gt;

&lt;p&gt;Com a SWAPI, os desenvolvedores e fãs de Star Wars têm a oportunidade de explorar e interagir com dados relevantes das séries de filmes e do universo expandido de Star Wars, que cativam a imaginação de milhões de pessoas ao redor do mundo. Também não necessita de chave de autenticação ou chave de acesso para usar.&lt;/p&gt;

&lt;p&gt;Um problema que acabei encontrando ao utilizá-la, é sobre a demora dos dados, visto que é uma API gratuita, tem muita gente utilizando, então seus end points costumam demorar um pouco.&lt;/p&gt;

&lt;p&gt;Uma solução para isso através do React é utilizar do Context API, visto que os dados dos filmes são fixos e não serão alterados com os lançamentos de novos, você pode chamar uma vez essa API e já deixar salvo através do Context em uma espécie de cache em sua aplicação.&lt;/p&gt;

&lt;p&gt;Vou deixar o link do meu &lt;a href="https://github.com/HMontarroyos/Star_Wars_Introduction"&gt;repositório&lt;/a&gt; no github em que fiz uma aplicação para trazer as famosas intros dos textos, logo no começo de cada filme da saga Star Wars, marca registrada da franquia.&lt;/p&gt;

&lt;p&gt;Outro ponto é que até o momento desse artigo e quando eu fiz a minha aplicação os últimos filmes lançados não estavam ainda no banco dessa API, então tive que fazer uma espécie de mock na minha aplicação para trazer os intro text desses filmes, também outro ponto a salientar é que essa API até o momento só traz informações sobre os personagens, filmes etc.&lt;/p&gt;

&lt;p&gt;E não traz nenhuma especie de imagem tendo que ou buscar na internet, ou usar alguma outra API, para isso a qual eu indico a  &lt;a href="https://imdb-api.com/"&gt;IMDb API&lt;/a&gt;, porém, como no meu caso tinha que ter uma chave de acesso e outros fatores, para minha aplicação, por ser apenas dos pôsteres eu resolvi utilizar de outro meio, mas vale a pena dá uma olhada nessa API, que também é bem interessante, deixo essa menção a ela aqui.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://www.dnd5eapi.co/docs/"&gt;8. D&amp;amp;D 5e API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--fdcn0cdy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qzlvj0tje7er7pw2ipy3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--fdcn0cdy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qzlvj0tje7er7pw2ipy3.png" alt="Web Site API D&amp;amp;D 5e" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como amante de RPG e mestre há anos, não poderia deixar de fora dessa lista essa API, que descobri recentemente, maravilhosa para quem curte RPG adepto do sistema Dungeons &amp;amp; Dragon 5° edição.&lt;/p&gt;

&lt;p&gt;A D&amp;amp;D 5e API, foi criada para fornecer acesso a informações detalhadas sobre o mundo do jogo de RPG (Role-Playing Game) Dungeons &amp;amp; Dragons 5ª Edição (D&amp;amp;D 5e). Com ela você consegue buscar dados sobre as mecânicas do jogo, incluindo informações sobre classes, raças, magias, habilidades, equipamentos e muito mais.&lt;/p&gt;

&lt;p&gt;Só Recapitulando, Dungeons &amp;amp; Dragons 5ª Edição é um dos jogos de RPG mais populares e conhecidos do mundo, onde os jogadores assumem o papel de personagens em um universo de fantasia e colaboram para viverem emocionantes aventuras. A D&amp;amp;D 5e API oferece um vasto conjunto de informações, para facilitar a criação de ferramentas, aplicativos e projetos relacionados ao jogo.&lt;/p&gt;

&lt;p&gt;Para aquele mestre dev assim como eu, que curte criar projetos, é um prato cheio para desenvolver uma aplicação para sua mesa de RPG, garanto que seus jogadores vão amar.&lt;/p&gt;

&lt;p&gt;Com suporte a GraphQL, a lista das coisas que você pode fazer com essa API é enorme, desde geração aleatória de nomes, até um app que gera itens mágicos aleatórios por dungeons, etc. Só tirar suas ideias do papel agora mesmo, assim como algumas citadas anteriormente, ela não necessita de chave de autenticação ou chave de acesso.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://magicthegathering.io/"&gt;9. Magic: The Gathering — Developers&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--U-JS2xjt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yg3rf878mtv9sqmfaa4u.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--U-JS2xjt--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yg3rf878mtv9sqmfaa4u.png" alt="Web Site API Magic: The Gathering" width="800" height="366"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após ter falado sobre RPG, não podia deixar de fora o bom e velho Magic. Acho meio difícil alguém do meio geek, não conhecer Magic, mas lá vai um breve resumo, Magic: the Gathering ou simplesmente Magic, é um jogo de cartas colecionáveis, no qual os jogadores utilizam de um baralho de cartas construído conforme o seu modo individual de jogo para tentar derrotar o baralho adversário, existem vários tipos de deck, cada qual para seu tipo de jogador, podendo ter várias combinações possíveis.&lt;/p&gt;

&lt;p&gt;A Magic: The Gathering API traz consigo uma série de informações detalhadas sobre o mundo de Magic, como os dados sobre as cartas, conjuntos, tipos, cores, artistas e muito mais.&lt;/p&gt;

&lt;p&gt;Sua documentação é extramente detalhada assim como a D&amp;amp;D 5e API, trazendo vários detalhes de cada carta de seu respectivo deck, a API é totalmente paginada retornando um máximo de 100 cards por chamada.&lt;/p&gt;

&lt;p&gt;A API também suporta buscas e filtragens, permitindo que os usuários encontrem facilmente as informações específicas que desejam, como tipo de deck, ano lançado, etc.&lt;/p&gt;

&lt;p&gt;Ainda conta com uma vasta comunidade de devs, pelo &lt;a href="https://discord.com/invite/qwGJNnP"&gt;Discord&lt;/a&gt; segue o link caso interessa em fazer parte e contribuir com essa maravilhosa comunidade.&lt;/p&gt;

&lt;h3&gt;
  
  
  &lt;a href="https://valorant-api.com/"&gt;10. Valorant-API&lt;/a&gt;
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ztwx6-mE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1mtgu4nwlb8rc6xc8m7.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ztwx6-mE--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/t1mtgu4nwlb8rc6xc8m7.png" alt="Web Site API Valorant" width="800" height="363"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E para fechar com chave de Ouro, não podia deixar de fora essa API, que mesmo não sendo oficial está de parabéns, a comunidade caprichou demais nela.&lt;/p&gt;

&lt;p&gt;Para quem não conhece ou nunca jogou, Valorant é um jogo competitivo FPS, distribuído pela &lt;a href="https://playvalorant.com/pt-br/?gad=1&amp;amp;gclid=CjwKCAjw_aemBhBLEiwAT98FMkRwhWhW-lFYnq54PDjqaxjEDCIkKHdP-B7MYrvNo0XYeFF2ADN-3RoCwIkQAvD_BwE&amp;amp;gclsrc=aw.ds"&gt;RIOT Games&lt;/a&gt;, em que os jogadores assumem o papel de agentes com habilidades únicas, participando de partidas em equipes, abre aspa, no momento desse artigo eu dei uma pausa para jogar uma partida, fecha aspas ;).&lt;/p&gt;

&lt;p&gt;A Valorant API, traz consigo dados detalhados de todo o universo do jogo, a comunidade se empenhou nisso, tendo atualizações constante como, por exemplo, quando lança algum agente novo no jogo pela Riot, logo em seguida a API já está atualizada.&lt;/p&gt;

&lt;p&gt;Essa API traz consigo informações detalhadas sobre agentes, armas, mapas, partidas, além de várias imagens de ótima qualidade de cada item, agente e muito mais, o que facilita em muito na hora de desenvolver um aplicativo agradável visualmente, só usando essa API para se comunicar.&lt;/p&gt;

&lt;p&gt;Alguns pontos fortes de API e que ela permite trazer estatísticas de partidas, incluindo placares, histórico de partidas e informações sobre vitórias e derrotas, além de ranking e classificação, permitindo acompanhar o desempenho em partidas competitivas.&lt;/p&gt;

&lt;p&gt;A API permite também suporta recursos de busca e filtragem, facilitando a localização de informações específicas.&lt;/p&gt;

&lt;p&gt;Também não necessita de chave de autenticação ou chave de acesso, deixando mais rápido ainda, na hora de implementar.&lt;/p&gt;

&lt;p&gt;A Valorant API é uma ótima oportunidade para a comunidade de jogadores e desenvolvedores explorarem ainda mais o emocionante mundo do jogo Valorant, aprofundando-se nas táticas e nas mecânicas desse jogo competitivo e repleto de ação.&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;Existem outras, milhares de APIs assim como essas que eu trouxe aqui, que facilitam ainda, mas o desenvolvimento da galera geek, e outras que continuam sendo desenvolvidas até o momento desse artigo.&lt;/p&gt;

&lt;p&gt;Vale lembrar que todos os links e descrições como modo de uso, funcionalidades e afins que informei nesse artigo, estava funcionando e testado enquanto eu publiquei ele, não me responsabilizo caso alguma API se torne paga, mude suas funcionalidades ou até precise de chave de autenticação agora, etc.&lt;/p&gt;

&lt;p&gt;No mais é isso, aproveitem e já comece a tirar aquela ideia do papel, com toda certeza irá gerar projetos maravilhosos com cada uma daqui.&lt;/p&gt;

</description>
      <category>api</category>
      <category>react</category>
      <category>frontend</category>
      <category>geek</category>
    </item>
    <item>
      <title>Polished: Simplificando a Manipulação de Estilos CSS em Projetos React</title>
      <dc:creator>Hebert Montarroyos</dc:creator>
      <pubDate>Mon, 31 Jul 2023 10:39:06 +0000</pubDate>
      <link>https://forem.com/hmontarroyos/polished-simplificando-a-manipulacao-de-estilos-css-em-projetos-react-1g35</link>
      <guid>https://forem.com/hmontarroyos/polished-simplificando-a-manipulacao-de-estilos-css-em-projetos-react-1g35</guid>
      <description>&lt;p&gt;&lt;em&gt;Simplifique sua Abordagem de Estilização com o Polished em Componentes React.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ultimamente tenho utilizado este camarada em meus projetos pessoais e gostaria de falar um pouco sobre o polished, numerando o que achei como positivo e negativo de utilizar essa lib, que tem sido um grande utilitário dentro das minhas aplicações.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://polished.js.org/"&gt;Polished&lt;/a&gt; é uma biblioteca JavaScript que oferece uma série de funções utilitárias para trabalhar com estilos CSS de maneira mais eficiente e prática. Neste artigo, vou apontar suas vantagens e desvantagens pela minha perspectiva, fornecendo exemplos de código e usos para demonstrar como ele pode ser útil. Além disso, irei trazer o problema da comunidade que o Polished se propõe a resolver.&lt;/p&gt;

&lt;p&gt;Essa biblioteca é muito apreciada pela comunidade por sua simplicidade e funcionalidades úteis. Se você está trabalhando em projetos React e CSS-in-JS, o Polished pode ser uma ótima adição para aprimorar seus estilos e tornar seu código mais elegante, vale lembrar que ela é mantida pela mesma comunidade que mantém o &lt;a href="https://styled-components.com/"&gt;Styled-Components&lt;/a&gt;, outra lib excelente para quem trabalha com CSS-in-JS, para quem não conhece vale muita a pena dá uma olhada.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens do Polished
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Sintaxe simplificada:&lt;/strong&gt; O Polished permite escrever estilos CSS em JavaScript o famoso CSS-in-JS, de forma mais concisa e legível, evitando a necessidade de strings complexas de CSS. Por exemplo, para definir uma cor em CSS, normalmente escreveríamos algo assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--01VeHeSo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ctinvfq51lkgh7fyollv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--01VeHeSo--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ctinvfq51lkgh7fyollv.png" alt="Exemplo em CSS puro de uma cor" width="704" height="376"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com Polished, podemos usar uma função utilitária para obter o mesmo resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ogkz-l1p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/clpz1udshaxthnsa2669.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ogkz-l1p--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/clpz1udshaxthnsa2669.png" alt="Exemplo em Polished de uma cor" width="800" height="399"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Manipulação avançada de cores:&lt;/strong&gt; A biblioteca oferece uma série de funções para manipular cores de forma mais avançada, como criar tons, sombras e muito mais. Essas funcionalidades são extremamente úteis para criar designs mais atraentes e acessíveis, como, por exemplo, a função darken que escurece a cor em 20% desse jeito:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PWpRyZTs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thuzufhcg85n9trkdniv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PWpRyZTs--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/thuzufhcg85n9trkdniv.png" alt="Exemplo em Polished de como escurecer uma cor em 20%" width="800" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Compatibilidade com CSS-in-JS:&lt;/strong&gt; O Polished é altamente compatível com bibliotecas de CSS-in-JS, como styled-components. Ele pode ser facilmente integrado a essas bibliotecas para estender suas funcionalidades e tornar a estilização mais dinâmica.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Melhor legibilidade do código:&lt;/strong&gt; Com o Polished, é possível criar estilos mais legíveis e reutilizáveis, melhorando a manutenção do código e tornando-o mais organizado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Desvantagens do Polished
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Mais uma dependência:&lt;/strong&gt; Adicionar o Polished ao projeto significa adicionar mais uma dependência, o que pode aumentar o tamanho do pacote final e potencialmente causar impactos negativos na velocidade de carregamento.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Curva de aprendizado:&lt;/strong&gt; Se os devs do time não estão familiarizados com a lib, pode ser necessário um tempo adicional para aprender a usar suas funcionalidades e entender suas nuances.&lt;/p&gt;

&lt;h2&gt;
  
  
  Como utilizar o Polished em seus projetos
&lt;/h2&gt;

&lt;p&gt;Instale a biblioteca polished usando o npm ou o yarn.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install polished&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add polished&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo em específico vou utilizar em conjunto uma lib CSS-in-JS, o Styled-Components.&lt;/p&gt;

&lt;p&gt;Para instalar o Styled-Components faça o seguinte&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm install styled-components&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;ou&lt;/p&gt;

&lt;p&gt;&lt;code&gt;yarn add styled-components&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Digamos que estamos criando um componente React com Styled-Components e queremos estilizar um botão com um gradiente de cor usando o Polished:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8YGZzseu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l68v0qhpro0te9xnzwlh.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8YGZzseu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/l68v0qhpro0te9xnzwlh.png" alt="Criando um componente Button em gradiente no React via Styled-Components em conjunto com o Polished." width="800" height="461"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Criando um componente Button em gradiente no React via Styled-Components em conjunto com o Polished.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Pronto, a partir disso você já consegue importar ele em alguma view do seu projeto e utilizar da maneira que desejar, ficando algo assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--PUJDZUam--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ocajrjf6jjc4mjytwyjq.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--PUJDZUam--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/ocajrjf6jjc4mjytwyjq.jpg" alt="Resultado final de como ficou o Button via Polished" width="800" height="357"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Métodos populares do Polished
&lt;/h2&gt;

&lt;p&gt;Para finalizar vou citar alguns dos métodos, mas utilizados dessa lib, facilitando o reuso em outros lugares.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rgba:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;rgba&lt;/code&gt; é usada para definir cores com transparência. Ela recebe quatro parâmetros: os valores de vermelho, verde, azul e alfa (transparência) em uma escala de 0 a 1.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L2B8Ykfc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rtxa7b43pvmf5bdgfksv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L2B8Ykfc--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/rtxa7b43pvmf5bdgfksv.png" alt="Define um vermelho semi-transparente." width="800" height="413"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Define um vermelho semi-transparente.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;lighten e darken:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;As funções &lt;code&gt;lighten&lt;/code&gt; e &lt;code&gt;darken&lt;/code&gt; permitem ajustar a luminosidade de uma cor, tornando-a mais clara ou mais escura, respectivamente. Isso pode ser útil para criar efeitos de destaque ou sombreamento.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Nj0TvzeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4cjal326snjt7cycbiw3.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Nj0TvzeQ--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4cjal326snjt7cycbiw3.png" alt="O lighten torna o azul mais claro em 20% enquanto o darken torna o azul mais escuro em 20%." width="800" height="435"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;O lighten torna o azul mais claro em 20% enquanto o darken torna o azul mais escuro em 20%.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;radialGradient:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Assim como &lt;code&gt;linearGradient&lt;/code&gt;, a função &lt;code&gt;radialGradient&lt;/code&gt; permite criar gradientes radiais. Ela também aceita o objeto &lt;code&gt;colorStops&lt;/code&gt;, mas a direção não é necessária para esse tipo de gradiente.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--_hJuWReu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nv6ha4qg5shuxbk4s7ne.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--_hJuWReu--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/nv6ha4qg5shuxbk4s7ne.png" alt="Cria um radial gradiente de cores utilizando o vermelho e azul." width="800" height="419"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Cria um radial gradiente de cores utilizando o vermelho e azul.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;transparentize:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;A função &lt;code&gt;transparentize&lt;/code&gt; permite tornar uma cor mais transparente, ajustando o valor alfa. Isso pode ser útil para criar efeitos de sobreposição ou mistura de cores.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--zwoDcFdL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tehn99no5b6rdugiy3mc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--zwoDcFdL--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tehn99no5b6rdugiy3mc.png" alt="Torna o vermelho 50% transparente." width="800" height="326"&gt;&lt;/a&gt;&lt;br&gt;
&lt;em&gt;Torna o vermelho 50% transparente.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Resumo
&lt;/h2&gt;

&lt;p&gt;O Polished foi criado para resolver o problema de simplificar a manipulação e escrita de estilos CSS em JavaScript. Ele oferece funções utilitárias que permitem trabalhar com cores, sombras e outras propriedades CSS de maneira mais fácil e eficiente. Com sua sintaxe simplificada e compatibilidade com CSS-in-JS, o Polished ajuda a melhorar a legibilidade do código e a criar estilos mais sofisticados e dinâmicos, proporcionando uma experiência de desenvolvimento mais agradável. Embora seja uma adição útil para muitos projetos, é importante pesar as desvantagens, como a introdução de mais uma dependência, antes de decidir usá-lo em um projeto específico, fique a vontade para usar do jeito que desejar em seus projetos.&lt;/p&gt;

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