<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:cc="http://cyber.law.harvard.edu/rss/creativeCommonsRssModule.html">
    <channel>
        <title><![CDATA[React Brasil - Medium]]></title>
        <description><![CDATA[Tudo sobre o mundo React - Medium]]></description>
        <link>https://medium.com/reactbrasil?source=rss----67aa76e93e61---4</link>
        <image>
            <url>https://cdn-images-1.medium.com/proxy/1*TGH72Nnw24QL3iV9IOm4VA.png</url>
            <title>React Brasil - Medium</title>
            <link>https://medium.com/reactbrasil?source=rss----67aa76e93e61---4</link>
        </image>
        <generator>Medium</generator>
        <lastBuildDate>Sun, 24 May 2026 01:48:58 GMT</lastBuildDate>
        <atom:link href="https://medium.com/feed/reactbrasil" rel="self" type="application/rss+xml"/>
        <webMaster><![CDATA[yourfriends@medium.com]]></webMaster>
        <atom:link href="http://medium.superfeedr.com" rel="hub"/>
        <item>
            <title><![CDATA[Bê-á-bá do React]]></title>
            <link>https://medium.com/reactbrasil/b%C3%AA-%C3%A1-b%C3%A1-do-react-c20690a2ae7e?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/c20690a2ae7e</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[reactjs]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[programação]]></category>
            <dc:creator><![CDATA[Belmiro]]></dc:creator>
            <pubDate>Wed, 24 Jan 2024 14:29:02 GMT</pubDate>
            <atom:updated>2025-10-16T01:46:25.534Z</atom:updated>
            <content:encoded><![CDATA[<h4>Uma direta introdução sobre algumas palavras que você vai trombar ao trabalhar com React</h4><h3>Objetivo</h3><p>Ao trabalhar com tecnologia é comum se deparar com várias palavras que nos fazem ainda mais confusos.<a href="https://medium.com/p/8f23a109b4fc"> Similar ao que escrevi sobre Angular</a>, venho agora escrever sobre React.</p><p>Nosso objetivo aqui é bem direto: introduzir as palavras e termos mais populares ao trabalhar com React<em> </em>de forma teórica. Além disso vou mapear <em>links</em> e te incentivar a aprofundar ainda mais nos estudos.</p><h3>React</h3><p>Bora começar pelo começo. <a href="https://react.dev/learn">React </a>é uma biblioteca que nos ajuda a desenvolver interfaces de usuário <em>web </em>e nativas. É um projeto <em>open-source</em> e a empresa por trás é a Meta (vulgo Facebook).</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/539/0*G4OmiJa6NAV8wH0r.png" /></figure><p>A gente pode utilizar o React para construir interfaces utilizando <em>TypeScript</em>, <em>JavaScript</em>, <em>HTML </em>e <em>CSS</em>. Inclusive, sem querer te confundir ainda mais, ele ainda pode ser também utilizado em outras aplicações além da <em>web</em>, como a <em>mobile </em>por exemplo através do <a href="https://reactnative.dev/">React Native<em>.</em></a></p><p>É atualmente a tecnologia mais utilizada para construção de interfaces, sendo amplamente aceita no desenvolvimento de pequenos, médios e grandes projetos devido sua capacidade de permitir a criação de interfaces de forma rápida e escalável.</p><blockquote><a href="https://react.dev/reference/react">Documentação completa do React</a></blockquote><blockquote><a href="https://react.dev/learn">Aprenda o básico e construa seu primeiro projeto</a></blockquote><h3>SPA, SSR e SSG</h3><p>Desculpa, isso é loucura, eu sei. Comecei pesado com esse tanto de siglas. Mas vamos com calma.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*r0UAF8rzaxqTL-qJ" /><figcaption>Photo by <a href="https://unsplash.com/@vmxhu?utm_source=medium&amp;utm_medium=referral">Szabo Viktor</a> on <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><h4>SPA</h4><p>Do inglês <em>Single Page Application</em> e do português Aplicação de Página Única, é uma aplicação que reescreve dinamicamente uma única página ao invés de carregar uma nova página. Essa abordagem evita a interrupção da experiência do usuário promovendo a sensação de um sistema <em>desktop</em>.</p><h4>SSR</h4><p>Do inglês <em>Server Side Rendering </em>e do português Renderização do lado do servidor, é uma aplicação (ou parte dela) que renderiza o conteúdo do lado do servidor e envia ao usuário somente o resultado disso. A vantagem aqui é melhorar os resultados obtidos nos motores de busca e é uma outra forma de melhorar a experiência do usuário.</p><h4>SSG</h4><p>Do inglês <em>Static Site Generation </em>e do português Geração de <em>sites </em>estáticos, é uma outra estratégia onde também gera o conteúdo ao lado do servidor, porém neste caso é no momento da <em>build </em>da aplicação. A vantagem aqui é minimizar o número de vezes que o servidor é atingido para gerar um conteúdo.</p><p>Qual é o melhor? Não existe resposta. Cada sigla dessa pode ser utilizado em um cenário diferente, vai valer da sua análise.</p><blockquote><a href="https://hygraph.com/blog/difference-spa-ssg-ssr">Qual é a diferença entre SPAs, SSGs e SSR?</a></blockquote><h4>Componentes</h4><p>O conceito de componentes permite que projetos React comecem rápido e sejam escaláveis. Na minha opinião o conceito de componentes é basicamente a alma da coisa.</p><p>A proposta da componentização é encapsular regras de interface e comportamentos de forma reutilizável.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/300/0*0p8qHCcpv7FVsbNV" /></figure><figure><img alt="" src="https://cdn-images-1.medium.com/max/700/0*oBEkkd6eDUnd1Glk" /></figure><p>Olha que direto é a abordagem. Os três componentes são um componente que abstraí uma barra de ferramentas, o formulário de cadastro por fim a tabela. Cada qual pode ter suas próprias regras de interface encapsuladas.</p><p>Podemos muito bem criar componentes que supomos que não seria reutilizáveis e fazemos isso justamente para simplificar o código e encapsular funcionalidades.</p><p>Existem duas formas de criar componentes no React, uma via funções e outra via classes. A sintaxe é diferente em cada um. No link abaixo explica melhor, a forma mais moderna é via função onde componentes são representados por funções.</p><blockquote><a href="https://react.dev/learn/your-first-component">Seu primeiro componente</a></blockquote><blockquote><a href="https://blog.betrybe.com/tecnologia/componentizacao-tudo-sobre/#:~:text=A%20componentiza%C3%A7%C3%A3o%20trata%2Dse%20de,de%20funcionalidades%20do%20mesmo%20tipo.">Componentização: o que é, por que usar e exemplo na prática!</a></blockquote><blockquote><a href="https://www.geeksforgeeks.org/differences-between-functional-components-and-class-components/">Diferença entre Functional Components e Class Components</a></blockquote><h4>Props</h4><p><em>Props </em>são as propriedades que seu componente aceita. É a forma como que componentes se comunicam entre eles. Uma <em>prop </em>pode ser um número, um texto, um objeto, um <em>array</em>, uma função ou até mesmo um outro componente. As <em>props </em>são atributos que você define no componente pai e que são passados para o componente filho.</p><blockquote><a href="https://react.dev/learn/passing-props-to-a-component">Passando props para um componente</a></blockquote><h4>Pure components</h4><p><em>Pure Components</em>, ou componentes puro, são componentes na qual uma otimização é feita automaticamente pelo React em prol de reduzir o número de renderizações.</p><blockquote><a href="https://blog.logrocket.com/what-are-react-pure-functional-components/">O que são componentes puros funcionais no React?</a></blockquote><blockquote><a href="https://react.dev/reference/react/PureComponent">Documentação sobre pure components</a></blockquote><h4>Hooks</h4><p>Os <em>hooks </em>foram introduzidos a partir da versão 16.8 do React para serem trabalhados com componentes funcionais e se tornou um conceito essencial para utilizar em aplicações React.</p><blockquote><a href="https://legacy.reactjs.org/docs/hooks-custom.html">Construindo seus próprios hooks</a></blockquote><p>Os mais populares:</p><h4>useState</h4><p>Permite que componentes tenham um estado. Você o utiliza para criar variáveis que possuem um estado e a cada vez que este estado é atualizado uma nova renderização do componente acontece.</p><p><a href="https://react.dev/reference/react/useState"><em>Documentação</em></a></p><h4><em>useEffect</em></h4><p>Possibilita realizar efeitos colaterais em componentes. Esses efeitos podem ser dos mais variados possíveis: requisição a uma <em>API</em>, alterações no <em>DOM</em>, subscrição a um evento, efeitos colaterais na interface de acordo com certas condições etc.</p><p><a href="https://react.dev/reference/react/useEffect"><em>Documentação</em></a></p><h4>useReducer</h4><p>Uma alternativa ao <em>useState </em>que é usado para gerenciar a lógica da alteração de estado complexa ou que envolve transições de estado baseadas em ações. É útil ao se trabalhar com variáveis as quais sua alteração são avançadas.</p><p><a href="https://react.dev/reference/react/useReducer"><em>Documentação</em></a></p><h4><em>useMemo</em></h4><p><em>Hook </em>que memoriza valores computados e com isso permite otimizar o desempenho de componentes ao evitar recálculos desnecessários. É útil ao ser utilizado junto a operações computacionais intensas que podem vir a ser caras em termos de tempo de execução.</p><p><a href="https://react.dev/reference/react/useMemo"><em>Documentação</em></a></p><h4><em>useCallback</em></h4><p>Semelhante ao <em>useMemo,</em> porém específicos para funções. É útil para evitar a criação de novas instâncias de funções em cada renderização, especialmente quando essas funções são passadas como <em>props </em>para componentes filho.</p><blockquote><a href="https://react.dev/reference/react/useCallback">Documentação</a></blockquote><h4><em>useRef</em></h4><p><em>Hook </em>que nos permite armazenar valores que não são necessários para renderização. O utilizamos para conter valores e persisti-los entre as renderizações sem causar re-renderização. É útil para interagir com o <em>DOM </em>e manter valores que não impactam a renderização.</p><p><a href="https://react.dev/reference/react/useRef"><em>Documentação</em></a></p><h4>useContext</h4><p>Falarei mais adiante no tópico sobre <em>context</em>.</p><h3>State management</h3><p>Quando se trata de aplicações React,<em> state management</em> ou gerenciamento de estado refere-se a gestão organizada do estado da aplicação. O estado da aplicação representa dados que podem mudar ao longo do tempo e influenciar no comportamento da interface.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*CWZqK7KQHvoDoIPHbdG7YA.jpeg" /></figure><p>Geralmente sua necessidade vem de acordo com a complexidade que seu aplicativo ganha. Isso passa a ter um peso maior quando muitos componentes compartilham e dependem de um mesmo estado, desta forma buscamos essa alternativa para gerenciar de forma consistente esse estado.</p><p>Atualmente existem várias formas de gerenciar o estado de aplicações <em>React </em>e essas várias formas se abstraem em conceitos e modos de gerenciamento.</p><p>Embora não seja mais tão popular como no seu auge, <em>Redux </em>com certeza é uma palavra que você lerá, visto que foi um dos grandes propulsores do termo gerenciamento de estado.</p><h4>Redux</h4><p><em>Redux </em>é uma biblioteca que permite gerenciamento de estado para aplicações <em>web. </em>Sua estratégia é centralizar o estado de toda aplicação em um único local onde pode ser acessado e atualizado de qualquer lugar do <em>app </em>de acordo com suas regras.</p><p>Foi muito popular para aplicativos com grande volume de estado e grande complexidade devido sua forma estruturada de trabalhar.</p><p>Em projetos legados é ainda muito presente, porém em novos projetos tem perdido seu espaço para outras bibliotecas de gerenciamento de estado (<a href="https://github.com/pmndrs/zustand"><em>Zustand</em></a>, <a href="https://mobx.js.org/README.html"><em>MobX</em></a>, <a href="https://recoiljs.org/"><em>Recoil</em></a><em> </em>e <a href="https://themeselection.com/redux-alternatives/"><em>Unstated</em></a><em> </em>por exemplo), ou até mesmo para a <em>Context API</em>, que o <em>React </em>introduziu na versão 16.3.</p><blockquote><a href="https://redux.js.org/api/api-reference">Documentação do Redux</a></blockquote><blockquote><a href="https://www.freecodecamp.org/news/redux-and-redux-toolkit-for-beginners/">Como usar Redux e Redux Tookit</a></blockquote><h3>Context API</h3><p>A partir da versão 16.3, o React introduziu uma nova maneira de compartilhar dados entre componentes sem a necessidade de passar <em>props </em>manualmente por todos os níveis da cadeia de componentes.</p><p>Essa nova maneira é chamada de <em>Context API</em> e ele permite criar contextos que podem ser acessados por qualquer componente filho dentro do contexto.</p><p>Inclusive pode substituir uma biblioteca de gerenciamento de estado quando criado um contexto global. Devemos apenas tomar cuidado para evitar a criação de um estado excessivamente complexo.</p><h4>Agora sim, useContext</h4><p>O <em>useContext </em>é o <em>hook </em>que nos possibilita a utilização da <em>Context API</em>, uma vez que via entre este <em>hook </em>a gente consegue acessar os valores armazenados naquele contexto a qual queremos acessar.</p><blockquote><a href="https://react.dev/reference/react/createContext">Documentação do createContext</a></blockquote><blockquote><a href="https://react.dev/reference/react/useContext">Documentação do useContext</a></blockquote><blockquote><a href="https://www.freecodecamp.org/news/react-context-for-beginners/">O guia completo</a></blockquote><blockquote><a href="https://www.alura.com.br/artigos/prop-drilling-no-react-js">Prop Drilling: o que é?</a></blockquote><h3>HOC</h3><p><em>Higher-Order Compoenent</em>, ou Componente de Ordem Superior, é um padrão de design que envolve a criação de componentes reutilizáveis e lógica compartilhada.</p><p>Um <em>HOC </em>é uma função que aceita um componente como entrada e retorna um novo componente com funcionalidades adicionadas ou modificadas.</p><p>São utilizados para abstrair comportamentos comuns de componentes. Embora uma técnica poderosa, caiu em desuso com os <em>hooks, </em>que fornece uma abordagem alternativa para compartilhamento de lógica entre componentes. Porém, obviamente, ainda é visto e alguns cenários pode ser válido.</p><blockquote><a href="https://www.freecodecamp.org/news/higher-order-components-in-react/">Como usar Componentes de Ordem Superior em React</a></blockquote><blockquote><a href="https://medium.com/javascript-scene/do-react-hooks-replace-higher-order-components-hocs-7ae4a08b7b58">React hooks substituem HOCs?</a></blockquote><h3>Next</h3><p>Agora é o queridinho do momento — o <a href="https://nextjs.org/"><em>Next</em></a>.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1000/0*4CwEGUjtNmPg6EXD.png" /></figure><p><em>Next </em>é um <em>framework </em>para React que tem por objetivo simplificar o desenvolvimento de aplicações <em>web </em>já oferecendo uma série de recursos e convenções que facilitam a criação de aplicações modernas e escaláveis.</p><p>É frequentemente usado para construir projetos React eficientes, otimizados para <em>SEO </em>e com suporte a renderização do lado do servidor (<em>SSR </em>e <em>SSG</em>).</p><p>Alguns dos principais conceitos que o <em>Next</em> traz consigo:</p><ol><li><em>SSR </em>e <em>SSG </em>— Suporta ambas renderizações proporcionando benefícios como melhor <em>SEO,</em> desempenho e experiência.</li><li>Roteamento — Oferece um sistema de roteamento automático baseado na estrutura de diretórios do projeto. Ao criar arquivos na pasta pages, o <em>Next </em>automaticamente cria rotas correspondentes para esses arquivos. Next também permite criar rotas de <em>API </em>facilmente e isso é útil para separar a lógica da <em>API </em>da lógica do <em>frontend</em>.</li><li>Otimizações automáticas — Inclui otimizações automáticas, como divisão de código (<em>code splitting</em>) e pré-busca (<em>prefetching</em>), para melhorar o desempenho da aplicação.</li><li>Componentes especiais — <em>Next </em>traz alguns componentes nativos que possuem otimizações e melhorias, como por exemplo o componente <em>Image </em>que possuiu uma série de melhorias para se trabalhar com imagens.</li></ol><p>A combinação dessas características torna o <em>Next </em>uma escolha poderosa para o desenvolvimento de aplicações React, especialmente quando é necessário suporte a <em>SSR</em>, <em>SEO </em>e uma estrutura organizada e fácil de usar.</p><blockquote><a href="https://nextjs.org/learn?utm_source=next-site&amp;utm_medium=homepage-cta&amp;utm_campaign=home">Comece com Next.js</a></blockquote><blockquote><a href="https://nextjs.org/docs">Documentação do Next</a></blockquote><h3>UI Kits</h3><p>Geralmente quando vamos desenvolver um <em>app </em>React, nós utilizamos uma UI Kit que nos disponibiliza um <em>kit </em>de componentes, temas, <em>layout </em>etc. para facilitar nosso trabalho.</p><p>Esse tópico está aqui justamente para te apresentar algumas:</p><ul><li><a href="https://tailwindcss.com/docs/guides/create-react-app">Tailwind</a></li><li><a href="https://react-bootstrap.netlify.app/">React Boostrap</a></li><li><a href="https://mui.com/material-ui/">Material UI</a></li><li><a href="https://ant.design/">Ant</a></li><li><a href="https://chakra-ui.com/">Chakra</a></li></ul><h3>Fim</h3><p>Se você chegou até aqui e te ajudou em algo, eu fico super feliz. Muito obrigado!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=c20690a2ae7e" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/b%C3%AA-%C3%A1-b%C3%A1-do-react-c20690a2ae7e">Bê-á-bá do React</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Relaxa, ChatGPT não roubar seu emprego de programador]]></title>
            <link>https://medium.com/reactbrasil/relaxa-chatgpt-n%C3%A3o-roubar-seu-emprego-de-programador-a74602308ce?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/a74602308ce</guid>
            <category><![CDATA[desenvolvimento-software]]></category>
            <category><![CDATA[chatgpt]]></category>
            <category><![CDATA[artificial-intelligence]]></category>
            <category><![CDATA[web-development]]></category>
            <category><![CDATA[inteligencia-artificial]]></category>
            <dc:creator><![CDATA[Belmiro]]></dc:creator>
            <pubDate>Wed, 09 Aug 2023 15:17:45 GMT</pubDate>
            <atom:updated>2025-10-16T01:46:06.075Z</atom:updated>
            <content:encoded><![CDATA[<h4>Ao menos não tão cedo a ponto de se preocupar</h4><p>Aproveitando o <em>hype </em>imenso que esse assunto tem levantado para trazer uma reflexão minha de que não, o ChatGPT ou qual que seja a IA que seja, <strong>não vai </strong>roubar seu emprego.</p><p>Provavelmente já tenha visto, lido ou escutado diversas opiniões sobre esse mesmo assunto que se espalhou em alta velocidade após a OpenIA ter lançado como uma bomba o seu produto: ChatGPT.</p><p>Eu também. Alguns expressando opiniões conservadores e já outros opiniões agressivas. A minha é uma das conservadoras e te digo o por que.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/0*5tvrzqGxs3T9TIAA" /><figcaption>Foto de <a href="https://unsplash.com/@possessedphotography?utm_source=medium&amp;utm_medium=referral">Possessed Photography</a> no <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><blockquote>Todas essas <em>IAs </em>são bem legais e interessantes, porém não autossuficientes — e estão bem longe de ser.</blockquote><p>Consigo gastar um bom tempo conversando com o ChatGPT e perguntando coisas aleatórias. Não somente isso! Tem sido bastante útil durante meu dia a dia de trabalho para perguntar alguma dúvida sobre alguma tecnologia ou sobre algum erro que tenho enfrentado.</p><p>Mas para ser honesto não consigo ver muito além disso. AIs ainda cometem muitos erros e não conseguem ir muito além de algo pontual. Tem dificuldade, eu diria que até mesmo não são capazes, de lidar com grandes requisitos de produto, análises complexas e grande esforços de codificação.</p><p>“Mas, pô! É só treinar mais! É só aumentar o número de parâmetros…” — pode ser um bom questionamento. Será mesmo?</p><p>Talvez a gente esteja esbarrando no maior desafio de fato somente agora, que é: <strong>a curva da “inteligência” da IA não acompanha a curva de crescimento do número de parâmetros.</strong></p><p>Isso significa que, um modelo com 5 trilhões de parâmetros não necessariamente é 5 vezes mais inteligente do que um treinado com 1 trilhão de parâmetros.</p><p>Sam Altman, CEO da OpenAI, disse recentemente que o GPT-5 não está em treinamento e “não estará por algum tempo” dado vários motivos, incluindo um muito especial. Ele afirma que vê “fim de uma era” para corrida para aumentar o número de parâmetros em modelos e não vê mais o número de parâmetros como um bom indicador de desempenho. “Acho que estamos no fim da era em que serão esses modelos gigantes, e vamos torná-los melhores de outras maneiras”.</p><p>Lendo isso acredito que o próximo desafio, e na minha opinião o maior para um salto ainda maior, será <strong>encontrar soluções para um treinamento ainda mais eficiente que com que lide melhor com grandes requisitos, grandes contextos de projeto e análises complexas e subjetivas.</strong></p><p>Quando isso chegar, ai sim acredito que seja plausível te substituir como um programador completo. <strong>Mas isso não deve acontecer a curto ou médio prazo.</strong></p><p>Por enquanto aproveite o que a ferramenta te fornece para se tornar ainda melhor. Pois a curto prazo <strong>vejo bons profissionais utilizando de forma produtiva a ferramenta e esses sim te dando um pé na bunda.</strong></p><p>Ser um bom programador não é somente programar.<strong> É também ser analítico, especialista no produto e negócio.</strong> Existe um grande trabalho mental antes de digitar um<em> if else </em>que precisa ser feito com maestria.</p><p>Não só isso, acredito que com esses modelos sendo integrados com Excel, PowerBI etc. e com o surgimento de diversos <em>plugins </em>faça com que grandes potenciais projetos não sejam necessários diminuindo a demanda.</p><p><strong>Então pode acontecer é que a régua suba </strong>para você como programador<strong> — </strong>e talvez muito com esses super modelos surgindo e evoluindo a curto prazo.</p><p>Dito isso, evite desesperar ou desanimar. <strong>Só não dorme no ponto para os próximos anos. </strong>Acredito que nós programadores encontraremos mais exigências no futuro e agora estou dizendo a curto prazo.</p><p>Antes de encerrar eu ainda gostaria de compartilhar mais uma previsão. A longo prazo ainda acho difícil o programador ser extinto. O que acredito que pode acontecer é que a linguagem de programação fique ainda mais de alto nível.</p><p>Tivemos C e Assembly que são exemplos de linguagens de baixo nível. Hoje temos Python e JavaScript que são exemplos de linguagens alto nível. Talvez o que possa acontecer no futuro é que<strong> iremos usar linguagem natural para programar </strong>— e tá tudo bem.</p><p>Ou talvez <strong>encontraremos <em>frameworks </em>inteligentes que faça um trabalho excepcional</strong> e você terá que somente desenvolver o valor do negócio — e tá tudo bem.</p><p><strong>Você ainda será necessário. De novo, só não dorme no ponto.</strong></p><p>Enfim, essas são minhas previsões. E obviamente por ser previsões podem estar todas erradas.</p><p>Obrigado por ler!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=a74602308ce" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/relaxa-chatgpt-n%C3%A3o-roubar-seu-emprego-de-programador-a74602308ce">Relaxa, ChatGPT não roubar seu emprego de programador</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[React Query (Um pouco de teoria e um pouco de prática)]]></title>
            <link>https://medium.com/reactbrasil/case-de-uso-do-react-query-5c1396b79f15?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/5c1396b79f15</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[react-query]]></category>
            <category><![CDATA[cache]]></category>
            <dc:creator><![CDATA[Mateus]]></dc:creator>
            <pubDate>Wed, 09 Aug 2023 15:17:44 GMT</pubDate>
            <atom:updated>2023-08-09T15:17:44.128Z</atom:updated>
            <content:encoded><![CDATA[<p>Buenas, pessoal. Passado alguns meses sem escrever (falta de tempo), retorno hoje para falar sobre o React Query.</p><p>O que é?</p><p>React Query é uma biblioteca de gerenciamento de estados e de requisições de dados, voltado para o React. É uma lib com uma performance muito boa para casos como:</p><pre>- buscar, fazer armazenamento em cache<br>- sincronizar async data no aplicativo</pre><p>Na prática:</p><p>Digamos que temos o seguinte problema: Estamos desenvolvendo um app que gerencia algumas tarefas, o famoso todo, como poderemos editar, pegar, escrever ou deletar, teremos uma gama de endpoints que farão essas operações:</p><pre>get <br>post<br>put<br>delete</pre><p>Fazendo isso funcionar:</p><p>Para começarmos a utilizar o react-query precisamos instalar ele usando o comando no nosso terminal: (escolha o seu gerenciador de pacote preferido)</p><pre>yarn add react-query <br>npm install react-query<br>pnpm install react-query</pre><p>Bom, como falei anteriormente, o react-query é um gerenciador de estados, então teremos que utilizar um Provider para que a children (nosso app) seja capaz de receber informações e lidar com elas conforme necessidade. Uma vez instalado e importado, ficará assim:</p><pre>import { QueryClient, QueryClientProvider } from &quot;react-query&quot;<br>import Todo from &#39;./components/Todo&#39;<br><br>const queryClient = new QueryClient()<br><br>export default function App() {<br>  return (<br>    &lt;QueryClientProvider client={queryClient}&gt;<br>      &lt;Todo /&gt;<br>    &lt;/QueryClientProvider&gt;<br>  )<br>}</pre><p>Uma vez que tenhamos feito isso, vamos ter a nossa disposição o hook useQuery, ele vai ser responsável por armazenar em cache a nossa listinha de todo, belê?</p><h3>Criando nossa lista:</h3><p>Eu criei um arquivo simples chamado Todo.jsx contendo o seguinte conteúdo:</p><pre>import React from &#39;react&#39;<br><br>export default function Todo() {<br>  return (<br>    &lt;h1&gt;Todo&lt;/h1&gt;<br>  )<br>}</pre><p>Bom, agora vamos utilizar o hook que mencionei antes para buscar e guardar no cache a nossa lista de todo.</p><p>(Mas mateus, cadê a api fake pra fazer o exemplo?) Tá aqui ó:</p><pre>{<br>  &quot;todos&quot;: [<br>    {<br>      &quot;id&quot;: 1,<br>      &quot;title&quot;: &quot;Fazer compras&quot;,<br>      &quot;completed&quot;: false<br>    },<br>    {<br>      &quot;id&quot;: 2,<br>      &quot;title&quot;: &quot;Estudar para o exame de matemática&quot;,<br>      &quot;completed&quot;: false<br>    },<br>    {<br>      &quot;id&quot;: 3,<br>      &quot;title&quot;: &quot;Fazer exercícios&quot;,<br>      &quot;completed&quot;: true<br>    },<br>    {<br>      &quot;id&quot;: 4,<br>      &quot;title&quot;: &quot;Ler um livro&quot;,<br>      &quot;completed&quot;: false<br>    }<br>  ]<br>}</pre><p>Instale os pacotes:</p><pre>yarn add axios<br>yarn add json-server --dev</pre><p>Axios para lidar com as reqs e o json-srever para simular uma fake api. Chequem a documentação de como usar o json-server, mas é simples.. No meu caso eu fiz o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*qMVDy7X3eF9utj9d24FDxw.png" /></figure><p>Dentro de api.js eu tenho o seguinte:</p><pre>import axios from &#39;axios&#39;<br><br>const api = axios.create({<br>  baseURL: &#39;http://localhost:3333&#39;<br>})<br><br>export {api}</pre><p>Para rodar a api fake abra o seu terminal e digite:</p><pre>yarn json-server --watch db.json -p 3333</pre><p>Como resultado:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/397/1*QWwdtNiJ4TO8qqYV-kGCog.png" /></figure><h3>Segue o baile:</h3><p>Uma vez que temos nossa api rodando é hora de fazer isso funcionar, voltemos ao nosso Todo.jsx, tudo acontece lá.</p><pre>import React from &#39;react&#39;<br>import { useQuery } from &#39;react-query&#39;<br>import { api } from &#39;../services/api&#39;<br><br>export default function Todo() {<br>  const { isLoading, error, data } = useQuery(&#39;todos&#39;, async () =&gt; {<br>    const response = await api.get(&#39;/todos&#39;)<br>    return response.data.todos<br>  })<br><br>  if (isLoading) {<br>    return &lt;div&gt;Carregando...&lt;/div&gt;<br>  }<br><br>  if (error) {<br>    return &lt;div&gt;Erro ao carregar todos&lt;/div&gt;<br>  }<br><br>  return (<br>    &lt;ul&gt;<br>      {data.map((todo) =&gt; (<br>        &lt;li key={todo.id}&gt;<br>          {todo.title} - {todo.completed ? &#39;concluído&#39; : &#39;pendente&#39;}<br>        &lt;/li&gt;<br>      ))}<br>    &lt;/ul&gt;<br>  )<br>}</pre><p>O que tá rolando nesse código?</p><ol><li>Estamos utilizando o hook useQuery para trazer para nós os dados que exisitrem dentro da nossa API REST. Uma coisa importante de saber é: <strong><em>Temos uma chave única para o useQuery</em></strong>, no caso, ‘todos’, ela é usada como um identificador para essa consulta a API.</li><li>Logo após isso, nós estamos verificando se o nosso dado está carregando, utilizando o isLoading, error, caso carregado com sucesso, renderiza os dados na ul.</li></ol><h3>Plus:</h3><p>Isso é um exemplo básico do básico, em partes mais complexas podemos fazer muitas coisas, por exemplo:</p><p>Com o R.Query podemos definir limte de cache, configurar do zero toda uma estrutura de atualização.</p><h4>Entendendo como o React Query olha para o cache:</h4><p>O cache é uma memória local, ela tem como responsabilidade armazenar os resultados de qualquer consulta anteriormente feita.</p><p>Quando realizamos uma consulta, o query fica observando se tal consulta não foi realizada anteriormente e se algum dado está pelo cache. Isso é o natural, mas assim, caso exista algum registro dentro do cache, o React Query vai retornar o que tiver lá, ao invés de fazer todo fluxo de chamada a uma api, por exemplo do jeito clássico:</p><pre>const myComponent = () =&gt; {<br>const [data, setData] = useState([])<br>  async function handleData() {<br>   const response = await api.get(&#39;data&#39;)<br>   setData(response.data)<br>  }<br>}<br><br>useEffect(() =&gt; {<br> handleData()<br>}, [])</pre><p>Essa jogada do react query melhora um horror o desempenho da aplicação, evita req atrás de req. (Claro, não estou dizendo pra nunca mais usar o effect, até pq isso não faria sentido, cada cenário, atores diferentes)</p><h4>Ainda sobre o cache:</h4><p>O React Query gerencia em modo automático o cache, claro, podemos configurar algumas opções, limite de tempo de cache, uma quantidade de itens para ficar em cache, tudo isso é possível também.</p><h4>Claro, tenha precauções:</h4><p>É crucial que se trate o cache de forma responsável, qualquer configuração errada vai resultar umas treta chata, principalmente dados desatualizados.</p><h3>Considerações finais</h3><p>É uma lib poderosa de fato. Pq melhora de forma significativa o desempenho da nossa aplicação, isso é um fato. Mas é aquela coisa, tenha responsabilidade na hora de usar, e mais do que isso, saiba que não serve pra tudo, no que antecede a chegada dele, sempre existiu outras formas de lidar com cache, vale destacar. Mas em boa parte de cases, sim, ele funciona muito bem.</p><p>até mais, pessoal! para quem estiver lendo isso na Sexta (17 de março), bom final de semana.</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=5c1396b79f15" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/case-de-uso-do-react-query-5c1396b79f15">React Query (Um pouco de teoria e um pouco de prática)</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[10 pacotes ESSENCIAIS para Javascript]]></title>
            <link>https://medium.com/reactbrasil/10-pacotes-essencias-para-javascript-9a37297f4bc6?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/9a37297f4bc6</guid>
            <category><![CDATA[npm]]></category>
            <category><![CDATA[desenvolvimento-web]]></category>
            <category><![CDATA[programação]]></category>
            <category><![CDATA[javascript]]></category>
            <category><![CDATA[typecript]]></category>
            <dc:creator><![CDATA[Belmiro]]></dc:creator>
            <pubDate>Sun, 18 Dec 2022 01:36:10 GMT</pubDate>
            <atom:updated>2025-10-16T01:43:46.752Z</atom:updated>
            <content:encoded><![CDATA[<h4>Muitas vezes, principalmente desenvolvedores no início de carreira, tem muitas dificuldades em encontrar bons pacotes que podem utilizar. Aqui você encontrará 10 pacotes MUST HAVE para a maioria dos projetos JavaScript</h4><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*LDM2aCUcs1W4fDJtv3Nw_w.jpeg" /></figure><h4><a href="https://www.npmjs.com/package/axios">1. Axios</a></h4><p>Quase todos projetos requerem que você faça requisições <em>HTTP</em>. Isso é geralmente necessário ao ter que consumir <em>endpoints </em>do <em>backend </em>ou algum outro serviço.</p><p>Axios, na minha opinião, é a melhor escolha para esse tipo de atividade. Realizar uma requisição é extremamente simples e intuitivo com esse pacote, se liga:</p><pre>const response = await axios.get(&#39;/seu-endpoint&#39;);</pre><p>Esse simples código acima através de uma única chamada de função te retorna uma <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Promise"><em>Promise</em></a><em> </em>com o resultado da requisição.</p><p>Com esse pacote é possível realizar requisições com todos os verbos (<em>GET</em>, <em>POST</em>, <em>PUT</em>, <em>DELETE </em>e <em>PATCH</em>) alterando somente o nome da função chamada pelo correspondente.</p><p>Além disso, tem outras diversas funcionalidades para trabalhar com <em>headers</em>, capturar erros, parâmetros, interceptar requisições e outras coisas que você pode conferir através da <a href="https://github.com/axios/axios">documentação</a>.</p><h4><a href="https://www.npmjs.com/package/luxon">2. Luxon</a></h4><p>Geralmente trabalhar com datas e horas no JavaScript é o pesadelo de qualquer desenvolvedor. A <em>API </em>nativa fornecida convenhamos que não é a melhor.</p><p>Portanto, para trabalhar com datas e horas, o Luxon é um pacote essencial que irá de fornecer uma <em>API </em>completíssima e uma <a href="https://moment.github.io/luxon/api-docs/index.html">documentação</a> legal para fazer a bagunça toda que deseja com data, horas, timezone etc.</p><blockquote>A maioria dos desenvolvedores conhecem o <a href="https://www.npmjs.com/package/moment">moment</a>, porém poucos sabem que o moment é um pacote que ele próprio se considera legado. Portanto tenha em mente o Luxon para seu projeto.</blockquote><blockquote>Uma outra alternativa bem famosa e completa que vale a pena ser mencionada é o o pacote <a href="https://www.npmjs.com/package/date-fns">date-fns</a>.</blockquote><h4><a href="https://www.npmjs.com/package/lodash">3. Lodash</a></h4><p>Sendo bem sincero, Lodash é um pacote de explicar de forma sucinta o que ele faz.</p><p>Lodash é um pacote que te fornece uma série de funções utilitárias para trabalhar com <em>arrays</em>, funções, objetos, números, textos e uma infinidade de outras coisas. Sério, é muita coisa!</p><p>Você pode conferir melhor na <a href="https://lodash.com/docs/4.17.15">documentação</a>, vai por mim, vai se surpreender com a quantidade de funções utilitárias ao seu dispor.</p><h4><a href="https://www.npmjs.com/package/big.js?activeTab=readme">4. Big.js</a></h4><p>Pode parecer que não, mas algumas vezes trabalhar com números no JavaScript pode te trazer dor de cabeça, principalmente por conta da precisão.</p><p>Um ótimo exemplo é trabalhar com moeda. Algumas vezes é chato que dói. Para isso temos esse belo pacote que te fornece uma <em>API </em>fácil para trabalhar com números com precisão.</p><p>Basicamente você irá criar instancias <em>Big </em>que representam números e você consegue realizar diversos cálculos matemáticos com precisão a partir delas.</p><p>A <a href="http://mikemcl.github.io/big.js/">documentação </a>é bem tranquilinha.</p><h4><a href="https://www.npmjs.com/package/jest">5. Jest</a></h4><p>Qualquer bom projeto que se preze necessita de ter bons testes que asseguram a confiabilidade do código. Devemos ter em mente que isso é importantíssimo em um projeto.</p><p>Jest é um pacote que te fornece um <em>framework </em>delicinha para que você possa implementar testes JavaScript de forma simples e rápida. Você não precisará configurar de engenhoso, super fácil de iniciar.</p><p>Além de ser um <em>framework </em>construído para te servir de forma simples e redonda, a <a href="https://jestjs.io/docs/getting-started">documentação</a> é bem completa e didática.</p><h4><a href="npmjs.com/package/cron">6. Cron</a></h4><p>Esse pacote é tão simples e útil… Cron é basicamente uma ferramenta que permite executar um trecho de código, uma rotina ou algo de acordo com um certo cronograma.</p><p>Exemplo simples: Todo dia, a uma hora da manhã você quer executar uma rotina que envia um e-mail a todos usuários que ainda não confirmaram sua conta — para fazer isso você usará o Cron.</p><p>Os exemplos são inúmeros e as possibilidades infinitas, tudo que você precisa de um cronograma para executar você utilizará o Cron para disparar o processo.</p><p>A <a href="https://www.npmjs.com/package/cron">documentação </a>está no próprio NPM.</p><blockquote>Para definir os parâmetros como periodicidade, dia, horário etc. será necessário passar uma expressão que no início pode parecer estranha, para tal, recomendo o uso de uma ferramenta. Existem muitas na internet, ao pesquisar por “cron expression generator” no Google irá achar diversas. eu recomendo a <a href="https://www.freeformatter.com/cron-expression-generator-quartz.html">Free Formatter</a>.</blockquote><h4><a href="https://www.npmjs.com/package/validator">7. Validator</a></h4><p>Sendo curto e grosso: um pacote que te fornece uma biblioteca com diversos validadores e sanitizadores para textos.</p><p>Precisa validar um e-mail?</p><pre>validator.isEmail(&#39;seu-email@email.com&#39;); //=&gt; Verdadeiro<br>validator.isEmail(&#39;isso-nao-eh-um-email.com&#39;); //=&gt; Falso</pre><p>Não existe nada mais simples que isso. Validar um e-mail foi só um exemplo. Você pode conferir todas as funções disponibilizadas na <a href="https://www.npmjs.com/package/validator">documentação</a> no próprio NPM.</p><blockquote>Para você, brasileirinho, segue a dica de conhecer o pacote <a href="https://www.npmjs.com/package/js-brasil">js-brasil</a> que contém várias funções úteis para o Brasil.</blockquote><h4><a href="https://www.npmjs.com/package/yup">8. Yup</a></h4><p>Yup é um pacote que te fornece um jeito de criar esquemas JavaScript para validação e <em>parsing</em>.</p><p>A <em>API </em>fornecida pelo pacote é bem completa e te permite criar formas (<em>shapes</em>) de dados na medida, complexos (caso necessário) e expressivos de acordo com o que precisar.</p><p>A <a href="https://www.npmjs.com/package/yup">documentação</a> está disponível no próprio NPM de forma explicativa e com bons exemplos.</p><blockquote>O Yup é um pouco mais voltado para clientes, uma alternativa é o <a href="https://www.npmjs.com/package/joi">joi</a> que tem o mesmo propósito. Inclusive, o Yup é inspirado no <a href="https://www.npmjs.com/package/joi">joi</a>, conforme mencionado na própria descrição do pacote.</blockquote><h4><a href="https://www.npmjs.com/package/@faker-js/faker">9. Faker</a></h4><p>Como o próprio nome já induz, é um pacote que te permite criar dados falsos — ou melhor, <em>fakes </em>— porém realísticos.</p><p>Isso é extremamente útil nos testes e desenvolvimento. Imagine que está criando testes de ponta a ponta automatizados e precisa preencher um cadastro de um novo usuário com dados que simulam a vida real.</p><pre>const usuario = faker.internet.userName()<br>const email = faker.internet.email()<br>const senha = faker.internet.password()</pre><p>Pronto, você já tem dados realísticos para utilizar no seu teste.</p><p>E é um absurdo a quantidade imensa de dados <em>fakes </em>disponíveis<em> </em>que podem ser conferidos e utilizados seguindo a <a href="https://fakerjs.dev/guide/">documentação</a>. Na lista tem contextos de endereço, finanças, músicas, animais, substantivos, imagens, veículos etc. Não da nem para listar todos aqui.</p><p>Além disso, o pacote fornece suporte ao português do Brasil, importando da seguinte forma:</p><pre>import { faker } from &#39;@faker-js/faker/locale/pt_BR&#39;;</pre><blockquote>Curiosidade sobre este pacote: Inicialmente o autor dessa biblioteca sabotou, em 2022, o <a href="https://www.npmjs.com/package/faker">pacote inicial</a> e o <a href="https://github.com/Marak/Faker.js">repositório</a> (não existe mais) em forma de protesto. Em seguida foi restaurado e a comunidade vem o mantendo.</blockquote><blockquote>Fonte: <a href="https://tecnoblog.net/noticias/2022/01/10/desenvolvedor-sabota-modulos-de-codigo-aberto-e-afeta-milhares-de-sistemas/">https://tecnoblog.net/noticias/2022/01/10/desenvolvedor-sabota-modulos-de-codigo-aberto-e-afeta-milhares-de-sistemas/</a></blockquote><h4>10. <a href="https://www.npmjs.com/package/socket.io">Socket IO</a> &amp; <a href="https://www.npmjs.com/package/socket.io-client">Socket IO Client</a></h4><p>Nesse último pacote em específico são dois pacotes que completam um propósito.</p><p>Socket IO é uma ferramenta maravilhosa que te permite construir uma verdadeira comunicação baseada em eventos. E o melhor, tudo em tempo real.</p><p>Para isso, serão necessários dois pacotes. O Socket IO será utilizado no <em>server, </em>responsável por controlar toda a comunicação — algo como a central de comunicação. Já o Socket IO Client será necessário no cliente para receber e enviar eventos — seguindo o mesmo paralelo, o dispositivo que troca eventos com a central.</p><p>Esses pacotes te permitirão construir recursos para <em>chats</em>, jogos, notificações, atualizações ao vivo, enfim, tudo que necessita de uma comunicação ativa e em tempo real.</p><p>É lindo e as possibilidades são infinitas.</p><p>Gostou? Vai fundo e olhe mais na <a href="https://socket.io/docs/v4/">documentação</a>.</p><h4>Fim</h4><p>Espero que pelo menos um pacote listado tenha sido novo para você. Use da melhor forma possível.</p><p>Tamo junto!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=9a37297f4bc6" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/10-pacotes-essencias-para-javascript-9a37297f4bc6">10 pacotes ESSENCIAIS para Javascript</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Iniciando um projeto em Gatsby]]></title>
            <link>https://medium.com/reactbrasil/iniciando-um-projeto-em-gatsby-7cbd3ae9d8fd?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/7cbd3ae9d8fd</guid>
            <category><![CDATA[react]]></category>
            <category><![CDATA[gatsby]]></category>
            <category><![CDATA[gatsbyjs]]></category>
            <category><![CDATA[graphql]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Maycon Alves]]></dc:creator>
            <pubDate>Mon, 22 Aug 2022 18:46:57 GMT</pubDate>
            <atom:updated>2023-09-01T13:49:59.181Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>É bom ter livros de citações. Gravadas na memória, elas inspiram-nos bons pensamentos. Winston Churchill.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*ZrTvLOQVlNa7AJJRK3juRg.png" /></figure><p><strong>OBS: agora tenho um blog que estou publicando meus artigos, se quiser conhecer basta clicar nesse </strong><a href="https://mayconbalves.com.br/blog"><strong>link</strong></a><strong>.</strong></p><p>O Gatsby é um framework muito interessante, tenho contato com alguns devs que já fizeram coisas bem legais e eu só tinha dado um start e olhado a estruta de pastas e o seu funcionamento, mas resolvi por a mão na massa e mudar meu website que era feito em Nextjs para Gatsby e realmente testar as funcionalidades, rotas, GraphQl e afins (ainda não terminei o refactor) mudou bastante, entre a versão 2 (quando eu fiz o teste) e a 4 que é a atual.</p><h4>Mas que diabo é essa tal de Gatsby ?</h4><pre>Gatsby é a estrutura rápida e flexível que torna a criação de sites com qualquer CMS, API ou banco de dados divertido novamente. Crie e implante sites sem cabeça que geram mais tráfego, convertem melhor e geram mais receita!</pre><p>Essa é a descrição que você pode achar no site do <a href="https://www.gatsbyjs.com/">Gatsby</a>. Ele também é baseado em ReactJs então para quem já tem uma familiaridade vai se sentir em casa, além de parecer ser bem rápido, um dos motivos dessa velocidade é o prefetch de informações de uma nova página (como assim ? Não entendi nada 😕) quando criamos um link para uma página quando fazemos o hover sobre o link ele já baixa um json da página seguinte, fazendo com que o seu carregamento seja quase que instantâneo, isso é fantástico, mas se você quiser ler um pouco mais sobre esse framework vou deixar o <a href="https://www.gatsbyjs.com/docs/quick-start/">link da documentação aqui.</a></p><h4>Get started</h4><p>Vamos iniciar um projeto usando o Gatsby, basta você rodar o seguinte comando:</p><pre>npm init gatsby</pre><p>Ele vai lhe fazer algumas perguntas:</p><pre>- Nome do projeto ?<br>- Onde vai ser instalado ?<br>- Se você quer usar JavaScript ou TypeScript ?<br>- Qual cms vai querer usar ?<br>- Qual lib de style vamos usar ?<br>- E alguns plugins que podemos instalar !!</pre><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*IQKIWdS52-MBe-svZjsmAA.png" /></figure><p>Ou seja, escolhi o nome do projeto, deixei dentro da pasta documents escolhi TypeScript, Netlify como cms, styled-components e adicionei plugin de imagem responsiva e suporte ao markdown</p><p>Essa é a estrutura inicial do nosso projeto:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/738/1*vmOVFRN2vb2oO7oRX6PLzA.png" /></figure><p>Para subir o projeto basta rodar yarn develop ou yarn start se estiver usando o npm npm run develop ou npm run start irá subir em duas portas:</p><pre><a href="http://localhost:8000/">http://localhost:8000/</a><br>e<br><a href="http://localhost:8000/___graphql">http://localhost:8000/___graphql</a></pre><p>Podemos fazer consultas no nosso GraphiQl que já está incluso dentro do Gatsby, isso é incrível, temos uma interface bem legal:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*MozcQ-4z5D594HKQcj4kHw.png" /></figure><p>Ele nos oferece muitas consultas ao lado esquerdo de forma simples, basta alguns clicks de mouse e você consegue montar suas querys de forma fácil, se você ainda não sabe o que é GraphQl <a href="https://graphql.org/learn/">leia essa doc.</a></p><p>E por último mas não menos importante, temos o arquivo gatsby-config.ts (no meu caso escolhi TS, mas se escolher JavaScript vai ser gatsby-config.js)</p><p>Nesse arquivo configuramos nossos plugins novos, para que toda aplicação possa enxergar. Obs: Sempre que mudar algo nesse arquivo é necessário baixar o servidor e subir de novo para o Gatsby entender as mudanças.</p><iframe src="" width="0" height="0" frameborder="0" scrolling="no"><a href="https://medium.com/media/bdecffc3aa802dc8b7c5906e665d5cbe/href">https://medium.com/media/bdecffc3aa802dc8b7c5906e665d5cbe/href</a></iframe><p>SiteMetadata é a chave para dados do nosso projeto, titulo, url, autor, descrição etc…</p><p>GraphqlTypage é alto explicativo e o próprio Gatsby da uma descrição do que ele faz.</p><p>Plugins é um array, com todos os nossos plugins e novos plugins que podemos instalar.</p><p>Bom é isso, espero que tenham gostado, se ainda não conhecia Gatsby acho que esse pode ser um ponta pé inicial, logo mais, vou falar um pouco mais sobre esse framework, mas eu ainda preciso estressar mais ele 😃.</p><p>Se você está pensando em criar o seu blog eu experimentar algo diferente, recomendo bastante fazer uma experiência com Gatsby, você vai se surpreender igual eu, pode acreditar.</p><p>Bem é isso, espero que tenham gostado, lembrem que qualquer informação que deixei passar, ou se quiserem adicionar qualquer coisa postem nos comentários. Se esse artigo foi útil e <a href="https://apoia.se/mepagueumcafezinho"><strong>puder me pagar um café</strong></a> ficarei feliz. Abraços quentinhos para vocês !!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=7cbd3ae9d8fd" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/iniciando-um-projeto-em-gatsby-7cbd3ae9d8fd">Iniciando um projeto em Gatsby</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[A internet de hoje]]></title>
            <link>https://medium.com/reactbrasil/a-internet-de-2022-337cdbd1a243?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/337cdbd1a243</guid>
            <category><![CDATA[web]]></category>
            <category><![CDATA[internet]]></category>
            <category><![CDATA[2022]]></category>
            <category><![CDATA[entretenimento]]></category>
            <category><![CDATA[cookies]]></category>
            <dc:creator><![CDATA[Belmiro]]></dc:creator>
            <pubDate>Mon, 22 Aug 2022 18:46:54 GMT</pubDate>
            <atom:updated>2025-10-16T01:43:35.268Z</atom:updated>
            <content:encoded><![CDATA[<h4>Quinta-feira, 20 horas.</h4><p>Você acessa um <em>site </em>e aguarda o carregar… agora, aceita os <em>cookies </em>padrões, fecha a chata janela solicitando que se inscreva na <em>newsletter,</em> procura o conteúdo em meios as propagandas e o que estava procurando mesmo? Você já nem se lembra mais.</p><p>Seu erro foi querer navegar na <em>internet, </em>igual fazia e em 2012.</p><p>Agora são novos tempos: <em>cookies</em>, <em>newsletters, sites </em>pesados,<em> </em>propagandas e assinaturas. Quando resolver abrir um <em>site </em>lembre-se de saber muito bem o por que está abrindo, caso contrario perderá seu tempo.</p><figure><img alt="Cookies in a white background" src="https://cdn-images-1.medium.com/max/1024/1*v8bBuNZB5DfTkPdX08T_GQ.jpeg" /></figure><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=337cdbd1a243" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/a-internet-de-2022-337cdbd1a243">A internet de hoje</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como esvaziar arrays em JavaScript]]></title>
            <link>https://medium.com/reactbrasil/esvaziar-arrays-em-javascript-824a5eccec26?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/824a5eccec26</guid>
            <category><![CDATA[js]]></category>
            <category><![CDATA[arrays]]></category>
            <category><![CDATA[javascript-development]]></category>
            <category><![CDATA[front-end-development]]></category>
            <category><![CDATA[javascript]]></category>
            <dc:creator><![CDATA[Maycon Alves]]></dc:creator>
            <pubDate>Tue, 05 Jul 2022 12:33:01 GMT</pubDate>
            <atom:updated>2023-09-01T13:50:52.561Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>O que sabemos é uma gota; o que ignoramos é um oceano. Isaac Newton.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/900/1*NDojKFkqkGU86VwXm1bM9Q.jpeg" /></figure><p><strong>OBS: agora tenho um blog que estou publicando meus artigos, se quiser conhecer basta clicar nesse </strong><a href="https://mayconbalves.com.br/blog"><strong>link</strong></a><strong>.</strong></p><p>Galera no dia-a-dia estamos acostumados a trabalhar muito com objetos e arrays, mas as vezes eles podem complicar nossa vida se não soubermos estruturar bem um objeto ou se não soubermos manipular um array, em ambos os casos temos diversos caminhos e fazer diversas coisas diferentes, mas nesse post resolvi trazer uma coisa mais de base do JavaScript que nada mais é do que esvaziar um array, ou seja, vamos preencher um array de várias formas e vamos ver como deixar ele vazio.</p><h4>Mas o que é um array ?</h4><p>Na faculdade é bem comum, os professores falaram que precisamos criar uma lista e iterar sobre ela, e se você é novo em tecnologia e começou aprender HTML e CSS agora, não estou falando da tag, &lt;ul&gt;, &lt;li&gt; e &lt;ol&gt; e sim criar um array 😃.</p><p>Arrays são objetos ( sim arrays são objetos, confuso não ? 😕 ) que na verdade são listas e eles tem vários métodos que nos ajudam a manipularmos de várias formas diferentes, não vou falar sobre todos eles, pois são muitos, mas escrevi três artigos explicando os principais, vou deixar os links aqui ( <a href="https://medium.com/trainingcenter/m%C3%A9todos-para-arrays-em-javascript-parte-01-2d56909afcb8">parte 1</a>, <a href="https://medium.com/trainingcenter/m%C3%A9todos-para-arrays-em-javascript-parte-02-461beca1a24a">parte 2</a>, <a href="https://medium.com/trainingcenter/m%C3%A9todos-para-arrays-em-javascript-parte-03-ba4bf48406c3">parte 3</a> ). Um array não tem tamanho nem tipo fixo, então o array é dinâmico e podemos colocar, strings, number, objetos etc…</p><p>Agora vamos brincar um pouco com nossos arrays, primeiro vamos de fato conferir se arrays são ou não objetos:</p><pre>var arr = [1, 2, 3]</pre><pre>console.log(typeof arr) // object</pre><p>Vamos ver o tamanho no nosso array:</p><pre>var arr = [1, 2, 3]</pre><pre>console.log(arr.length) // 3</pre><p>Obs: um array é iniciado na posição zero, então as posições do array acima serão:</p><pre>elementos [1, 2, 3]</pre><pre>posições [0, 1, 2]</pre><p>Agora o motivo desse artigo, vamos aprender algumas formas de zerar um array, podemos simplesmente redeclarar um array:</p><pre>var arr = [1, 2, 3]<br>arr = []</pre><pre>console.log(arr) // []<br>console.log(arr.length) // 0</pre><pre>ou</pre><pre>var arr = [1, 2, 3]<br>arr = 0</pre><pre>console.log(arr) // 0<br>console.log(arr.length) // undefined</pre><p>No segundo caso temos undefined pois transformamos nosso array em um number e esse tipo de dado em JavaScript não possui a propriedade length, podemos falar sobre tipos de dados em outro post 😃.</p><p>Podemos mudar o length dele na força bruta 👊:</p><pre>var arr = [1, 2, 3]<br>arr.length = 0</pre><p>Também podemos usar da maneira mais moderna:</p><pre>let arr = [1, 2, 3] // usando let<br>arr = []</pre><pre>console.log(arr) // []<br>console.log(arr.length) // 0</pre><pre>ou</pre><pre>let arr = [1, 2, 3]<br>arr = 0</pre><pre>console.log(arr) // 0<br>console.log(typeof arr) // number<br>console.log(arr.length) // undefined</pre><p>Também podemos tentar dessa forma:</p><pre>const arr = [1, 2, 3] // usando const<br>arr = []</pre><pre>console.log(arr)</pre><p>Isso gera um erro, pois não podemos reatribuir uma const e também podemos usar o método splice() para fazer esse serviço para nós:</p><pre>let arr = [1, 2, 3]</pre><pre>arr.splice(0, arr.length)<br>console.log(arr) // []</pre><p>Bem é isso, espero que tenham gostado, lembrem que qualquer informação que deixei passar, ou se quiserem adicionar qualquer coisa postem nos comentários. Se esse artigo foi útil e <a href="https://apoia.se/mepagueumcafezinho"><strong>puder me pagar um café</strong></a> ficarei feliz. Abraços quentinhos para vocês !!</p><p>Fontes:</p><p>MDN: <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array">https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array</a></p><p>Delfstack: <a href="https://www.delftstack.com/howto/javascript/how-to-empty-an-array-in-javascript/">https://www.delftstack.com/howto/javascript/how-to-empty-an-array-in-javascript/</a></p><p>JS tutorials: <a href="https://www.javascripttutorial.net/array/4-ways-empty-javascript-array/">https://www.javascripttutorial.net/array/4-ways-empty-javascript-array/</a></p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=824a5eccec26" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/esvaziar-arrays-em-javascript-824a5eccec26">Como esvaziar arrays em JavaScript</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como usar nvm no ubuntu]]></title>
            <link>https://medium.com/reactbrasil/usando-nvm-no-ubuntu-680ac343af43?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/680ac343af43</guid>
            <category><![CDATA[nodejs]]></category>
            <category><![CDATA[linux]]></category>
            <category><![CDATA[node]]></category>
            <category><![CDATA[nvm]]></category>
            <category><![CDATA[ubuntu]]></category>
            <dc:creator><![CDATA[Maycon Alves]]></dc:creator>
            <pubDate>Tue, 05 Jul 2022 12:32:59 GMT</pubDate>
            <atom:updated>2023-09-01T13:52:37.964Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>Quando escrito em chinês a palavra crise compõe-se de dois caracteres: um representa perigo e o outro representa oportunidade. John Kennedy.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*5zVlRFwp4J29mFZ9wDAR1Q.jpeg" /></figure><p><strong>OBS: agora tenho um blog que estou publicando meus artigos, se quiser conhecer basta clicar nesse </strong><a href="https://mayconbalves.com.br/blog"><strong>link</strong></a><strong>.</strong></p><p>Há algum tempo escrevi um artigo de como instalar a nvm no windows se você não leu ele ainda, pode <a href="https://medium.com/reactbrasil/usando-nvm-no-windows-d46f018935ef">clicar aqui</a>.</p><p>Mas como voltei a trabalhar com linux (ainda bem que isso aconteceu) não tenho nada contra windows, até me surpreendi positivamente em um ano de trabalho com esse SO, mas acho que ele ainda está muito longe do MacOS e qualquer versão de linux. Chega de choro e bora para o artigo.</p><p>Hoje em dia é bom comum você trabalhar em mais de um projeto ao mesmo tempo com uma máquina só, as vezes no trabalho e as vezes em alguns projetos pessoais, eu acabo fazendo bastante isso, e isso pode causar um pequeno problema para rodar os seus projetos, pois package.json pode não aceitar a versão mais atual do node e isso pode causar uma certa dor de cabeça, por isso no lugar de instalar direto a última versão do node ou uma versão especifica você pode instalar o nvm (gerenciador de versões do node) para que você consiga controlar a versão do node que cada projeto seu necessita.</p><p>Dito isso bora instalar no nosso ubuntu, primeiro vamos baixar na máquina:</p><pre>curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash</pre><pre>ou</pre><pre>wget -qO- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.1/install.sh | bash</pre><p>Ele vai ser baixado em uma pasta oculta nesse caminho ~/.nvm e você precisa adicionar um snippet no perfil do seu terminal, se você usa zsh igual eu precisa adicionar dentro do ~/.zshrc se usa bash adicione no ~/.bashrc com snippet assim que abrir o terminal ele vai conseguir ler o source de onde foi instalado o nvm:</p><pre>export NVM_DIR=&quot;$([ -z &quot;${XDG_CONFIG_HOME-}&quot; ] &amp;&amp; printf %s &quot;${HOME}/.nvm&quot; || printf %s &quot;${XDG_CONFIG_HOME}/nvm&quot;)&quot;<br>[ -s &quot;$NVM_DIR/nvm.sh&quot; ] &amp;&amp; \. &quot;$NVM_DIR/nvm.sh&quot;</pre><p>Pronto. Feche o terminal e abra novamente, para verificar se está tudo certinho basta rodar esse comando:</p><pre>command -v nvm</pre><p>O terminal mostrará o seguinte:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/698/1*2NU9jjErEM4mggQ31_hVBQ.png" /></figure><p>Significa que foi instalado com sucesso, e agora vamos para parte mais legal, instalar uma versão de node na máquina, é só rodar um comando:</p><pre>nvm install node</pre><p>Dessa forma vai instalar a última versão do node válida, se quiser instalar uma versão especifica basta rodar o comando:</p><pre>nvm install 14.15.0</pre><p>Para trocar sua versão de node atual, imaginando que você instalou as duas versões acima a lasted e a versão 14.15.0 e está usando a lasted em um terminal, você pode abrir outro terminal e rodar o comando:</p><pre>nvm use node 14.15.0</pre><p>Você também pode listar todas as versões do node que tem instalado no seu terminal e as versão que podem ser instaladas:</p><pre>nvm ls</pre><p>E se você estiver tendo algum problema com a sua nvm, para desinstalar basta executar:</p><pre>rm -rf &quot;$NVM_DIR&quot;</pre><p>Bom é bem simples, fazia um tempo que não escrevia, pois estava em uma transição de emprego e estava de férias então por isso estou há mais de um mês sem escrever, se quiser ver essa explicação direto no github da galera está aqui: <a href="https://github.com/nvm-sh/nvm#installing-and-updating">https://github.com/nvm-sh/nvm#installing-and-updating</a> da uma força para os caras e dá um estrelinha para eles.</p><p>Bem é isso, espero que tenham gostado, lembrem que qualquer informação que deixei passar, ou se quiserem adicionar qualquer coisa postem nos comentários. Se esse artigo foi útil e <a href="https://apoia.se/mepagueumcafezinho"><strong>puder me pagar um café</strong></a> ficarei feliz. Abraços quentinhos para vocês !!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=680ac343af43" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/usando-nvm-no-ubuntu-680ac343af43">Como usar nvm no ubuntu</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Como fazer background gradiente com css]]></title>
            <link>https://medium.com/reactbrasil/como-fazer-background-gradiente-com-css-b5585c938e74?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/b5585c938e74</guid>
            <category><![CDATA[css]]></category>
            <category><![CDATA[gradient]]></category>
            <category><![CDATA[frontend]]></category>
            <category><![CDATA[css3]]></category>
            <category><![CDATA[css-gradient]]></category>
            <dc:creator><![CDATA[Maycon Alves]]></dc:creator>
            <pubDate>Tue, 05 Jul 2022 12:32:58 GMT</pubDate>
            <atom:updated>2023-09-01T13:51:38.622Z</atom:updated>
            <content:encoded><![CDATA[<blockquote>Aquilo que se faz por amor está sempre além do bem e do mal. Friedrich Nietzsche.</blockquote><figure><img alt="" src="https://cdn-images-1.medium.com/max/660/1*OmGMQQL8rC-tbiI6uDZCvg.png" /></figure><p><strong>OBS: agora tenho um blog que estou publicando meus artigos, se quiser conhecer basta clicar nesse </strong><a href="https://mayconbalves.com.br/blog"><strong>link</strong></a><strong>.</strong></p><p>O nosso tão querido (e muitas vezes odiado) css está em uma evolução bem bacana, hoje em dia conseguimos fazer coisas bem legais com, se você quiser acompanhar algumas dessas novas features só <a href="https://caniuse.com/ciu/news">clicar aqui.</a> Mas eu vim falar um pouco sobre background antigamente por falta de recursos mais avançado no css, para fazer um background de uma landpage, site mais descolado e afins, alguns desenvolvedores usavam imagens e manipulavam essas imagens e conseguiam (por um milagre 😃) efeitos bem legais.</p><p>Pensando nisso eu vim mostrar como fazer um background diferente, eu acho bem legal usar gradientes, mas a minha esposa acha cafona (não a culpo) pois tem algumas coisas um pouco exageradas, tem uma galera que quer fazer gradiente em tudo e isso pode levar um resultado não tão legal, mas bora parar de falar e por a mão na massa.</p><p>Para fazermos um gradient simples, usamos o atributo background junto com a função linear-gradient() que cria uma imagem que consiste em uma transição progressiva entre duas ou mais cores.</p><p>Com a linear-gradient() você pode escolher de qual lado começa e termina sua cor linear-gradient(to left, #cor) ou se ela começa de cima para baixo e vice-versa linear-gradient(to top, #cor).</p><p>O gradient linear é definido por um eixo então também podemos trabalhar com graus dentro da função, para ficar mais explicito e claro o eixo da função é calculado dessa forma:</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/309/1*rCa-dkl8uUmNi9i8L62vnA.png" /><figcaption>fonte: <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient">https://developer.mozilla.org/en-US/docs/Web/CSS/gradient/linear-gradient</a></figcaption></figure><p>Então também podemos declarar nosso background desse jeito background: linear-gradient(0deg, #cor) eles funcionam da seguinte forma equivalente as posições, top, right, bottom e left, isso em graus 0, 90, 180 e 270 respectivamente, lembrando que se for usar alguma posição, você precisa do prefixo to dessa forma to left. Lembrando que é baseado em um circulo então você pode considerar qualquer ângulo de até 360 graus então declarando com graus você tem mais liberdade para fazer coisas legais com o gradiente.</p><p>Só uma observação que o linear-gradient por default ele começa na posição top ou 0 graus.</p><p>Agora vamos alguns exemplos, que eu vou deixar aqui nesse link que eu fiz direto no codesandbox para facilitar e não encher de código aqui no artigo e poluir muito a leitura de vocês.</p><p><a href="https://codesandbox.io/embed/sad-mclean-3knyv7?fontsize=14&amp;hidenavigation=1&amp;theme=dark">https://codesandbox.io/embed/sad-mclean-3knyv7?fontsize=14&amp;hidenavigation=1&amp;theme=dark</a></p><p>Bem é isso, espero que tenham gostado, lembrem que qualquer informação que deixei passar, ou se quiserem adicionar qualquer coisa postem nos comentários. Se esse artigo foi útil e <a href="https://apoia.se/mepagueumcafezinho"><strong>puder me pagar um café</strong></a> ficarei feliz. Abraços quentinhos para vocês !!</p><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=b5585c938e74" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/como-fazer-background-gradiente-com-css-b5585c938e74">Como fazer background gradiente com css</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
        <item>
            <title><![CDATA[Construindo um chat usando React-Native e Firebase. Parte 1]]></title>
            <link>https://medium.com/reactbrasil/construindo-um-chat-usando-react-native-e-firebase-parte-1-2f5cb62e87c4?source=rss----67aa76e93e61---4</link>
            <guid isPermaLink="false">https://medium.com/p/2f5cb62e87c4</guid>
            <category><![CDATA[firebase]]></category>
            <category><![CDATA[react-native]]></category>
            <category><![CDATA[chat]]></category>
            <category><![CDATA[react]]></category>
            <category><![CDATA[mobile-app-development]]></category>
            <dc:creator><![CDATA[Wes Guirra]]></dc:creator>
            <pubDate>Thu, 17 Mar 2022 20:58:17 GMT</pubDate>
            <atom:updated>2023-01-03T19:51:10.159Z</atom:updated>
            <content:encoded><![CDATA[<figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*T9QlX9yUzxKJZwBNxdLuyg.png" /></figure><p>Este artigo oferece uma visão geral para implementar uma aplicação de chat utilizando React-Native e Firebase, bem como algumas bibliotecas para auxiliarem na manipulação dos dados no Firebase. Seja você um desenvolvedor React iniciante ou experiente, este artigo tem o que muitos buscam para entender como funciona uma estrutura básica de uma aplicação de chat.</p><p>Como já sabem eu sempre prezo pela legibilidade e a simplicidade do código para manter o conteúdo bem acessível e simples de seguir então vou privar esse tutorial de qualquer biblioteca ou conceito o qual eu entenda que pode deixar a compreensão deste conteúdo mais dificil, salvo o caso da biblioteca do firebase que é estritamente necessária para o serviço que estou utilizando (Firebase).</p><p>Um chat de ínicio parece algo bem complexo, no geral eu acreditava que teria grande dificuldade em tratar as mensagens real-time, não vou dizer que é uma tarefa simples, até porque é trabalhosa, mas não é uma tarefa que precisei pensar muito na lógica, no fim foi apenas usar o que o próprio firebase já disponibiliza, agora chega de conversa e vamos para o post.</p><p>Como de costume deixo aqui o que acredito ser os requisitos necessários para que você consiga compreender bem esse artigo e replicá-lo com certa facilidade.</p><h3>Pré-requisitos e conhecimentos prévios desejáveis:</h3><p>Estou considerando aqui que você já sabe o básico sobre layout (CSS) e também criar um projeto em React-Native, dito isto, vou ignorar toda a parte de criação e configuração do projeto, os conhecimentos que você vai precisar são:</p><ul><li>React Native;</li><li>Layout com FlexBox;</li><li>React Navigation;</li><li>Conta Google para utilizar o Firebase.</li></ul><p>Como sempre também vou tentar ser o mais sucinto possível, objetivando a simplicidade do código em poucas linhas.</p><h3>Criando o projeto no firebase:</h3><p>Acesse o console do firebase e crie um novo projeto, esse passo é muito simples, é basicamente clicar próximo, próximo e finalizar, tão simples quanto instalar um programa no Windows.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*QYLa6___RfMwXgwVcaZgjA.png" /><figcaption>Tela de criação do projeto no console do Firebase</figcaption></figure><p>Com o projeto criado vamos agora criar um <a href="https://firebase.google.com/docs/database?hl=pt-BR">banco de dados realtime</a>, um banco de dados realtime permite que você armazene e sincronize dados com um banco de dados na nuvem NoSQL (tipo MongoDB). Eles são sincronizados em todos os clientes, em tempo real, e permanecem disponíveis quando o app está off-line.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/1024/1*B5gqDlvERnqGRenUon8dnA.png" /></figure><p>Como o projeto é apenas de teste eu vou utilizar um banco no modo teste.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/852/1*BHMuWI217_m_c7DznQDy_A.png" /></figure><p>Com o banco criado, eu já posso organizar as chaves do meu banco, eu por exemplo gosto de utilizar uma chave chamada chats, essa chave será como um Array que irá reunir todos os chats da minha aplicação, você pode entender chats aqui sendo como as conversas do WhatsApp.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/951/1*1f8M2Mddr5S1szbsYynBRw.png" /><figcaption>Estrutura de dados do banco</figcaption></figure><p>Cada chat tem como chave um id único e o conteúdo será uma chave messages que será como um Array contendo cada mensagem daquela conversa.</p><p>Agora que já configurei o firebase como precisamos, podemos seguir para o código.</p><p>O primeiro passo com o código será de construir o layout, acho importante começar por essa parte para para ter algo visual para trabalhar depois, você pode utilizar de templates ou bibliotecas para essa parte de layout, caso queira pular essa parte de layout e partir para a lógica do chat é só clicar aqui.</p><h3>Construindo o layout da tela de conversas</h3><p>Aqui estou utilizando React-Native então vou criar o layout com base na tela pequena de um celular.</p><p>vamos criar inicialmente um Array para termos um mock com o mesmo formato de dados que vamos consumir do firebase mais tarde.</p><pre>const chats = [<br>  {<br>    id: 1,<br>    users: [<br>      {<br>        id: 32,<br>        phone: &#39;+5511999882323&#39;,<br>      },<br>      {<br>        id: 99,<br>        phone: &#39;+5521991234321&#39;,<br>      },<br>    ],<br>    messages: [<br>      {<br>        id: &#39;-MLjvqRCEhOCF2MAFjng&#39;,<br>        content: &#39;Oi, tudo bem?&#39;,<br>        sent: &#39;2020-11-09T22:16:40-04:00&#39;,<br>        sentBy: 99,<br>      },<br>      {<br>        id: &#39;-MLjvqRCEhOCF2MAFjng&#39;,<br>        content: &#39;Tudo sim e contigo?&#39;,<br>        sent: &#39;2020-11-09T22:16:40-04:00&#39;,<br>        sentBy: 32,<br>      },<br>    ],<br>  },<br>  {<br>    id: 2,<br>    users: [<br>      {<br>        id: 32,<br>        phone: &#39;+5511999882323&#39;,<br>      },<br>      {<br>        id: 99,<br>        phone: &#39;+5532988882222&#39;,<br>      },<br>    ],<br>    messages: [<br>      {<br>        id: &#39;-MLjvqRCEhOCF2MAFjng&#39;,<br>        content: &#39;E aquele conteúdo sobre como criar um chat?&#39;,<br>        sent: &#39;2020-11-09T22:16:40-04:00&#39;,<br>        sentBy: &#39;+5511999990000&#39;,<br>      },<br>    ],<br>  },<br>];</pre><p>A tela inicial dessa aplicação irá listar os chats/conversas, vamos construi-la com o seguinte código.</p><pre>import React from &#39;react&#39;<br>import {SafeAreaView, StyleSheet, Text} from &#39;react-native&#39;<br>import ChatItem from &#39;./ChatItem&#39;<br><br>const currentUser = 32<br><br>const chatsMock = [<br>  {<br>    id: 1,<br>    users: [<br>      {<br>        id: 32,<br>        phone: &#39;+5511999882323&#39;,<br>      },<br>      {<br>        id: 99,<br>        phone: &#39;+5521991234321&#39;,<br>      },<br>    ],<br>    messages: [<br>      {<br>        id: &#39;-MLjvqRCEhOCF2MAFjng&#39;,<br>        content: &#39;Oi, tudo bem?&#39;,<br>        sent: &#39;2020-11-09T22:16:40-04:00&#39;,<br>        sentBy: &#39;+5511999990000&#39;,<br>      },<br>    ],<br>  },<br>  {<br>    id: 2,<br>    users: [<br>      {<br>        id: 32,<br>        phone: &#39;+5511999882323&#39;,<br>      },<br>      {<br>        id: 99,<br>        phone: &#39;+5532988882222&#39;,<br>      },<br>    ],<br>    messages: [<br>      {<br>        id: &#39;-MLjvqRCEhOCF2MAFjng&#39;,<br>        content: &#39;E aquele conteúdo sobre como criar um chat?&#39;,<br>        sent: &#39;2020-11-09T22:16:40-04:00&#39;,<br>        sentBy: &#39;+5511999990000&#39;,<br>      },<br>    ],<br>  },<br>]<br><br>const styles = StyleSheet.create({<br>  container: {<br>    marginTop: 16,<br>    marginHorizontal: 16,<br>  },<br>  title: {<br>    fontSize: 32,<br>    fontWeight: &#39;800&#39;,<br>    marginTop: 32,<br>  },<br>})<br><br>const Chats = () =&gt; {<br>  return (<br>    &lt;SafeAreaView style={styles.container}&gt;<br>      &lt;Text style={styles.title}&gt;Chats&lt;/Text&gt;<br>      {chatsMock.map((chat) =&gt; (<br>        &lt;ChatItem chat={chat} currentUser={currentUser} /&gt;<br>      ))}<br>    &lt;/SafeAreaView&gt;<br>  )<br>}<br><br>export default Chats</pre><p>O código é bem simples, basicamente um map do Array de chats, é importante que os componentes de chat recebam algum tipo de informação sobre o usuário atual, assim conseguiremos facilmente diferenciar um usário do outro na hora de mostrar os balões de chat por exemplo.</p><p>Aqui nesse componente eu utilizei um valor fixo currentUser cujo valor é o id do usuário atual, perceba que esse valor é passado via prop para o component ChatItem, o qual usa essa informação para definir quem está enviando e quem está recebendo a mensagem.</p><pre>import React from &#39;react&#39;;<br>import {Image, StyleSheet, Text, View} from &#39;react-native&#39;;<br>import UserDefaultImage from &#39;./user.png&#39;;<br><br>const styles = StyleSheet.create({<br>  chatItemContainer: {<br>    flexDirection: &#39;row&#39;,<br>    marginVertical: 16,<br>  },<br>  userPairImage: {<br>    width: 38,<br>    height: 38,<br>    marginRight: 12,<br>  },<br>  userPairPhone: {<br>    fontWeight: &#39;500&#39;,<br>    marginBottom: 6,<br>  },<br>  chatLastMessage: {<br>    fontWeight: &#39;300&#39;,<br>    color: &#39;#999&#39;,<br>  },<br>  container: {<br>    marginTop: 16,<br>    marginHorizontal: 16,<br>  },<br>});<br><br>const ChatItem = ({chat, currentUser}) =&gt; {<br>  const [userPair] = chat.users.filter((u) =&gt; u.id !== currentUser);<br>  return (<br>    &lt;View key={chat.id} style={styles.chatItemContainer}&gt;<br>      &lt;Image source={UserDefaultImage} style={styles.userPairImage} /&gt;<br>      &lt;View&gt;<br>        &lt;Text style={styles.userPairPhone}&gt;{userPair.phone}&lt;/Text&gt;<br>        &lt;Text style={styles.chatLastMessage}&gt;<br>          {chat.messages[chat.messages.length - 1]?.content}<br>        &lt;/Text&gt;<br>      &lt;/View&gt;<br>    &lt;/View&gt;<br>  );<br>};<br><br>export default ChatItem;</pre><p>Ali na linha 30 fazemos um filtro dos usuários do chat, buscando todos usuários com id diferente do usuário atual, como neste projeto o número de pessoas em um mesmo chat é sempre dois, o valor retornado pelo filter será sempre um Array com um item, logo destruturamos esse item para a variável userPair.</p><p>Caso não entenda como a destruturação na linha 30 está acontecendo sugiro ler a documentação dessa técnica na MDN:</p><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Operators/Destructuring_assignment">Atribuição via desestruturação (destructuring assignment) - JavaScript | MDN</a></p><figure><img alt="" src="https://cdn-images-1.medium.com/max/561/1*qgTbpUjsfG4j4Ayvjb8WNQ.png" /><figcaption>Tela de chats mockada</figcaption></figure><p>Com isso já temos a tela de chats mockada (isto é com dados fixos), agora vamos passar para a próxima tela que irá mostrar as mensagens do chat ou melhor dizendo a tela do chat em si.</p><h4>Construindo o layout da tela de chat</h4><p>É importante deixar claro que por motivos didáticos estou ignorando aqui os passos de configuração da navegação deste projeto, mas é um passo que será necessário em qualquer projeto, independente da tecnologia, sugiro que primeiro domine o assunto de navegação entre telas, já que muitos parâmetros são passados pela navegação.</p><p>Vou deixar o mínimo de configuração no código final, mas não entrarei nos detalhes sobre navegação neste post.</p><p>A tela de chat terá o seguinte código:</p><pre>import React, {Fragment, useState} from &#39;react&#39;;<br>import {<br>  KeyboardAvoidingView,<br>  Platform,<br>  SafeAreaView,<br>  ScrollView,<br>  StyleSheet,<br>  Text,<br>  TextInput,<br>  TouchableOpacity,<br>  View,<br>} from &#39;react-native&#39;;<br>import {Colors} from &#39;react-native/Libraries/NewAppScreen&#39;;<br>import Balloon from &#39;./Balloon&#39;;<br><br>const KEYBOARD_AVOIDING_BEHAVIOR = Platform.select({<br>  ios: &#39;padding&#39;,<br>  android: &#39;height&#39;,<br>});<br><br>const styles = StyleSheet.create({<br>  container: {<br>    marginTop: 16,<br>    marginHorizontal: 16,<br>  },<br>  scrollViewContainer: {<br>    paddingHorizontal: 10,<br>    paddingVertical: 10,<br>    top: 10,<br>  },<br>  sendButton: {<br>    backgroundColor: Colors.primary,<br>    color: Colors.white,<br>    height: 40,<br>    width: 70,<br>    alignItems: &#39;center&#39;,<br>    justifyContent: &#39;center&#39;,<br>    borderRadius: 20,<br>    marginRight: 5,<br>  },<br>  messageTextInputContainer: {<br>    justifyContent: &#39;flex-end&#39;,<br>    paddingHorizontal: 5,<br>    paddingVertical: 5,<br>    borderColor: &#39;transparent&#39;,<br>    borderTopColor: Colors.light,<br>    alignItems: &#39;center&#39;,<br>    flexDirection: &#39;row&#39;,<br>  },<br>  messageTextInput: {<br>    flex: 1,<br>    minHeight: 40,<br>    maxHeight: 90,<br>    paddingHorizontal: 12,<br>    fontSize: 17,<br>    paddingTop: 8,<br>    marginHorizontal: 5,<br>    borderColor: Colors.light,<br>    borderWidth: 1,<br>    backgroundColor: Colors.white,<br>    borderRadius: 20,<br>  },<br>});<br><br>const Chat = ({route}) =&gt; {<br>  const [message, setMessage] = useState(&#39;&#39;)<br>  const {chat, currentUser} = route.params<br>  return (<br>    &lt;Fragment&gt;<br>      &lt;ScrollView contentContainerStyle={styles.scrollViewContainer}&gt;<br>        {chat &amp;&amp;<br>          chat.messages.map((message) =&gt; (<br>            &lt;Balloon message={message} currentUser={currentUser} /&gt;<br>          ))}<br>      &lt;/ScrollView&gt;<br>      &lt;KeyboardAvoidingView<br>        behavior={KEYBOARD_AVOIDING_BEHAVIOR}<br>        keyboardVerticalOffset={76}&gt;<br>        &lt;SafeAreaView&gt;<br>          &lt;View style={styles.messageTextInputContainer}&gt;<br>            &lt;TextInput<br>              style={styles.messageTextInput}<br>              placeholder=&quot;Digite sua mensagem...&quot;<br>              placeholderTextColor={Colors.light}<br>              multiline<br>              value={message}<br>            /&gt;<br>            &lt;TouchableOpacity<br>              style={styles.sendButton}<br>              disabled={!message}<br>              onPress={() =&gt; null}&gt;<br>              &lt;Text&gt;Enviar&lt;/Text&gt;<br>            &lt;/TouchableOpacity&gt;<br>          &lt;/View&gt;<br>        &lt;/SafeAreaView&gt;<br>      &lt;/KeyboardAvoidingView&gt;<br>    &lt;/Fragment&gt;<br>  );<br>};<br><br>export default Chat;</pre><p>O código é basicamente composto em sua maioria por tudo que você já conhece do React e React-Native, mas observe que utilizei alguns componentes como KeyboardAvoidingView e SafeAreaView para não termos problema com as interações, e também que extraio o currentUser e o chat dos params da navigation.</p><p>O component Balloon precisa de alguns tratamentos no posicionamento e cor para sabermos quando é uma mensagem enviada e quando é uma recebida:</p><pre>import React from &#39;react&#39;<br>import {StyleSheet, Text, View} from &#39;react-native&#39;<br>import {Colors} from &#39;react-native/Libraries/NewAppScreen&#39;<br><br>const styles = StyleSheet.create({<br>  bubbleWrapper: {<br>    flexDirection: &#39;column&#39;,<br>  },<br>  bubbleWrapperSent: {<br>    alignSelf: &#39;flex-end&#39;,<br>    marginLeft: 40,<br>  },<br>  bubbleWrapperReceived: {<br>    alignSelf: &#39;flex-start&#39;,<br>    marginRight: 40,<br>  },<br>  balloon: {<br>    paddingHorizontal: 8,<br>    paddingVertical: 8,<br>    borderRadius: 16,<br>  },<br>  balloonSent: {<br>    backgroundColor: Colors.white,<br>  },<br>  balloonReceived: {<br>    backgroundColor: Colors.primary,<br>  },<br>  balloonText: {<br>    fontSize: 18,<br>  },<br>  balloonTextSent: {<br>    color: Colors.black,<br>  },<br>  balloonTextReceived: {<br>    color: Colors.white,<br>  },<br>})<br><br>const Balloon = ({message, currentUser}) =&gt; {<br>  const sent = currentUser === message.sentBy;<br>  const balloonColor = sent ? styles.balloonSent : styles.balloonReceived;<br>  const balloonTextColor = sent<br>    ? styles.balloonTextSent<br>    : styles.balloonTextReceived;<br>  const bubbleWrapper = sent<br>    ? styles.bubbleWrapperSent<br>    : styles.bubbleWrapperReceived;<br>  return (<br>    &lt;View&gt;<br>      &lt;View style={{...styles.bubbleWrapper, ...bubbleWrapper}}&gt;<br>        &lt;View style={{...styles.balloon, ...balloonColor}}&gt;<br>          &lt;Text style={{...styles.balloonText, ...balloonTextColor}}&gt;<br>            {message.content}<br>          &lt;/Text&gt;<br>        &lt;/View&gt;<br>      &lt;/View&gt;<br>    &lt;/View&gt;<br>  )<br>}<br><br>export default Balloon</pre><p>Perceba que da linha 41 até a 47 é basicamente um tratamento nos estilos para exibirmos as mensagens da forma correta, alinhando as mensagens recebidas usando display flex com align-self nos balões de chat.</p><p>Perceba que também mudamos a cor de acordo com a mensagem, mensagens enviadas possuem a cor branca, recebidas a cor primária no caso ciano.</p><figure><img alt="" src="https://cdn-images-1.medium.com/max/561/1*Z-TkerxkAznLSbs3MebixQ.png" /></figure><p>E galera para manter que este conteúdo não ficar massivo e longo vou continuar este conteúdo em uma parte 2 que estará disponível em breve, assim que eu finalizar eu vou substituir essa seção com o link.</p><p>De qualquer forma vou deixar aqui a primeira parte do código para que vocês já consigam replicar ao menos o layout.</p><p>Obrigado! Te vejo na parte 2!</p><p><a href="https://github.com/digital-heroes/firebase-chat">GitHub - digital-heroes/firebase-chat</a></p><p>Agradeço que tenha chegado até aqui, siga me aqui no medium para mais dicas React e também algumas ideias de desafios que enfrentamos hoje em dia como desenvolvedores.</p><pre>Deseja se conectar?<br>https://www.linkedin.com/in/wesleyguirra</pre><img src="https://medium.com/_/stat?event=post.clientViewed&referrerSource=full_rss&postId=2f5cb62e87c4" width="1" height="1" alt=""><hr><p><a href="https://medium.com/reactbrasil/construindo-um-chat-usando-react-native-e-firebase-parte-1-2f5cb62e87c4">Construindo um chat usando React-Native e Firebase. Parte 1</a> was originally published in <a href="https://medium.com/reactbrasil">React Brasil</a> on Medium, where people are continuing the conversation by highlighting and responding to this story.</p>]]></content:encoded>
        </item>
    </channel>
</rss>