<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/"
    xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="http://search.yahoo.com/mrss/" version="2.0">
    <channel>
        
        <title>
            <![CDATA[ João Eduardo Gomes - freeCodeCamp.org ]]>
        </title>
        <description>
            <![CDATA[ Aprenda a codificar - de graça. Tutoriais de programação em Python, JavaScript, Linux e muito mais. ]]>
        </description>
        <link>https://www.freecodecamp.org/portuguese/news/</link>
        <image>
            <url>https://cdn.freecodecamp.org/universal/favicons/favicon.png</url>
            <title>
                <![CDATA[ João Eduardo Gomes - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 13:42:12 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/joao/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como usar o Framer Motion para adicionar animações interativas e transições de página a uma aplicação para a web do Next.JS ]]>
                </title>
                <description>
                    <![CDATA[ A web é bastante vasta e está cheia de sites e aplicações estáticas. No entanto, embora sejam estáticas, elas não necessariamente precisam ser sem graça. Como podemos usar a Framer Motion para adicionar algumas animações às nossas aplicações para web e tornar a experiência com elas mais interativa?  * ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/</link>
                <guid isPermaLink="false">657362ba2a365804027e0cd6</guid>
                
                    <category>
                        <![CDATA[ Animação ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Wed, 01 May 2024 23:33:05 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/framer-motion.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-add-interactive-animations-and-page-transitions-to-a-next-js-web-app-with-framer-motion/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Add Interactive Animations and Page Transitions to a Next.js Web App with Framer Motion</a>
      </p><p>A web é bastante vasta e está cheia de sites e aplicações estáticas. No entanto, embora sejam estáticas, elas não necessariamente precisam ser sem graça.</p><p>Como podemos usar a Framer Motion para adicionar algumas animações às nossas aplicações para web e tornar a experiência com elas mais interativa?</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#o-que-o-framer-motion">O que é o Framer Motion?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#o-que-vamos-desenvolver">O que vamos desenvolver?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-0-instalando-o-framer-motion-na-sua-aplica-o-do-next-js">Etapa 0: instalando o Framer Motion na sua aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-1-animando-o-t-tulo-da-p-gina-com-framer-motion-em-uma-aplica-o-do-next-js">Etapa 1: animando o título da página com Framer Motion em uma aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-2-adicionando-efeitos-de-hover-animados-com-framer-motion-a-elementos-de-uma-aplica-o-do-next-js">Etapa 2: adicionando efeitos de hover animados com Framer Motion a elementos de uma aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-3-adicionando-transi-es-de-p-gina-com-framer-motion-a-uma-aplica-o-do-next-js">Etapa 3: adicionando transições de página com Framer Motion a uma aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-4-usando-keyframes-do-framer-motion-para-anima-es-avan-adas">Etapa 4: usando keyframes do Framer Motion para animações avançadas</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-usar-o-framer-motion-para-adicionar-animacoes-interativas-e-transicoes-de-pagina-a-uma-aplicacao-para-a-web-do-next-js/#etapa-b-nus-pirando-um-pouco-na-anima-o-da-nossa-aplica-o-do-next-js-de-rick-and-morty">Etapa bônus: pirando um pouco na animação da nossa aplicação do Next.js de Rick and Morty</a></li></ul><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/q9tpBtvTTz8?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen="" title="Animation &amp; Page Transitions Next.js with Framer Motion" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><h2 id="o-que-o-framer-motion">O que é o Framer Motion?</h2><p>O <a href="https://www.framer.com/api/motion/">Framer Motion</a> (página em inglês) é uma API que vem diretamente da API Framer. Ela fornece uma biblioteca pronta de animações e controles de gestos que facilita a criação de efeitos dinâmicos.</p><p>O que é o <a href="https://www.framer.com/">Framer</a> (página em inglês)? O próprio Framer é uma ferramenta de prototipagem de UI que permite criar interfaces interativas com animações que você pode disponibilizar para a sua equipe, ao passo que a <a href="https://www.framer.com/api/">API Framer</a> (página em inglês) é uma biblioteca do Javascript que permite fazer isso com código.</p><p>A Motion API é derivada desse trabalho, mas está convenientemente disponível como um pacote separado, que pode ser usado para controle de animações.</p><h2 id="o-que-vamos-desenvolver">O que vamos desenvolver?</h2><p>Vamos usar os conceitos do Framer Motion para adicionar efeitos de interação e de transição de página à nossa aplicação.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/framer-motion-nextjs-animation-demo.gif" class="kg-image" alt="framer-motion-nextjs-animation-demo" width="1200" height="435" loading="lazy"><figcaption>Demonstração de animação com Framer Motion</figcaption></figure><p>Vamos começar com algumas animações básicas que acontecem quando a página é carregada. Depois, vamos aprender como acioná-las ao passar o mouse para, então, criar um <em>wrapper</em> que nos permita fazer uma transição elegante de nossas páginas em Next.js.</p><h2 id="antes-de-come-armos">Antes de começarmos</h2><p>Esta é a segunda parte de uma série de artigos sobre a construção de uma wiki de <em>Rick and Morty</em>. A <a href="https://www.freecodecamp.org/news/how-to-create-a-dynamic-rick-and-morty-wiki-web-app-with-next-js/">primeira parte</a> (texto em inglês) tem como foco solicitar os dados da API de Rick and Morty e criar páginas dinâmicas.</p><p><strong><a href="https://www.freecodecamp.org/news/how-to-create-a-dynamic-rick-and-morty-wiki-web-app-with-next-js/">How to Create a Dynamic Rick and Morty Wiki Web App with Next.js</a> (</strong>Como criar uma aplicação para a web dinâmica que sirva como Wiki de Rick and Morty no Next.js – página em inglês)</p><p>É possível acompanhar este tutorial sem ter passado pela primeira parte. Porém, pode ser de grande ajuda usá-la como ponto de partida. Caso queira continuar mesmo assim, saiba que a maior parte do que você vai ver aqui pode ser aplicada a qualquer aplicação feita em React.</p><h2 id="etapa-0-instalando-o-framer-motion-na-sua-aplica-o-do-next-js">Etapa 0: instalando o Framer Motion na sua aplicação do Next.js</h2><p>Como vamos usar o Framer Motion para nos fornecer seus recursos de animação, a primeira coisa que devemos fazer é instalá-lo!</p><p>Com sua aplicação rodando localmente, execute o comando:</p><pre><code>yarn add framer-motion
# ou
npm install framer-motion
</code></pre><p>Agora, você pode iniciar novamente o seu servidor de desenvolvimento e estaremos prontos para começar!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-nextjs.jpg" class="kg-image" alt="rick-and-morty-wiki-nextjs" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/rick-and-morty-wiki-nextjs.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/rick-and-morty-wiki-nextjs.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/rick-and-morty-wiki-nextjs.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-nextjs.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="735" loading="lazy"><figcaption>Ponto de partida — aplicação de uma wiki de Rick and Morty feita em Next.js</figcaption></figure><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/d768a2cd70fa990b31f9becdd82f034a676b6a9f">Este é o commit para você acompanhar</a></p><h2 id="etapa-1-animando-o-t-tulo-da-p-gina-com-framer-motion-em-uma-aplica-o-do-next-js">Etapa 1: animando o título da página com Framer Motion em uma aplicação do Next.js</h2><p>Para começar, vamos animar o título da página da nossa aplicação wiki. Mais precisamente, vamos configurar o Framer Motion para fazer o título aparecer gradualmente enquanto a página é carregada.</p><p>A primeira coisa que devemos fazer é importar o Motion na nossa aplicação.</p><p>Comece adicionando a seguinte declaração de importação no topo do arquivo <code>pages/index.js</code>:</p><pre><code class="language-js">import { motion } from 'framer-motion';
</code></pre><p>Feito isso, estamos prontos para usar o <code>motion</code>. Podemos agora começar envolvendo o título <code>&lt;h1&gt;</code> com um componente motion:</p><pre><code class="language-react">&lt;motion.div&gt;
  &lt;h1 className="title"&gt;
    Wubba Lubba Dub Dub!
  &lt;/h1&gt;
&lt;/motion.div&gt;
</code></pre><p>Envolver o elemento é o que nos permite conectá-lo à <a href="https://www.framer.com/api/motion/">API do Motion</a>.</p><p>Porém, nossa página ainda não faz nada ao ser recarregada. Isso acontece porque ainda não configuramos nossa animação. Vamos fazer isso agora!</p><p>Existem dois conceitos básicos que precisamos ter em mente quando usamos a API Motion com nosso componente <code>&lt;motion.x&gt;</code> . São eles:</p><ul><li>O ciclo de vida da animação</li><li>As variantes</li></ul><p>Cada uma das <em>props</em> do ciclo de vida da animação — como <code>initial</code> e <code>animate</code> — nos permite definir o nome da nossa animação como uma variante.</p><p>Nossas <em>props</em> <code>variants</code> são aquelas em que configuramos as animações ao definir nomes de variantes em conjunto com a animação que queremos usar.</p><p>Então, para começar, vamos adicionar duas definições de ciclo de vida ao nosso componente de título. Faremos isso ao adicionar duas <em>props</em> de ciclo de vida (<em>initial</em> e <em>animate</em>):</p><pre><code class="language-react">&lt;motion.div initial="hidden" animate="visible"&gt;
  &lt;h1 className="title"&gt;
    Wubba Lubba Dub Dub!
  &lt;/h1&gt;
&lt;/motion.div&gt;
</code></pre><p>Agora, precisamos das seguintes definições:</p><pre><code class="language-react">&lt;motion.div initial="hidden" animate="visible" variants={{
  hidden: {},
  visible: {},
}}&gt;
  &lt;h1 className="title"&gt;
    Wubba Lubba Dub Dub!
  &lt;/h1&gt;
&lt;/motion.div&gt;
</code></pre><p>Aqui estamos definindo duas variantes: <em>hidden</em> e <em>visible</em>. Elas estão, respectivamente, referenciadas nas props de ciclo de vida <code>initial</code> e <code>animate</code> .</p><p>Ao recarregar a página, percebemos que nada acontece ainda. Isso porque ainda não definimos as animações em si. Então vamos fazer exatamente isso agora:</p><pre><code class="language-react">&lt;motion.div initial="hidden" animate="visible" variants={{
  hidden: {
    scale: .8,
    opacity: 0
  },
  visible: {
    scale: 1,
    opacity: 1,
    transition: {
      delay: .4
    }
  },
}}&gt;
  &lt;h1 className="title"&gt;
    Wubba Lubba Dub Dub!
  &lt;/h1&gt;
&lt;/motion.div&gt;
</code></pre><p>Entenda o que está acontecendo:</p><ul><li>Até o momento, temos dois ciclos de vida: um <em>initial</em> e um <em>animate</em>. O <em>initial</em> se refere àquilo que acontece inicialmente quando a página é carregada; <em>animate</em>, por sua vez, se refere ao que deve acontecer quando a página termina de ser carregada.</li><li>Inicialmente, estamos definindo que o elemento tenha seu tamanho ligeiramente reduzido e que sua opacidade seja 0.</li><li>Quando a página carregar e acionar nossa animação, definimos para que seu tamanho e sua opacidade sejam restaurados para 1.</li><li>Também definimos um atraso de 0,4 segundo na transição da animação. O objetivo disso é aguardar um pouco o carregamento dos elementos da página antes que a animação seja acionada.</li></ul><p>Resumindo: 0,4 segundo após a página carregar, o título vai aparecer na página com um efeito de estar aumentando ligeiramente de tamanho.</p><p>Ao salvar essas alterações e recarregar a página, podemos ver o efeito do nosso título!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/animated-header-framer-motion.gif" class="kg-image" alt="animated-header-framer-motion" width="1200" height="284" loading="lazy"><figcaption>Título com animação feita com Framer Motion na aplicação Next.js</figcaption></figure><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/80eb7c3fb694577002feac063a613c421826e03c">Este é o commit para você acompanhar</a></p><h2 id="etapa-2-adicionando-efeitos-de-hover-animados-com-framer-motion-a-elementos-de-uma-aplica-o-do-next-js"><strong>Etapa 2: adicionando efeitos de hover animados com Framer Motion a elementos de uma aplicação do Next.js</strong></h2><p>Agora que entendemos o básico de como adicionar animações no carregamento da página, é hora de adicionar alguma interação.</p><p>Nosso objetivo é adicionar alguns efeitos de <em>hover</em> aos cartões de cada personagem. Assim, quando você mover o cursor sobre um deles, a animação será ativada.</p><p>Primeiramente, dentro da nossa lista não ordenada <code>&lt;ul className="grid"&gt;</code>, precisamos transformar o elemento <code>&lt;li&gt;</code> em um elemento <code>&lt;motion.li&gt;</code> :</p><pre><code class="language-react">&lt;motion.li key={id} className="card"&gt;
  ...
&lt;/motion.li&gt;
</code></pre><p>Ao salvar e recarregar a página, você pode notar que tivemos um problema.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-missing-styles.jpg" class="kg-image" alt="rick-and-morty-wiki-missing-styles" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/rick-and-morty-wiki-missing-styles.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/rick-and-morty-wiki-missing-styles.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/rick-and-morty-wiki-missing-styles.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-missing-styles.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="733" loading="lazy"><figcaption>Nossa aplicação está sem os estilos para os cartões de personagem.</figcaption></figure><p>Por conta da integração entre o motion e o CSS do Next.js, nossa aplicação está se confundindo no nome da classe.</p><p>Embora isso não resolva o problema em si, uma maneira de consertar esse erro para a nossa demo é remover a <em>prop</em> <code>jsx</code> do topo do nosso bloco <code>&lt;style&gt;</code>, no qual nosso <code>.card</code> é definido.</p><p>Mude de:</p><pre><code class="language-react">&lt;style jsx&gt;{`
</code></pre><p>Para:</p><pre><code class="language-react">&lt;style&gt;{`
</code></pre><p>Agora, é só recarregar a página e tudo parece estar como deveria.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-nextjs--1-.jpg" class="kg-image" alt="rick-and-morty-wiki-nextjs--1-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/rick-and-morty-wiki-nextjs--1-.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/rick-and-morty-wiki-nextjs--1-.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/rick-and-morty-wiki-nextjs--1-.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-nextjs--1-.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="735" loading="lazy"><figcaption>Aplicação com os estilos corretos</figcaption></figure><p>Para adicionar o nosso efeito de <em>hover</em>, vamos criar uma nova <em>prop</em> no nosso componente <code>&lt;motion.li&gt;</code>, chamada <code>whileHover</code>, e preenchê-la com alguns estilos de base:</p><pre><code class="language-react">&lt;motion.li key={id} className="card" whileHover={{
  scale: 1.2,
  transition: {
    duration: .2
  }
}}&gt;
</code></pre><p>Nossa declaração acima diz ao motion que nosso elemento deve aumentar de tamanho para 1.2x do seu tamanho original quando passarmos o cursor sobre ele e que essa animação deve demorar 0,2 segundo.</p><p>Basta recarregarmos a página para ver nossa animação funcionando!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-wiki-hover-framer-motion.gif" class="kg-image" alt="rick-and-morty-wiki-hover-framer-motion" width="999" height="362" loading="lazy"><figcaption>Efeito de hover feito com Framer Motion para a aplicação do Next.js</figcaption></figure><p>Repare na parte de baixo dessa animação. Quando o cartão aumenta de tamanho, ele atravessa o cartão de baixo; e isso faz o design parecer quebrado. Podemos corrigir isso aplicando algumas configurações de z-index e background-color!</p><pre><code class="language-react">&lt;motion.li key={id} className="card" whileHover={{
  position: 'relative',
  zIndex: 1,
  background: 'white',
  scale: 1.2,
  transition: {
    duration: .2
  }
}}&gt;
</code></pre><p>Se recarregarmos a página outra vez, notamos que agora o cartão se sobrepõe ao de baixo quando aumenta de tamanho.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-framer-motion-animation-fixed-layer.gif" class="kg-image" alt="rick-and-morty-framer-motion-animation-fixed-layer" width="3584" height="1300" loading="lazy"><figcaption>Consertando o z-index e o background no efeito de hover</figcaption></figure><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/b5c79c245edd586ee0d5fa6392bc52ae43378e13">Este é o commit para você acompanhar</a></p><h2 id="etapa-3-adicionando-transi-es-de-p-gina-com-framer-motion-a-uma-aplica-o-do-next-js"><strong>Etapa 3: adicionando transições de página com Framer Motion a uma aplicação do Next.js</strong></h2><p>Acionar uma animação quando a página termina de carregar ou quando passamos o cursor sobre um elemento é bacana. Porém, adicionar bons efeitos de transição dá um toque elegante à sua aplicação. Esse é um dos diferenciais que vai tornar o seu projeto mais parecido com uma "aplicação para a web", ao invés dos sites estáticos da web.</p><p>Para fazer isso, precisamos <a href="https://nextjs.org/docs/advanced-features/custom-app">configurar nossa aplicação do Next.js</a> (página em inglês) envolvendo as páginas <em>root</em> do site com um <em>wrapper</em>. Isso vai nos conectar ao ciclo de vida da navegação do site e animar adequadamente nossas páginas.</p><p>Para começar, precisamos criar um arquivo no diretório <code>pages</code> chamado <code>_app.js</code>:</p><pre><code class="language-react">// In pages/_app.js
function App({ Component, pageProps }) {
  return (
    &lt;Component {...pageProps} /&gt;
  )
}

export default App;
</code></pre><p>Nesse momento, não há necessidade de saber em detalhes o que está acontecendo, mas tenha em mente que estamos criando um <em>wrapper</em> no qual podemos inserir funcionalidades adicionais.</p><p>Com esse arquivo até o momento, você não deve notar nenhuma diferença ao recarregar a página.</p><p>A seguir, vamos definir a base que nos permite configurar as transições entre páginas.</p><p>Vamos começar importando o motion no topo do arquivo:</p><pre><code class="language-react">import { motion } from 'framer-motion';
</code></pre><p>Feito isso, vamos fazer como nas outras animações e adicionar um novo componente <code>&lt;motion.div&gt;</code> que envolva nossa página.</p><pre><code class="language-react">&lt;motion.div initial="pageInitial" animate="pageAnimate" variants={{
  pageInitial: {
    opacity: 0
  },
  pageAnimate: {
    opacity: 1
  },
}}&gt;
  &lt;Component {...pageProps} /&gt;
&lt;/motion.div&gt;
</code></pre><p>Aqui estamos configurando um estado inicial com opacidade 0 e um estado animado com opacidade 1. A intenção é criar um efeito <em>fade in</em>, que fará o elemento aparecer.</p><p>Agora, ao recarregar a página, é possível notar que ela tem esse efeito de <em>fade in</em>. Porém, o mesmo não acontece ao clicar no cartão de um personagem e abrir a página referente a ele.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-app-no-page-transitions.gif" class="kg-image" alt="rick-and-morty-app-no-page-transitions" width="1200" height="435" loading="lazy"><figcaption>Mudando de página sem efeitos de transição</figcaption></figure><p>O problema é que o motion não reconhece a página do personagem como uma nova rota. Por isso, temos que forçá-la a reconhecer a página dessa forma e atualizá-la.</p><p>Para isso, vamos desestruturar o argumento <code>router</code> nas nossas <em>props</em> da função App:</p><pre><code class="language-react">function App({ Component, pageProps, router }) {
</code></pre><p>Vamos também usar esse argumento como uma <em>key</em> no nosso componente motion:</p><pre><code class="language-react">&lt;motion.div key={router.route} initial="pageInitial" animate="pageAnimate" variants={{
</code></pre><p>Você pode notar que agora o conteúdo está com um efeito <em>fade in</em> quando navegamos entre a página inicial e a página do personagem.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-app-fade-page-transitions-framer-motion.gif" class="kg-image" alt="rick-and-morty-app-fade-page-transitions-framer-motion" width="1200" height="435" loading="lazy"><figcaption>Transição de página com efeito <em>fade in</em> feita com Framer Motion para a aplicação em Next.js</figcaption></figure><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/c558283e0ade4dcc300c9b35e71b87217dd0bd78">Este é o commit para você acompanhar</a></p><h2 id="etapa-4-usando-keyframes-do-framer-motion-para-anima-es-avan-adas">Etapa 4: usando keyframes do Framer Motion para animações avançadas</h2><p>Agora que já definimos as configurações básicas de animação para o ciclo de vida da nossa aplicação, podemos ir ainda mais longe com a ajuda dos <a href="https://www.framer.com/api/motion/examples/#keyframes"><em>keyframes</em></a>.</p><p>Os <em>keyframes</em> funcionam da seguinte maneira: ao definirmos uma animação, podemos configurá-la para passar por uma série de outros valores nas propriedades que escolhermos — o que nos permite construir animações da maneira que preferirmos.</p><p>Por exemplo, vamos supor que o nosso objetivo é que um elemento, durante o <em>hover</em>, aumente 2x o seu tamanho original, depois fique 1.5x menor e, por fim, aumente novamente para 2x do tamanho original. Tudo isso em apenas uma sequência de animação. Podemos fazer isso utilizando <em>keyframes</em>!</p><p>A sintaxe para isso ficaria assim:</p><pre><code class="language-js">scale: [1, 2, 1.5, 2]
</code></pre><p>Aqui estamos especificando nossa sequência a partir de um array. Esse array diz que nosso elemento deve ter seu estado inicial no seu tamanho normal (1x), depois deve aumentar 2x, diminuir um pouco 1.5x e, por fim, aumentar novamente em 2x.</p><p>Para testar isso, precisamos fazer algumas mudanças no efeito de hover que já havíamos configurado para os cartões de personagem.</p><p>Em <code>pages/index.js</code>, mude a propriedade <code>whileHover</code> no elemento <code>li motion</code> para:</p><pre><code class="language-react">&lt;motion.li key={id} className="card" whileHover={{
  position: 'relative',
  zIndex: 1,
  background: 'white',
  scale: [1, 1.4, 1.2],
  rotate: [0, 10, -10, 0],
  transition: {
    duration: .2
  }
}}&gt;
</code></pre><p>Estamos definindo duas configurações de <em>keyframes </em>para o nosso elemento. São elas:</p><ul><li>O tamanho inicial com 0 de rotação (ou "sem rotação", se preferir).</li><li>Depois, o elemento aumenta em 1.4x do seu tamanho original e tem uma rotação de 10 graus.</li><li>Ele diminui o tamanho em 1.2x e rotaciona para o lado inverso com -10 graus.</li><li>Nesse ponto, a escala do <em>keyframes</em> está completa. Logo, não precisamos mais mexer nela, mas ainda temos uma rotação para fazer, na qual retornamos o elemento para sua posição inicial 0 (sem rotação).</li></ul><p>Agora, basta recarregarmos a página e passar o cursor sobre os elementos para vermos os efeitos animados em ação!</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-hover-effect-framer-motion.gif" class="kg-image" alt="rick-and-morty-hover-effect-framer-motion" width="1200" height="435" loading="lazy"><figcaption>Efeito de rotação e mudança de tamanho feitos com Framer Motion</figcaption></figure><p>Sem os <em>keyframes</em>, tudo o que podemos fazer são animações de um único estado inicial a um único estado final. No entanto, com os <em>keyframes</em>, podemos adicionar animações mais dinâmicas variando entre diferentes valores.</p><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/99c75a3674623f896e12d29fff1431ac609bd60a">Este é o commit para você acompanhar</a></p><h2 id="etapa-b-nus-pirando-um-pouco-na-anima-o-da-nossa-aplica-o-do-next-js-de-rick-and-morty"><strong>Etapa bônus: pirando um pouco na animação da nossa aplicação do Next.js de Rick and Morty</strong></h2><p>Para tornar nosso projeto ainda mais divertido, podemos brincar com outras propriedades que vão deixar nossas animações ainda mais dinâmicas.</p><p>Vamos começar intensificando nossos efeitos de <em>hover</em>.</p><p>No arquivo <code>pages/index.js</code>, adicione a seguinte alteração à <em>prop</em> <code>whileHover</code> do elemento <code>&lt;motion.li&gt;</code> :</p><pre><code class="language-js">filter: [
  'hue-rotate(0)',
  'hue-rotate(360deg)',
  'hue-rotate(45deg)',
  'hue-rotate(0)'
],
</code></pre><p>Aqui, estamos definindo novas configurações de <em>keyframes</em> que vão "rotacionar" a matriz de cor (hue) da imagem com base na <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/hue-rotate">função hue-rotate do CSS</a> (página em inglês).</p><p>Ao salvar e recarregar a página, temos um pequeno efeito de cor:</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-hover-effect-weird-framer-motion.gif" class="kg-image" alt="rick-and-morty-hover-effect-weird-framer-motion" width="1200" height="435" loading="lazy"><figcaption>Mudando a cor da imagem com Framer Motion e filtros do CSS</figcaption></figure><p>Assim ainda está um pouco sutil. O ideal seria deixar uma impressão de estranhamento ainda maior.</p><p>Vamos aplicar as seguintes alterações à propriedade <code>filter</code>:</p><pre><code class="language-js">filter: [
  'hue-rotate(0) contrast(100%)',
  'hue-rotate(360deg) contrast(200%)',
  'hue-rotate(45deg) contrast(300%)',
  'hue-rotate(0) contrast(100%)'
],
</code></pre><p>Agora, além de mudarmos a cor, usamos a <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/filter-function/contrast">função contrast do CSS</a> para tornar as cores ainda mais extremas e causar uma maior impressão de estranhamento.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-framer-js-hover-effect-color.gif" class="kg-image" alt="rick-and-morty-framer-js-hover-effect-color" width="1200" height="435" loading="lazy"><figcaption>Alterando a cor da imagem no efeito de hover com Framer Motion e com os filtros do CSS</figcaption></figure><p>Em seguida, podemos fazer algo semelhante com nossas transições de página!</p><p>Para isso, vamos fazer uso de uma outra parte do ciclo de vida do componente Motion — a saída (<em>exit</em>). Aqui, nós vamos precisar usar o componente <a href="https://www.framer.com/api/motion/animate-presence/">AnimatePresence</a>, do Motion — que vai nos permitir animar componentes que forem removidos da árvore do React.</p><p>Vamos começar abrindo o arquivo <code>pages/_app.js</code> e importando o componente no topo:</p><pre><code class="language-js">import { motion, AnimatePresence } from 'framer-motion';
</code></pre><p>Agora, precisamos envolver nosso componente <code>&lt;motion.div&gt;</code> com o componente &nbsp;<code>AnimatePresence</code> :</p><pre><code class="language-react">&lt;AnimatePresence&gt;
      &lt;motion.div key={router.route} initial="pageInitial" animate="pageAnimate" variants={{
</code></pre><p>Depois de envolvermos nosso componente, podemos definir um novo ciclo de vida da <em>prop </em><code>exit</code> &nbsp;junto com sua variante:</p><pre><code class="language-react">&lt;motion.div key={router.route} initial="pageInitial" animate="pageAnimate" exit="pageExit" variants={{
  pageInitial: {
    opacity: 0
  },
  pageAnimate: {
    opacity: 1
  },
  pageExit: {
    backgroundColor: 'white',
    filter: `invert()`,
    opacity: 0
  }
}}&gt;
</code></pre><p>O que fizemos no código acima:</p><ul><li>Configuramos a variante <code>pageExit</code> </li><li>Configuramos a propriedade de ciclo de vida <code>exit</code> para <code>pageExit</code></li><li>Na nossa variante <code>pageExit</code> , definimos a cor de fundo para branco e adicionamos um filtro para inverter as cores.</li></ul><p><em>Observação: é importante definir a cor de fundo para branco, caso contrário, o filtro invert não será aplicado ao fundo.</em></p><p>Agora, podemos salvar e recarregar a página para vermos nosso efeito quando navegamos para um outro elemento.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/rick-and-morty-app-page-transitions.gif" class="kg-image" alt="rick-and-morty-app-page-transitions" width="1200" height="435" loading="lazy"><figcaption>Invertendo as cores com Framer Motion na transição entre páginas</figcaption></figure><p><a href="https://github.com/colbyfayock/my-rick-and-morty-wiki/commit/3c1455370f750ff86b75a3b3edc446ebe553bf5b">Este é o commit para você acompanhar</a></p><h2 id="o-que-mais-podemos-fazer">O que mais podemos fazer?</h2><h3 id="adicione-algumas-anima-es-para-dar-um-efeito-de-escalonamento-nos-resultados-da-pesquisa-">Adicione algumas animações para dar um efeito de escalonamento nos resultados da pesquisa.</h3><p>Você pode verificar minha demo original na qual baseei este tutorial. Nela, eu adicionei uma funcionalidade que faz os resultados flutuarem ao aparecer, deslocando-se ligeiramente para cima.</p><p>Podemos fazer isso com a propriedade de transição staggerChildren e definindo as <a href="https://www.framer.com/api/motion/component/#transform">posições x e y</a> (página em inglês) na nossa lista de elementos.</p><p><a href="https://github.com/colbyfayock/rick-and-morty-wiki/blob/master/pages/index.js#L11">https://github.com/colbyfayock/rick-and-morty-wiki/blob/master/pages/index.js#L11</a></p><h3 id="anime-os-bot-es">Anime os botões</h3><p>Atualmente, os botões são apenas estáticos. Você pode adicionar alguns efeitos de hover e de clique a eles, como, por exemplo, no <em>Load More</em>, na parte de baixo.</p><h3 id="adicione-mais-efeitos-estranhos">Adicione mais efeitos estranhos</h3><p>Afinal de contas, estamos falando de Rick and Morty. Você pode pirar à vontade. Certifique-se, porém, de que o resultado final ainda seja algo utilizável.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/04/social-footer-card-1.jpeg" class="kg-image" alt="social-footer-card-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/04/social-footer-card-1.jpeg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/04/social-footer-card-1.jpeg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/04/social-footer-card-1.jpeg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/04/social-footer-card-1.jpeg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="400" loading="lazy"></figure><ul><li><a href="https://twitter.com/colbyfayock"><strong>𝕏</strong> Siga o autor no Twitter</a></li><li><a href="https://youtube.com/colbyfayock">Inscreva-se no canal do autor no YouTube</a></li><li><a href="https://www.colbyfayock.com/newsletter/">✉️ Cadastre-se na newsletter do autor</a></li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprenda a usar variáveis de ambiente no Node ]]>
                </title>
                <description>
                    <![CDATA[ As variáveis de ambiente são uma parte fundamental do desenvolvimento em Node. Por alguma razão, porém, nunca fui atrás de como usá-las adequadamente. O motivo é, possivelmente, o fato de elas serem chamadas de "variáveis de ambiente". A expressão "variáveis de ambiente" por si só é um gatilho para o ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-a-usar-variaveis-de-ambiente-no-node/</link>
                <guid isPermaLink="false">64ee693b78917103e8a16cac</guid>
                
                    <category>
                        <![CDATA[ Node.js ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Wed, 27 Sep 2023 20:00:53 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/1_akTd5oP32aXargVxiCOB8g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/heres-how-you-can-actually-use-node-environment-variables-8fdf98f53a0a/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Here’s how you can actually use Node environment variables</a>
      </p><p>As variáveis de ambiente são uma parte fundamental do desenvolvimento em Node. Por alguma razão, porém, nunca fui atrás de como usá-las adequadamente.</p><p>O motivo é, possivelmente, o fato de elas serem chamadas de "variáveis de ambiente".</p><p>A expressão "variáveis de ambiente" por si só é um gatilho para o meu trauma de tentar adicionar o caminho correto para o diretório Home do Java no Windows. Devo usar PATH ou JAVA_HOME? Ou ambos? Preciso colocar ponto e vírgula no final? POR QUE RAIOS ESTOU USANDO JAVA?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/ALjN6DcPA7VdZAcLA1vpTCzYLdx1lU3NtbOW.png" class="kg-image" alt="ALjN6DcPA7VdZAcLA1vpTCzYLdx1lU3NtbOW" width="600" height="400" loading="lazy"><figcaption>SOCORRO</figcaption></figure><p>No Node, as variáveis de ambiente podem ser globais (como no Windows), mas geralmente são usadas em um processo específico que você deseja executar. Por exemplo, se você tiver uma aplicação para a web, talvez tenha variáveis de ambiente que definem:</p><ul><li>A porta HTTP a ser monitorada</li><li>A string que conecta ao banco de dados</li><li>O JAVA_HOME... espere... isso não — desculpe. Ainda estou me recuperando do trauma.</li></ul><p>Em contextos assim, as variáveis de ambiente são realmente mais como "ajustes de configuração". Viu como soa melhor dessa maneira?</p><p>Se você tem alguma experiência com .NET, talvez esteja familiarizado com o arquivo <code>web.config</code>. As variáveis de ambiente do Node funcionam de um jeito parecido com os ajustes feitos no <code>web.config</code> — são, basicamente, um modo de passar informações que você não quer deixar no código fonte.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/lPJ7qP4TxdCmfuP6yYy5vnHuoUa8WH23RSqh.png" class="kg-image" alt="lPJ7qP4TxdCmfuP6yYy5vnHuoUa8WH23RSqh" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/lPJ7qP4TxdCmfuP6yYy5vnHuoUa8WH23RSqh.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/lPJ7qP4TxdCmfuP6yYy5vnHuoUa8WH23RSqh.png 634w" width="600" height="400" loading="lazy"><figcaption>Citar a si mesmo é o auge da loucura</figcaption></figure><p>Como <strong>usar </strong>essas variáveis na sua aplicação do Node? Foi difícil encontrar esse conteúdo com a dose necessária de piadas com Java. Portanto, decidi criar eu mesmo. Aqui estão algumas maneiras de definir e de ler variáveis de ambiente nas suas aplicações do Node.</p><h4 id="passando-no-terminal">Passando no terminal</h4><p>Você pode passar variáveis de ambiente diretamente no terminal como parte do processo da sua aplicação do Node. Por exemplo: se você estiver rodando uma aplicação com o framework Express e se quiser passar um conteúdo para a porta 65534, pode fazer da seguinte maneira...</p><pre><code class="language-bash">PORT=65534 node bin/www</code></pre><p>Curiosidade: a porta 65535 é o maior valor de rede TCP/IP disponível. Como eu sei disso? <a href="https://stackoverflow.com/questions/113224/what-is-the-largest-tcp-ip-network-port-number-allowable-for-ipv4">StackOverflow, é claro</a> (texto em inglês). De que outra maneira as pessoas sabem das coisas? Só podemos, no entanto, chegar à porta 65534 para uma aplicação da web porque essa é a maior porta a qual o Chrome se conecta. Como eu sei <strong>isso? </strong>O <a href="https://www.freecodecamp.org/news/heres-how-you-can-actually-use-node-environment-variables-8fdf98f53a0a/undefined">Liran Tal</a> me disse nos comentários. Recomendo segui-lo. Diferente de mim, ele sabe o que está fazendo.</p><p>Para o caso de usar a variável no seu código, você poderia usar o objeto <code>process.env</code>.</p><pre><code class="language-js">var port = process.env.PORT;</code></pre><p>Aí, a coisa pode ficar feia. Se você tivesse uma string de conexão, provavelmente não gostaria de passar um monte variáveis no terminal. Isso faria parecer que você está acumulando diversos valores de configuração. Uma pessoa que se importa com você poderia organizar uma intervenção; o que seria constrangedor para todos os envolvidos.</p><pre><code>PORT=65534
DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&amp;replicaSet=globaldb"
SECRET_KEY="b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"</code></pre><p>Isso não escala – e todo mundo quer escalar. De acordo com todos os arquitetos que conheci, a aplicação "escalar" é mais importante do que a aplicação funcionar.</p><p>Sendo assim, vamos tentar outra abordagem: os arquivos .env.</p><h4 id="usando-um-arquivo-env">Usando um arquivo .env</h4><p>O que os arquivos .env fazem é nos permitir armazenar nossas variáveis em um arquivo à parte. Você só precisa criar um arquivo <code>.env</code> no seu projeto e colocar as variáveis nele em linhas separadas.</p><pre><code>PORT=65534

DB_CONN="mongodb://react-cosmos-db:swQOhAsVjfHx3Q9VXh29T9U8xQNVGQ78lEQaL6yMNq3rOSA1WhUXHTOcmDf38Q8rg14NHtQLcUuMA==@react-cosmos-db.documents.azure.com:10255/?ssl=true&amp;replicaSet=globaldb"

SECRET_KEY="b6264fca-8adf-457f-a94f-5a4b0d1ca2b9"</code></pre><p>Existem diferentes maneiras de se ler esses valores, mas a opção mais simples é usar o pacote <code>dotenv</code> via npm.</p><pre><code class="language-bash">npm install dotenv --save</code></pre><p>Feito isso, você só precisa fazer uma requisição desse pacote no seu projeto sempre que precisar usar suas variáveis de ambiente. O pacote <code>dotenv</code> vai pegar o respectivo arquivo e carregar suas configurações no Node.</p><pre><code class="language-js">// Usando o dotenv para ler variáveis de um arquivo .env no Node:
require('dotenv').config();
var MongoClient = require('mongodb').MongoClient;

// Referenciando variáveis .env fora do objeto process.env:
MongoClient.connect(process.env.DB_CONN, function(err, db) {
  if(!err) {
    console.log("Conectado");
  }
});</code></pre><p>Dica importante: Não suba seus arquivos .env para o Github. Os valores armazenados ali devem ser mantidos em sigilo. O próprio Github vai enviar a você um e-mail alertando sobre isso. Não faça a mesma besteira que eu.</p><p>Certo — bacana. Isso, porém, é meio chato. Você precisa colocar esse código em cada arquivo em que deseja usar variáveis de ambiente <strong>E</strong> você deve enviar o <code>dotenv</code> para o ambiente de produção, onde não é exatamente necessário. Não sou muito fã de fazer <em>deploy </em>de código inútil, mas acho que isso descreve a minha carreira como um todo.</p><p>Felizmente, você está usando o <a href="https://code.visualstudio.com/?wt.mc_id=dotenv-medium-buhollan">VS Code</a> (você <strong>está usando </strong>o VS Code, certo?). Então, você tem algumas outras opções.</p><h4 id="trabalhando-com-arquivos-env-no-vs-code">Trabalhando com arquivos .env no VS Code</h4><p>Primeiramente, saiba que você pode <a href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;wt.mc_id=dotenv-medium-buhollan">instalar a extensão DotENV</a> no seu VS Code. Ela vai fornecer um destaque visual na sintaxe dos seus arquivos .env.</p><p><a href="https://marketplace.visualstudio.com/items?itemName=mikestead.dotenv&amp;WT.mc_id=dotenv-medium-buhollan"><strong>DotENV - Visual Studio Marketplace</strong></a></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/5TqqPI4CyihReGrXCaFqLDEAADqD-AJtHS4Y.png" class="kg-image" alt="5TqqPI4CyihReGrXCaFqLDEAADqD-AJtHS4Y" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/5TqqPI4CyihReGrXCaFqLDEAADqD-AJtHS4Y.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/5TqqPI4CyihReGrXCaFqLDEAADqD-AJtHS4Y.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"><figcaption>Do lixo ao luxo com o VS Code</figcaption></figure><p>O depurador do VS Code também oferece algumas opções mais convenientes para carregar valores de arquivos .env. Isso <strong>se</strong> você estiver usando o depurador do VS Code.</p><h4 id="configura-es-de-execu-o-do-vs-code">Configurações de execução do VS Code</h4><p>O depurador do Node para o VS Code (que já está presente nele – não precisa instalar nada para usá-lo) tem suporte para carregamento em arquivos .env por meio de configurações de execução. <a href="https://code.visualstudio.com/docs/nodejs/nodejs-debugging?WT.mc_id=dotenv-medium-buhollan">Leia mais sobre configurações de execução aqui</a> (texto em inglês).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/f6NKkdg6vZOubtIzh4k4EGEVUWtvC7ZC88SK.gif" class="kg-image" alt="f6NKkdg6vZOubtIzh4k4EGEVUWtvC7ZC88SK" width="600" height="400" loading="lazy"></figure><p>Quando você cria uma configuração de execução básica do Node (clique na engrenagem e selecione "Node"), você pode fazer uma ou as duas seguintes ações:</p><p>A primeira é você simplesmente passar as variáveis para a configuração de execução.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/OKoRgCmVBQJG3p2ZQ9em6NaMIYwNauEwp6Wd.png" class="kg-image" alt="OKoRgCmVBQJG3p2ZQ9em6NaMIYwNauEwp6Wd" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/OKoRgCmVBQJG3p2ZQ9em6NaMIYwNauEwp6Wd.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/OKoRgCmVBQJG3p2ZQ9em6NaMIYwNauEwp6Wd.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>É bacana e tal, mas, aqui, todos os valores precisam ser strings. Isso me incomoda um pouco. É um número, não uma string. O JavaScript só tem 3 tipos. Não quero perder um deles.</p><p>Existe um caminho mais fácil. Nós já aprendemos a amar os arquivos <code>.env</code>. Então, ao invés de passar os seus valores, podemos simplesmente informar ao VS Code o nome do arquivo .env em questão.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/5mkXYjMBORiWKSTBZzCcZTK33ubGUTFy7SuZ.png" class="kg-image" alt="5mkXYjMBORiWKSTBZzCcZTK33ubGUTFy7SuZ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/5mkXYjMBORiWKSTBZzCcZTK33ubGUTFy7SuZ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/5mkXYjMBORiWKSTBZzCcZTK33ubGUTFy7SuZ.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Desse modo, contanto que iniciemos nosso processo a partir do VS Code, os arquivos de variáveis de ambiente serão carregados. Não precisamos "mutilar" os números transformando-os em strings. Também não estamos enviando código inútil para o ambiente de produção. Ou, pelo menos, <strong>você</strong> não está.</p><h4 id="come-ando-com-o-npm-ao-inv-s-do-node">Começando com o NPM ao invés do Node</h4><p>Você pode ter chegado aqui pensando: "Burke, eu nunca rodei nada com o comando <code>node</code>. É sempre um script do npm como <code>npm start</code>".</p><p>Para casos assim, também é possível usar as configurações de execução do VS Code. Ao invés de usar um processo de execução padrão do Node, você adiciona a configuração "Launch Via NPM" (Executar via NPM).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/7tUmGEn-i6T30kHkzfXYj5qzAK8rB6qMTZir.gif" class="kg-image" alt="7tUmGEn-i6T30kHkzfXYj5qzAK8rB6qMTZir" width="600" height="400" loading="lazy"></figure><p>Agora, você pode adicionar novamente seu arquivo .env na linha <code>envFile</code> e ajustar a linha <code>runtimeArgs</code> para rodar o script correto. Isso <em>normalmente </em>é feito com um comando "start" ou "debug".</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/bkDqIcWImMhXbMrGry73ABhvBWCG2x5Sy92k.png" class="kg-image" alt="bkDqIcWImMhXbMrGry73ABhvBWCG2x5Sy92k" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/bkDqIcWImMhXbMrGry73ABhvBWCG2x5Sy92k.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/bkDqIcWImMhXbMrGry73ABhvBWCG2x5Sy92k.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p><strong>Lembre-se de adicionar a <em>flag</em><strong> <code>--inspect</code> </strong>ao seu script npm para que o VS Code possa vincular o depurador a ele</strong>. Do contrário, a tarefa até vai ser executada, mas o depurador do VS Code vai desistir de continuar – assim como eu, tentando arranjar um encontro no ensino médio.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/tGcPy6sdBlu9sR1OD07VdHD9MuSgj9-uDb7K.gif" class="kg-image" alt="tGcPy6sdBlu9sR1OD07VdHD9MuSgj9-uDb7K" width="600" height="400" loading="lazy"></figure><h3 id="vari-veis-de-ambiente-em-produ-o">Variáveis de ambiente em produção</h3><p>Até agora, vimos como definir variáveis para o ambiente de desenvolvimento. Você provavelmente não vai usar arquivos .env em produção. As configurações de execução do VS Code não vão ser muito úteis em um servidor.</p><p>Em produção, as variáveis serão definidas de acordo com a sua plataforma escolhida. Se for a Azure, existem 3 maneiras diferentes de definir e gerenciar suas variáveis de ambiente.</p><p>A primeira maneira é usar o <a href="https://docs.microsoft.com/en-us/cli/azure/webapp/config/appsettings?view=azure-cli-latest&amp;wt.mc_id=dotenv-medium-buhollan">Azure CLI</a>.</p><pre><code class="language-bash">az webapp config appsettings set -g MyResourceGroup -n MyApp --settings PORT=65534</code></pre><p>Até funciona, mas... eca.</p><p>Outra maneira é usar o Azure Web Portal. Eu nem sempre uso um portal da web, mas, quando uso, é para definir variáveis de ambiente.</p><p>Na nomenclatura da Azure, elas são chamadas de "Application Settings" (Configurações da aplicação).</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/prz52i4eiyXapzYAPqEIQ9ggSnCYwFGTYWzi.png" class="kg-image" alt="prz52i4eiyXapzYAPqEIQ9ggSnCYwFGTYWzi" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/09/prz52i4eiyXapzYAPqEIQ9ggSnCYwFGTYWzi.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/09/prz52i4eiyXapzYAPqEIQ9ggSnCYwFGTYWzi.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Porém, como você está usando o VS Code, pode instalar a extensão Azure App Service para gerenciar todas as configurações da aplicação <a href="https://marketplace.visualstudio.com/items?itemName=ms-azuretools.vscode-azureappservice&amp;WT.mc_id=dotenv-medium-buhollan">diretamente do seu editor</a>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/09/4L4UwQ0TYob3wz--qcO2AQfmjFIxhMQ6ecax.gif" class="kg-image" alt="4L4UwQ0TYob3wz--qcO2AQfmjFIxhMQ6ecax" width="600" height="400" loading="lazy"></figure><p>Adoro não precisar sair do VS Code. Eu escreveria e-mails no VS Code, se pudesse.</p><p>UM MOMENTO!</p><p><a href="https://marketplace.visualstudio.com/items?itemName=ccccly.markdown-mail&amp;WT.mc_id=dotenv-medium-buhollan"><strong>markdown-mail - Visual Studio Marketplace</strong></a></p><h3 id="agora-voc-j-sabe">Agora você já sabe</h3><p>Agora você já sabe o que eu sei — o que não é muito, diga-se de passagem — e sinto que cumpri meu objetivo de fornecer uma pitada de piadas com Java ao longo do caminho. Porém, caso eu não tenha conseguido, aqui vai uma:</p><blockquote>Java é uma ferramenta muito poderosa para transformar XML em traços de erro.<br><br>- Autor desconhecido</blockquote><p><em>Observação: a maior parte das piadas é apenas uma tentativa ruim de fazer humor, parte dessa tentativa feita às custas do Java. Sei que não é legal fazer isso, mas, com o Java, é bem fácil. Afinal, as piadas não se escrevem sozinhas.</em></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript ES6 — Faça mais escrevendo menos ]]>
                </title>
                <description>
                    <![CDATA[ O JavaScript ES6 traz uma nova sintaxe e novos recursos incríveis para tornar seu código mais moderno e legível. Ele permite que você consiga fazer mais escrevendo menos código. O ES6 nos apresenta muitos recursos excelentes, como as  arrow functions, template strings, desestruturação de classes, módulos e muito mais. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/javascript-es6-faca-mais-escrevendo-menos/</link>
                <guid isPermaLink="false">64b095eeb04bf0067ce23b31</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Sun, 23 Jul 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/1__g2EvGpJlt4YKcvsNsta7g.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/write-less-do-more-with-javascript-es6-5fd4a8e50ee2/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript ES6 — write less, do more</a>
      </p><p>O JavaScript ES6 traz uma nova sintaxe e novos recursos incríveis para tornar seu código mais moderno e legível. Ele permite que você consiga fazer mais escrevendo menos código. O ES6 nos apresenta muitos recursos excelentes, como as <em>arrow functions</em>, <em>template strings</em>, desestruturação de classes, módulos e muito mais. Vamos conhecê-los.</p><h3 id="const-e-let"><strong>const e let</strong></h3><p><code>const</code> é uma nova palavra-chave em ES6 para declarar variáveis. Além disso, <code>const</code> é mais poderoso do que <code>var</code>. Isso porque, uma vez utilizada, não podemos reatribuir um novo valor à variável. Em outras palavras, trata-se de uma <strong>variável imutável</strong>, exceto quando usada com objetos.</p><p>Isso é bastante útil para direcionar os seletores. Por exemplo, quando temos um único botão que dispara um evento, ou quando você deseja selecionar um elemento HTML pelo JavaScript, use <code>const</code> ao invés de <code>var</code>. O principal motivo é que <code>var</code> tem um escopo maior. Portanto, é sempre preferível usar <code>const</code> quando não queremos que a variável seja reatribuída. Exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/e4r4Zg1XTz395qj9A5hOpHMK0mzH0zwxitK9.png" class="kg-image" alt="e4r4Zg1XTz395qj9A5hOpHMK0mzH0zwxitK9" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/e4r4Zg1XTz395qj9A5hOpHMK0mzH0zwxitK9.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/e4r4Zg1XTz395qj9A5hOpHMK0mzH0zwxitK9.png 779w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>No código acima, a variável <code>const</code> não vai mudar e não pode ser reatribuída. Se você tentar atribuir um novo valor a ela, vai receber uma mensagem de erro.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/kM-LHiezWRHQa0aakmKyPrgd53riDwKnrSUa.png" class="kg-image" alt="kM-LHiezWRHQa0aakmKyPrgd53riDwKnrSUa" width="600" height="400" loading="lazy"></figure><p>Por sua vez, &nbsp;uma variável <code>let</code> pode ser reatribuída, recebendo assim um novo valor. Neste caso, temos uma <strong>variável mutável</strong>.</p><p>O <code>let</code> é semelhante ao <code>const</code> no sentido de que ambos têm seu escopo restrito. O que significa que a variável só é acessível dentro do escopo em que foi declarada.</p><h3 id="arrow-functions"><strong><em>Arrow functions</em></strong></h3><p>As <em>arrow functions</em> são fantásticas. Elas deixam o seu código mais legível, melhor estruturado e com um visual moderno. Ao invés de usar isto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/CAtsmTIStmCZaK-7ej4vvuHzY-aqfNhRhevc.png" class="kg-image" alt="CAtsmTIStmCZaK-7ej4vvuHzY-aqfNhRhevc" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/CAtsmTIStmCZaK-7ej4vvuHzY-aqfNhRhevc.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/CAtsmTIStmCZaK-7ej4vvuHzY-aqfNhRhevc.png 763w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Use isto:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/jaJg1ODAb7FcbQbWaQ8FwegEmTD4IsTtx7Of.png" class="kg-image" alt="jaJg1ODAb7FcbQbWaQ8FwegEmTD4IsTtx7Of" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/jaJg1ODAb7FcbQbWaQ8FwegEmTD4IsTtx7Of.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/jaJg1ODAb7FcbQbWaQ8FwegEmTD4IsTtx7Of.png 799w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Como você pode ver, as <em>arrow functions </em>têm um visual mais legível e limpo! Você não vai mais precisar usar a sintaxe antiga.</p><p>Você também pode usar as <em>arrow functions </em>em algumas das funções integradas do JavaScript, como: <code>map</code>, <code>filter</code> e <code>reduce</code>. Veja este exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/2G7fWO8OuCNbdMXa7wiRxoncLZshsRxZ0WYR.png" class="kg-image" alt="2G7fWO8OuCNbdMXa7wiRxoncLZshsRxZ0WYR" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/2G7fWO8OuCNbdMXa7wiRxoncLZshsRxZ0WYR.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/2G7fWO8OuCNbdMXa7wiRxoncLZshsRxZ0WYR.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>A função <code>map</code> fica mais legível com a sintaxe das <em>arrow functions</em> do que ficava anteriormente. Usando o ES6, você consegue escrever códigos mais curtos e funcionais. Você pode fazer o mesmo com <code>filter</code> e <code>reduce</code>.</p><h3 id="template-literals"><strong><em>Template literals</em></strong></h3><p>As <em>template literals</em> — também conhecidas como <em>template strings</em> — são um recurso muito bacana do ES6. Com elas, não precisamos mais usar o operador de soma (+) para concatenar strings nem para usar variáveis dentro de uma string.</p><p>Como era na sintaxe antiga:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/pyiP612uJAXA9gvXK0fnmxc9tb6J0WRSB3Nj.png" class="kg-image" alt="pyiP612uJAXA9gvXK0fnmxc9tb6J0WRSB3Nj" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/pyiP612uJAXA9gvXK0fnmxc9tb6J0WRSB3Nj.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/pyiP612uJAXA9gvXK0fnmxc9tb6J0WRSB3Nj.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Como ficou com a nova sintaxe do ES6:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/O1aAY7ehL3Vtvej0YXuZVXbN3LjHX2-WXzOG.png" class="kg-image" alt="O1aAY7ehL3Vtvej0YXuZVXbN3LjHX2-WXzOG" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/O1aAY7ehL3Vtvej0YXuZVXbN3LjHX2-WXzOG.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/O1aAY7ehL3Vtvej0YXuZVXbN3LjHX2-WXzOG.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Bem mais simples! Podemos notar uma grande diferença entre a sintaxe antiga e a do ES6. Para usar strings de maneira mais elaborada, as <em>template strings </em>do ES6 parecem mais organizadas e melhor estruturadas do que o que tínhamos antes.</p><h3 id="par-metros-padr-o"><strong>Parâmetros padrão</strong></h3><p>Costumo usar os parâmetros padrão quando trabalha com a linguagem PHP. Esse recurso permite definir um parâmetro com antecedência.</p><p>Desse modo, você não receberá um erro de retorno indefinido caso esqueça de passar um parâmetro. Esse erro é evitado porque a predefinição do parâmetro já foi feita. Assim, quando você rodar uma função e esquecer de passar o parâmetro, o retorno será o valor do parâmetro padrão. Como bônus, não vai receber um erro por causa disso!</p><p>Vamos ilustrar isso melhor com o seguinte exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/qFmJ6F0gOBdVl4kJ7sFhIqHaGIZx6iehhoML.png" class="kg-image" alt="qFmJ6F0gOBdVl4kJ7sFhIqHaGIZx6iehhoML" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/qFmJ6F0gOBdVl4kJ7sFhIqHaGIZx6iehhoML.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/qFmJ6F0gOBdVl4kJ7sFhIqHaGIZx6iehhoML.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>A função acima retorna <em>undefined</em> porque esquecemos de passar o segundo parâmetro: <code>age</code>.</p><p>No entanto, se usássemos um parâmetro padrão, não teríamos um retorno <em>undefined</em>. Usaríamos o valor padrão caso esquecêssemos de passar esse parâmetro!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/-RczdieWIpZVTLYih1PD4ZJdq2UeurbiMBHu.png" class="kg-image" alt="-RczdieWIpZVTLYih1PD4ZJdq2UeurbiMBHu" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/-RczdieWIpZVTLYih1PD4ZJdq2UeurbiMBHu.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/-RczdieWIpZVTLYih1PD4ZJdq2UeurbiMBHu.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Como você pode ver, a função retorna o valor mesmo quando não passamos o segundo parâmetro. Com o parâmetro padrão, conseguimos antecipar o erro e evitá-lo.</p><h3 id="desestrutura-o-de-arrays-e-objetos"><strong>Desestruturação de <em>arrays </em>e objetos</strong></h3><p>O processo de desestruturação facilita a atribuição de valores de um <em>array </em>ou de um objeto a uma nova variável.</p><p>Como era na sintaxe antiga:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rsZwpm7Ah7OyThsTpkBsaRUsCwjQBSGCGEfG.png" class="kg-image" alt="rsZwpm7Ah7OyThsTpkBsaRUsCwjQBSGCGEfG" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/rsZwpm7Ah7OyThsTpkBsaRUsCwjQBSGCGEfG.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rsZwpm7Ah7OyThsTpkBsaRUsCwjQBSGCGEfG.png 750w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Como ficou com a nova sintaxe do ES6:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rrKo0LFQOblpaAIlywUGrtD8keMqwywZ5MXR.png" class="kg-image" alt="rrKo0LFQOblpaAIlywUGrtD8keMqwywZ5MXR" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/rrKo0LFQOblpaAIlywUGrtD8keMqwywZ5MXR.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rrKo0LFQOblpaAIlywUGrtD8keMqwywZ5MXR.png 703w" width="600" height="400" loading="lazy"></figure><p>Anteriormente, precisávamos atribuir manualmente cada valor a uma variável. Na ES6, porém, basta colocarmos nossas variáveis entre chaves para obtermos qualquer propriedade de um objeto.</p><p>Observação: se o nome da variável que você usar não for igual ao nome da propriedade, vai ter um retorno <em>undefined</em>. Por exemplo, se o nome da propriedade for <code>name</code> e a atribuirmos a uma variável chamada <code>username</code>, o retorno vai ser <em>undefined</em>.</p><p>Precisamos sempre manter o nome da variável igual ao nome da propriedade do objeto. Porém, se quisermos renomear essa variável, podemos usar os dois pontos (<code>:</code>). Como no seguinte exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/zLZ3XTvYSXB3UiRg2W05YXGcHa6GJGqEQJLa.png" class="kg-image" alt="zLZ3XTvYSXB3UiRg2W05YXGcHa6GJGqEQJLa" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/zLZ3XTvYSXB3UiRg2W05YXGcHa6GJGqEQJLa.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/zLZ3XTvYSXB3UiRg2W05YXGcHa6GJGqEQJLa.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Para <em>arrays</em>, usamos uma sintaxe semelhante à dos objetos. A única diferença é que usamos colchetes ao invés de chaves. Veja no seguinte exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/JUcyaqc4T9qdXgQbYCqfbi10THAatzHh64ts.png" class="kg-image" alt="JUcyaqc4T9qdXgQbYCqfbi10THAatzHh64ts" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/JUcyaqc4T9qdXgQbYCqfbi10THAatzHh64ts.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/JUcyaqc4T9qdXgQbYCqfbi10THAatzHh64ts.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><h3 id="importa-o-e-exporta-o"><strong>Importação e exportação</strong></h3><p>Uma aplicação em JavaScript fica mais poderosa com o uso de <code>import</code> e <code>export</code>. Esses recursos permitem a criação de componentes separados e reutilizáveis.</p><p>Se você estiver familiarizado com algum framework MVC (<strong>m</strong>odel–<strong>v</strong>iew–<strong>c</strong>ontroller) do JavaScript, vai perceber que — na maioria das vezes — esses frameworks usam <code>import</code> e <code>export</code> para lidar com componentes. Como essa importação e exportação funciona?</p><p>É simples! O <code>export</code> permite a exportação de um módulo para ser usado em outro componente JavaScript. Por sua vez, o <code>import</code> serve para importar esse módulo e usá-lo em nosso componente.</p><p>Vamos a um exemplo. Considere que temos dois arquivos. O primeiro foi nomeado como <code>detailComponent.js</code> e o segundo como<strong><strong> </strong></strong><code>homeComponent.js</code>.</p><p>Primeiro, vamos exportar a função <code>detail</code> do <code>detailComponent.js</code>. Fazemos isso da seguinte maneira:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/3K3KNLMTvnsVpk2EEx100lAURNgW7fXzBauC.png" class="kg-image" alt="3K3KNLMTvnsVpk2EEx100lAURNgW7fXzBauC" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/3K3KNLMTvnsVpk2EEx100lAURNgW7fXzBauC.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/3K3KNLMTvnsVpk2EEx100lAURNgW7fXzBauC.png 780w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Depois, vamos simplesmente usar <code>import</code> para acessar essa função em <code>homeComponent.js</code>. Isso é feito deste modo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/IB6KSO6rK-574uNXuX5tDUIly6NkqIsT7cpZ.png" class="kg-image" alt="IB6KSO6rK-574uNXuX5tDUIly6NkqIsT7cpZ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/IB6KSO6rK-574uNXuX5tDUIly6NkqIsT7cpZ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/IB6KSO6rK-574uNXuX5tDUIly6NkqIsT7cpZ.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Para importar mais de um módulo de um mesmo arquivo, basta colocar os nomes desses módulos entre chaves na declaração da importação. Como no seguinte exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/yeJzCdTfkuZEd-PL9oLX7DWO-cukNHKrLt-5.png" class="kg-image" alt="yeJzCdTfkuZEd-PL9oLX7DWO-cukNHKrLt-5" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/yeJzCdTfkuZEd-PL9oLX7DWO-cukNHKrLt-5.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/yeJzCdTfkuZEd-PL9oLX7DWO-cukNHKrLt-5.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Não é legal?</p><h3 id="promises"><strong><strong><strong><em>Promises</em></strong></strong></strong></h3><p>As <em>promises</em> são uma novidade do ES6. Trata-se de um método para escrever código assíncrono. Elas podem ser usadas quando, por exemplo, queremos buscar dados de uma API ou quando usamos uma função que leva algum tempo para ser executada. As <em>promises </em>facilitam a resolução de casos assim. Então, vamos criar nossa primeira <em>promise</em>!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/zVsFm1MnCkDU9oPLEmfRhLJiA0dyH1nKCa7C.png" class="kg-image" alt="zVsFm1MnCkDU9oPLEmfRhLJiA0dyH1nKCa7C" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/zVsFm1MnCkDU9oPLEmfRhLJiA0dyH1nKCa7C.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/zVsFm1MnCkDU9oPLEmfRhLJiA0dyH1nKCa7C.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Se olhar no console, vai ver que ele retorna uma <em>promise</em>. Sendo assim, se quisermos executar uma função depois de obter os dados requeridos, vamos usar uma <em>promise</em>. As <em>promises </em>recebem dois parâmetros: <code>resolve</code> e <code>reject</code>. Para caso de sucesso e de erro, respectivamente.</p><p>Observação: a função <em>fetch </em>retorna nada menos do que uma <em>promise</em>!</p><pre><code>const url='https://jsonplaceholder.typicode.com/posts';</code></pre><pre><code>const getData=(url)=&amp;gt;{return fetch(url);}</code></pre><pre><code>getData(url).then(data=&amp;gt; data.json()).then(result=&gt; console.log(result));</code></pre><p>Se olhar o resultado no console, você vai notar que o retorno é um <em>array </em>de dados.</p><h3 id="par-metro-rest-e-o-operador-de-spread"><strong>Parâmetro <em>rest</em> e o operador de <em>spread</em></strong></h3><p><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/rest_parameters">Os parâmetros </a><em><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/rest_parameters">rest</a> </em>são usados para obter o argumento de um <em>array </em>e retornar um novo <em>array</em>. Seguem alguns exemplos:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/ZGyyj2ByWBRUpEw841VQRKGXPX6KV4aeyRyf.png" class="kg-image" alt="ZGyyj2ByWBRUpEw841VQRKGXPX6KV4aeyRyf" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/ZGyyj2ByWBRUpEw841VQRKGXPX6KV4aeyRyf.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/ZGyyj2ByWBRUpEw841VQRKGXPX6KV4aeyRyf.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/SEt08SKlukqs7SSkDBoRHt-0dc9s2zrEpBDr.png" class="kg-image" alt="SEt08SKlukqs7SSkDBoRHt-0dc9s2zrEpBDr" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/SEt08SKlukqs7SSkDBoRHt-0dc9s2zrEpBDr.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/SEt08SKlukqs7SSkDBoRHt-0dc9s2zrEpBDr.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>O operador de <em>spread </em>(ou "operador de espalhamento") tem uma sintaxe semelhante à do parâmetro <em>rest</em>, com o diferencial de que o operador de <em>spread </em>pega o <em>array </em>em si e não apenas os argumentos dele. Podemos usar o operador de <em>spread </em>para obter os valores de um <em>array </em>ao invés de fazer o mesmo com um laço de repetição ou algo assim. Aqui temos um exemplo desse operador em ação:</p><pre><code class="language-js">const arr=['said',20,'JavaScript enthusiast','Hi','Said','How are you?'];

const Func=(...anArray)=&gt;{
  return anArray;
}

console.log(Func(arr));

//output  ["said", 20, "JavaScript enthusiast", "Hi", "Said", "How are you?"</code></pre><h3 id="classes"><strong>Classes</strong></h3><p>As classes são o ponto central da programação orientada a objetos (POO). Elas tornam seu código mais seguro e encapsulado. O uso de classes dá ao seu código uma boa estrutura e o mantém orientado.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/2EGxzbm25W2EtzYv67c-N49DAqTMw01iZ2Ok.png" class="kg-image" alt="2EGxzbm25W2EtzYv67c-N49DAqTMw01iZ2Ok" width="600" height="400" loading="lazy"></figure><p>Para criar uma classe, basta usar a palavra-chave <code>class</code>, dar um nome a essa classe e finalizar com um bloco de chaves.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/0K889E--nHdRPGY1nCVvUzCtAWGkDe8vPfCa.png" class="kg-image" alt="0K889E--nHdRPGY1nCVvUzCtAWGkDe8vPfCa" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/0K889E--nHdRPGY1nCVvUzCtAWGkDe8vPfCa.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/0K889E--nHdRPGY1nCVvUzCtAWGkDe8vPfCa.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Feito isso, podemos acessar os métodos e as propriedades da <code>classe</code> através da palavra-chave <code>new</code>. Exemplo:</p><pre><code class="language-js">class myClass{
    constructor(name,age){
    this.name=name;
    this.age=age;
}
}
const Home= new myClass("said",20);
console.log(Home.name)//  said</code></pre><p>Para herdar as propriedades de outra classe, é só usar a palavra-chave <code>extends</code> e informar o nome da classe de que deseja herdar. Veja no seguinte exemplo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rTlJ5DgmaUL1ZCoy1EEKxCt4TK2ihUeWVd-M.png" class="kg-image" alt="rTlJ5DgmaUL1ZCoy1EEKxCt4TK2ihUeWVd-M" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/07/rTlJ5DgmaUL1ZCoy1EEKxCt4TK2ihUeWVd-M.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/07/rTlJ5DgmaUL1ZCoy1EEKxCt4TK2ihUeWVd-M.png 800w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Você pode <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Classes">aprender mais sobre classes aqui</a>.</p><p>Você também pode <a href="http://es6-features.org/">explorar outros recursos incríveis do ES6 aqui</a> (website em inglês).</p><h3 id="conclus-o"><strong>Conclusão</strong></h3><p>O autor espera que o artigo tenha sido útil e que tenha conseguido apresentar bem alguns dos recursos do ES6. Ele também convida os leitores interessados a <a href="http://eepurl.com/dk9OJL">se inscreverem nesta lista de e-mails para receber mais conteúdo sobre front-end</a>. Por fim, o autor agradece a você por ter lido este artigo.</p><blockquote>Além disso, o autor também informa que trabalhou recentemente com um ótimo grupo de engenheiros de software para a criação de uma de suas aplicações para dispositivos móveis. Ele disse que a empresa era excelente, e que o produto foi entregue com bem mais rapidez do que outras empresas e freelancers com quem ele trabalhou. Com isso, ele conclui que pode recomendar essa empresa para quem tiver interesse em ter seus projetos desenvolvidos. Se for do seu interesse, pode contatar o autor do artigo e perguntar sobre o assunto através do e-mail: <a href="mailto:said@devsdata.com">said@devsdata.com</a>.</blockquote> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ 11 projetos em Python para desenvolvedores juniores praticarem ]]>
                </title>
                <description>
                    <![CDATA[ É necessário construir projetos para dominar o desenvolvimento de software. Não um. Nem dois. Muitos projetos! No entanto, você deve começar da maneira correta. Se você começar qualquer projeto aleatório como desenvolvedor iniciante ou júnior, não apenas se sentirá perdido como também começará a questionar se programação é para você. ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/11-projetos-em-python-para-desenvolvedores-juniores-praticarem/</link>
                <guid isPermaLink="false">6480ca573aab28058e381432</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Wed, 28 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/602164960a2838549dcc1147.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/python-projects-junior-developers/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">11 Python Projects Junior Developers Can Build for Coding Practice</a>
      </p><p>É necessário construir projetos para dominar o desenvolvimento de software.</p><p>Não um.</p><p>Nem dois.</p><p>Muitos projetos!</p><p>No entanto, você deve começar da maneira correta. Se você começar qualquer projeto aleatório como desenvolvedor iniciante ou júnior, não apenas se sentirá perdido como também começará a questionar se programação é para você. Portanto, trabalhe de maneira inteligente.</p><p>Comece do mais simples.</p><p>Primeiro, melhore sua confiança a partir de um projeto pequeno. Depois, de outro projeto pequeno. Depois de vários desses projetos pequenos, passe para algo maior e vá tão longe quanto sua imaginação permitir.</p><h2 id="antes-de-construir-qualquer-projeto-aprenda-o-b-sico"><strong>Antes de construir qualquer projeto, aprenda o básico</strong></h2><p>Se você não aprender o básico, você estará construindo sobre uma base frágil.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-307.png" class="kg-image" alt="image-307" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/image-307.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/06/image-307.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/06/image-307.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-307.png 2000w" sizes="(min-width: 720px) 720px" width="600" height="400" loading="lazy"></figure><p>Independentemente do nível de domínio que você espera alcançar em Python, você precisará desses fundamentos antes de começar qualquer projeto.</p><p>Você precisa saber como:</p><ul><li>declarar variáveis</li><li>receber dados inseridos pelo usuário</li><li>armazenar informações</li><li>repetir uma ação através de laços de repetição</li><li>escrever funções para reaproveitar blocos de código</li></ul><p>É basicamente isso.</p><p>Naturalmente, há mais a ser aprendido em Python, mas esse é o básico que você precisa saber. Será suficiente para você começar projetos para iniciantes.</p><p>Há aquela sensação tentadora de que você precisa terminar diversos tutoriais em Python antes de trabalhar em qualquer projeto.</p><p>Não siga por esse caminho.</p><blockquote><em>Muitos caem na armadilha de seguir um tutorial atrás do outro até se sentirem ultrapreparados. Em vez disso, aprenda o básico primeiro. Em seguida, construa alguns projetos pequenos. Feito isso, volte a aprender com mais tutoriais.</em></blockquote><p>Vá por mim, você pode terminar 100 tutoriais e ainda sentir que não está pronto para construir projeto algum.</p><p>Estudar por conta própria não é suficiente.</p><p>Você precisa aplicar o que aprendeu.</p><h2 id="como-fazer-uso-desses-projetos"><strong>Como fazer uso desses projetos</strong></h2><ul><li>Primeiro, leia as instruções e certifique-se de que as entendeu. Tente expressar com suas próprias palavras o que tiver entendido delas.</li><li>Tente solucionar o problema por conta própria sem buscar um tutorial no YouTube ou um código semelhante no GitHub. Provavelmente, vai ser difícil. Tudo bem. Dê o seu melhor. Essa é a ideia de <a href="https://fs.blog/2012/07/what-is-deliberate-practice/">prática deliberada</a> (texto em inglês) da Psicologia Comportamental.</li><li>Se você não conseguiu progredir por conta própria, assista ao tutorial do YouTube e veja o código de exemplo. Você também pode pesquisar na internet por mais tutoriais de exemplo e outros códigos em Python que visam resolver o mesmo problema.</li><li>Depois disso, tente dar um passo atrás e escrever o código sozinho sem olhar o tutorial. De novo: dê o seu melhor. Esse é o chamado <strong><em>grit</em></strong> (às vezes traduzido como <em>garra</em>), também da <a href="https://www.youtube.com/watch/H14bBuluwB8">Psicologia Comportamental</a> (vídeo com legenda em português disponível). Você precisa disso.</li><li>Em hipótese alguma você deve copiar cegamente o código do tutorial e se dar por satisfeito. Você até pode terminar o projeto rapidamente, mas a realidade é que você não aprendeu nada.</li><li>Se você por acaso sentir que está travado após várias tentativas, faça uma pausa. <a href="https://www.sciencefriday.com/articles/how-pinball-helps-explain-ways-we-think-and-learn/">Sabemos pelas pesquisas neurocientíficas</a> (texto em inglês) que o nosso subconsciente continua aprendendo mesmo quando paramos. Isso acontece porque nossa mente muda do modo focado para o modo difuso.</li><li>Quando conseguir resolver um problema, comemore! É importante ter esse reforço positivo para construir referências do seu sucesso. No futuro, quando sua mente disser <code>"Você não vai conseguir"</code> e fizer você duvidar do seu potencial, você pode responder a ela: <code>"não é verdade; e eis a prova de que consegui no passado e vou conseguir agora também"</code>.</li><li>Repita, repita, repita.</li></ul><p>Você também poderá usar essas dicas para outros projetos além dos que serão listados abaixo. Agora, vamos aos projetos em Python.</p><h2 id="projetos-para-desenvolvedores-juniores-de-python"><strong>Projetos para desenvolvedores juniores de Python</strong></h2><p>Aqui estão alguns projetos amigáveis para iniciantes que você pode desenvolver:</p><ol><li>Par ou ímpar</li><li>Jogo Mad Libs</li><li>Contador de palavras</li><li>Informações biográficas</li><li>Qual é a sigla?</li><li>Pedra, papel, tesoura</li><li>Adivinhar o número</li><li>Verificador de palíndromo</li><li>Calculadora de gorjeta</li><li>Divisor de e-mail</li><li>Gerador de letras de música</li></ol><h3 id="par-ou-mpar"><strong>Par ou ímpar</strong></h3><p>Dê boas-vindas ao usuário e peça-o para inserir um número de 1 a 1000.</p><p>Depois de o usuário informar o número, verifique se ele é par ou ímpar e diga ao usuário.</p><p>Exemplo:</p><ul><li>Mensagem: <code>Em qual número você pensou?</code></li><li>Entrada: <code>25</code></li><li>Saída: <code>Esse é um número ímpar! Gostaria de verificar outro?</code></li></ul><h3 id="jogo-mad-libs"><strong>Jogo Mad Libs</strong></h3><p>Peça ao usuário para informar alguns valores.</p><p>Eles podem ser qualquer coisa como um nome, um adjetivo, um pronome ou mesmo uma ação. Uma vez recebidos esses valores, reorganize-os e crie uma história.</p><ul><li>Aqui temos um <a href="https://www.youtube.com/watch?v=u7g9mRzQLYE">tutorial no YouTube de como criar um jogo Mab Libs usando o Python</a> (vídeo em inglês).</li><li>Aqui, você verá &nbsp;um <a href="https://github.com/ChalzZy/Mad-Libs-Generator/blob/master/Mad_Libs_Generator/main.py">código de exemplo</a> no Github.</li></ul><h3 id="contador-de-palavras"><strong>Contador de palavras</strong></h3><p>Peça ao usuário que informe em uma frase algo em que ele pensou. Depois, conte o número de palavras na sentença informada e mostre esse valor na tela.</p><p>Examplo:</p><ul><li>Mensagem: <code>Informe em uma frase algo em que você pensou hoje</code> .</li><li>Entrada: <code>Bem, é só mais um dia para eu ser um profissional em programação</code> .</li><li>Saída: <code>Legal! Você acabou de me dizer no que pensou usando 13 palavras!</code></li></ul><p>Para dar um passo mais adiante: abra um arquivo com conteúdo textual nele, conte o número de palavras no texto e mostre esse valor na tela.</p><p>Eis aqui <a href="https://gist.github.com/fdb/1c7234fb49757df588c1302f44f0f125">um código de exemplo</a> no Github.</p><h3 id="informa-es-biogr-ficas"><strong>Informações biográficas</strong></h3><p>Faça algumas perguntas pedindo informações sobre o usuário. Em seguida, verifique se as informações inseridas são válidas. Por fim, mostre um resumo de todas as informações que foram introduzidas.</p><p>Exemplo: Qual é o seu nome? Se o usuário informar <code>*</code>, a aplicação deve informar que esse é um nome inválido e pedir que o usuário informe um nome válido.</p><p>Ao final, deve ser exibido na tela um resumo como este:</p><pre><code>- Nome: João da Silva
- Data de nascimento: 1 de Janeiro de 1954
- Endereço: Avenida das flores, 1500, São Paulo
- Objetivos: Ser o melhor programador que já existiu.
</code></pre><h3 id="qual-a-sigla"><strong>Qual é a sigla?</strong></h3><p>Peça ao usuário para informar um conceito ou o nome de alguma organização. A aplicação deve retornar uma sigla adequada. Por exemplo:</p><ul><li>Entrada -&gt; <code>O Mais Rápido Possível</code>. Saída -&gt; <code>OMRP</code>.</li><li>Entrada -&gt; <code>Organização Mundial da Saúde</code>. Saída -&gt; <code>OMS</code>.</li><li>Entrada -&gt; <code>Ausência Sem Justificativa</code>. Saída -&gt; <code>ASJ</code>.</li></ul><h3 id="pedra-papel-tesoura"><strong>Pedra, papel, tesoura</strong></h3><p>Esta é uma brincadeira popular entre duas pessoas. Cada jogador usa uma das mãos para formar uma das seguintes opções:</p><ul><li><code>pedra</code> (mão fechada)</li><li><code>papel</code> (mão aberta)</li><li><code>tesoura</code> (estender apenas os dedos indicador e médio da mão em formato de V)</li></ul><p>Veja aqui um <a href="https://www.youtube.com/watch?v=5wfxO_juzYM">tutorial no YouTube sobre como programar um jogo de pedra-papel-tesoura em Python</a> (vídeo em inglês).</p><h3 id="adivinhar-o-n-mero"><strong>Adivinhar o número</strong></h3><p>A aplicação deve pedir ao usuário para adivinhar um número entre 1 e 50.</p><p>Se o usuário informar um número fora desse intervalo, deve ser exibida uma mensagem de erro lembrando-o dos valores aceitos.</p><p>Sempre que o usuário errar o número, a aplicação deve perguntar se ele gostaria de tentar novamente ou de desistir.</p><p>Se o jogador conseguir acertar o número, parabenize-o e exiba o número de tentativas que ele fez até acertar.</p><p>Você pode conferir aqui <a href="https://www.youtube.com/watch?v=2sWTNMi4XpE">um tutorial no YouTube para programar um jogo de adivinhar o número em Python</a> (vídeo em inglês).</p><h3 id="verificador-de-pal-ndromo"><strong>Verificador de palíndromo</strong></h3><p>Peça ao usuário que informe cinco palavras. Em seguida, verifique se alguma das cinco palavras é um palíndromo.</p><p>Um palíndromo é uma palavra que permanece a mesma, caso seja lida da esquerda para a direita ou no sentido inverso.</p><p>Exemplo:</p><ul><li><code>radar</code> é um palíndromo.</li><li><code>salas</code> também é.</li><li><code>geeks</code> não é.</li></ul><p>Aqui temos <a href="https://github.com/kuzmicheff/palindrome/blob/master/palindrome.py">um código de exemplo</a> no Github para esse projeto.</p><h3 id="calculadora-de-gorjeta"><strong>Calculadora de gorjeta</strong></h3><p>O objetivo dessa aplicação é calcular o quanto de gorjeta deve-se pagar pelo serviço. Nesse cenário, é preciso pedir pelo valor total da conta. Depois, é preciso exibir na tela as opções de gorjeta: 18%, 20% ou 25% do valor total da conta.</p><p>Exemplo:</p><ul><li>Mensagem: <code>Qual o valor total da conta?</code></li><li>Entrada: <code>R$ 55,87</code></li><li>Saída: <code>18% de gorjeta equivale a R$ 10,06; o que aumenta o total a ser pago para R$65,93</code></li></ul><p>Lembre-se de arredondar os valores para cima para ter números mais amigáveis. Se quiser ir mais além, pode perguntar o número de pessoas envolvidas para dividir igualmente o valor da conta e da gorjeta entre eles.</p><p>Se quiser ir mais longe ainda, faça essa divisão de valores de maneira proporcional. Por exemplo: uma pessoa paga 70% do valor e outra paga 30%.</p><h3 id="divisor-de-e-mail"><strong>Divisor de e-mail</strong></h3><p>Receba o endereço de e-mail do usuário e verifique se ele tem um domínio próprio ou popular. Por exemplo:</p><ul><li>Entrada: <code>mary.jane@gmail.com</code></li><li>Saída: <code>Olá, Mary. Vejo que seu e-mail está registrado no Google. Que bacana!</code>.</li><li>Entrada: <code>peter.pan@myfantasy.com</code></li><li>Saída: <code>Oi, Peter. Parece que você tem sua própria configuração personalizada no MyFantasy. Impressionante!</code>.</li></ul><p>Esse é um projeto em Python bem útil e que pode ser bastante usado futuramente. O programa ajuda a obter o nome de usuário e o nome do domínio de um endereço de e-mail.</p><p>Se quiser ir mais adiante, você pode personalizar a aplicação para enviar uma mensagem para o host com essa informação.</p><p>Você pode conferir <a href="https://www.youtube.com/watch?v=mVpcbF3Q5wE&amp;feature=emb_title">este tutorial no YouTube</a> (vídeo em inglês) e <a href="https://gist.github.com/TomColBee/4cf607f2e5b0e7b703b4d343d6a6c4e8">este exemplo de código</a> no Github sobre o projeto.</p><h3 id="gerador-de-letras-de-m-sica"><strong>Gerador de letras de música</strong></h3><p>Peça ao usuário para escolher uma música de uma lista de 10 músicas exibidas. Depois de o usuário fazer isso, exiba a letra da música selecionada.</p><p>Exemplo:</p><pre><code>Seja bem-vindo. Por favor, selecione uma dentre as 10 músicas a seguir:

1. Baby, de Justin Bieber
2. Hotline Bling, de Drake
3. Flawless, de Beyonce
4. Fall, de Eminem</code></pre><pre><code>Você escolheu Flawless, de Beyonce. Aqui está a letra da música:

---------- Flawless, de Beyonce ------------
I'm out that H, town coming coming down
I'm coming down, drippin' candy on the ground
H, Town, Town, I'm coming down, coming down
Drippin' candy on the ground...

Pressione * para escolher outra música.</code></pre><p>Para desenvolver mais o projeto, tenha pelo menos 3 músicas para cada artista.</p><p>Assim, peça para o usuário escolher pelo nome do artista e depois selecionar uma música daquele mesmo artista. Assim, o usuário pode escolher uma música específica da lista exibida.</p><h2 id="finalizando"><strong>Finalizando</strong></h2><p>Trabalhando nesses projetos, você pode se deparar com alguns obstáculos e ficar completamente desanimado. Mantenha a calma. Você consegue.</p><p>Lembre-se: faça uma pausa e tente de novo mais tarde. Você também pode ler <a href="https://lifetechpsych.com/developer-stories">estas histórias de diversos programadores</a> (texto em inglês) que conseguiram manter a motivação e seguir adiante.</p><p>Desenvolvimento de software é uma área difícil, mas tem muitas recompensas.</p><p>Se tantos outros conseguiram, você também consegue.</p><h2 id="obrigado-pela-leitura"><strong>Obrigado pela leitura</strong></h2><p>Se gostou deste texto, pode conferir outros como ele.</p><ul><li><a href="https://lifetechpsych.ck.page/">Junte-se à comunidade do autor via e-mail</a>: lá, ele compartilha técnicas para que novos programadores e desenvolvedores juniores cresçam mais rapidamente e melhorem sua confiança. Se tiver interesse, <a href="https://lifetechpsych.ck.page/">faça parte da comunidade</a>.</li><li><a href="https://twitter.com/LifeTechPsych">Siga o autor no Twitter</a>: Quer mais dicas rápidas? Ou, por acaso, tem alguma pergunta? O autor é bastante ativo no Twitter, então fique à vontade para <a href="https://twitter.com/LifeTechPsych">entrar em contato com ele</a>. Ele deixa a &nbsp;DM aberta para conversas.</li></ul><p><em>Atenção</em> — o autor é apaixonado por pesquisa. Por isso, ele adverte que tem uma tendência a usar abordagens e conceitos da Psicologia Comportamental e da Neurociência.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ JavaScript – Dividindo uma string e transformando-a em array com o método Split ]]>
                </title>
                <description>
                    <![CDATA[ De maneira geral, uma string nada mais é do que uma sequência de caracteres de determinada linguagem de programação. Vejamos o exemplo de uma string com a seguinte sequência de caracteres: "Yes, You Can DO It!". Podemos criar uma string de maneiras diferentes em JavaScript. Por exemplo:  * Fazendo ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/javascript-dividindo-uma-string-e-transformando-a-em-um-array-com-o-metodo-split/</link>
                <guid isPermaLink="false">6480ca8f3aab28058e381438</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Sun, 25 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/freeCodeCamp-Cover-1-1.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/javascript-split-how-to-split-a-string-into-an-array-in-js/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">JavaScript Split – How to Split a String into an Array in JS</a>
      </p><p>De maneira geral, uma <code>string</code> nada mais é do que uma sequência de caracteres de determinada linguagem de programação.</p><p>Vejamos o exemplo de uma string com a seguinte sequência de caracteres: "Yes, You Can DO It!". Podemos criar uma string de maneiras diferentes em JavaScript. Por exemplo:</p><ul><li>Fazendo uma declaração literal</li></ul><pre><code class="language-js">const msg = "Yes, You Can DO It!";</code></pre><ul><li>Criando um objeto a partir do construtor <code>String()</code></li></ul><pre><code class="language-js">const msg = new String("Yes, You Can DO It!");</code></pre><p>Um fato interessante sobre strings em JavaScript é que podemos acessar um caractere específico usando seu índice. O índice do primeiro caractere é 0 e os seguintes aumentam sequencialmente de 1 em 1. Assim, conseguimos acessar cada caractere de uma string, deste modo:</p><pre><code class="language-js">let str = "Yes, You Can Do It!";

console.log(str[0]); // Y
console.log(str[1]); // e
console.log(str[2]); // s
console.log(str[3]); // ,

console.log(str[10]); // a</code></pre><p>A imagem abaixo representa o mesmo funcionamento:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/split.png" class="kg-image" alt="split" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/split.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/split.png 900w" sizes="(min-width: 720px) 720px" width="900" height="500" loading="lazy"><figcaption>Acessando um caractere específico da string pelo seu respectivo índice.</figcaption></figure><p>Além da possibilidade de acessar caracteres de uma string por seus índices, o JavaScript também fornece diversos métodos para acessar caracteres, bem como recortar e manipular uma parte de uma string.</p><p>Neste artigo, aprenderemos sobre um método bastante útil chamado <code>split()</code>. Espero que goste do conteúdo.</p><h1 id="o-m-todo-split-em-javascript"><strong>O método split() em JavaScript</strong></h1><p>O método <code>split()</code> divide uma string em duas ou mais substrings, dependendo de um separador (ou <code>splitter</code>). Esse separador pode ser um único caractere, outra string ou até mesmo uma expressão regular.</p><p>Após separar a string em diversas substrings, o método <code>split()</code> adiciona essas substrings em um array e o retorna. Isso é feito sem nenhuma alteração na string original.</p><p>Vejamos um exemplo para entender melhor como isso funciona. A seguir, temos uma string declarada de maneira literal:</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
</code></pre><p>Aqui, podemos chamar o método <code>split()</code> na string <code>message</code>. Vamos dividir a string usando um caractere de espaço (<code>' &nbsp;'</code>) como base. O espaço servirá como um separador.</p><pre><code class="language-js">// Usando o caractere de espaço na divisão
let arr = message.split(' ');

// O array
console.log(arr); // ["I", "am", "a", "Happy", "Go", "lucky", "Guy"]


// Acessando cada elemento do array
console.log(arr[0]); // "I"
console.log(arr[1]); // "am"
console.log(arr[2]); // "a"
console.log(arr[3]); // "Happy"
console.log(arr[4]); // "Go",
console.log(arr[5]); // "lucky"
console.log(arr[6]); // "Guy"

</code></pre><p>O principal objetivo do método <code>split()</code> é obter as partes que queremos de uma string para usá-las de outras maneiras quaisquer.</p><h2 id="como-dividir-uma-string-caractere-por-caractere"><strong>Como dividir uma string caractere por caractere</strong></h2><p>Podemos dividir uma string caractere por caractere ao usar uma string vazia ('') como separador. No exemplo abaixo, dividimos a mesma mensagem do exemplo anterior usando uma string vazia. Como resultado, temos um array contendo todos os caracteres da string message.</p><pre><code class="language-js">console.log(message.split('')); // ["I", " ", "a", "m", " ", "a", " ", "H", "a", "p", "p", "y", " ", "G", "o", " ", "l", "u", "c", "k", "y", " ", "G", "u", "y"]</code></pre><blockquote>💡 Tenha em mente que dividir uma string vazia ('') usando outra string vazia como separador retornará um array vazio. Pode ser que lhe façam essa pergunta na entrevista para uma vaga!</blockquote><pre><code class="language-js">''.split(''); // retorna []</code></pre><h2 id="como-dividir-uma-string-em-um-array"><strong>Como dividir uma string em um array</strong></h2><p>Podemos chamar o método <code>split()</code> em uma string sem usar um separador. Isso significa apenas que o método <code>split()</code> não recebeu nenhum argumento.</p><p>Quando chamamos o método <code>split()</code> em uma string sem especificar um separador, o retorno será um array contendo todo o conteúdo da string.</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split()); // retornará ["I am a Happy Go lucky Guy"]</code></pre><blockquote>💡 Novamente, tenha em mente que chamar o método <code>split()</code> em uma string vazia ('') sem um separador retornará um array com uma string vazia. Nesse caso, o retorno não será um array vazio.</blockquote><p>Veja estes dois exemplos para perceber a diferença:</p><pre><code class="language-js">// Este tetorna um array vazio
''.split(''); // retorna []

// Este retorna um array com uma string vazia
''.split() // retorna [""]</code></pre><h2 id="como-dividir-uma-string-usando-um-caractere-n-o-correspondente"><strong>Como dividir uma string usando um caractere não correspondente</strong></h2><p>Normalmente, usamos um separador que faz parte da string que estamos tentando dividir. Em alguns casos, podemos acabar passado um divisor que não faz parte da string ou que não corresponde a nenhuma parte dela. Em situações assim, o método <code>split()</code> retorna um array com toda a string como elemento.</p><p>No exemplo abaixo, a string <code>message</code> não tem o caractere de vírgula (,). Vamos tentar dividir a string usando a vírgula (,) inexistente como separador.</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split(',')); // ["I am a Happy Go lucky Guy"]</code></pre><blockquote>💡 Você deve estar ciente desse comportamento para caso precise depurar o erro trivial de ter passado o divisor errado para o método <code>split()</code>.</blockquote><h1 id="como-dividir-com-um-limite"><strong>Como dividir com um limite</strong></h1><p>Se você pensou que o método <code>split()</code> tinha apenas o separador como parâmetro opcional, preciso contar a você que existe outro. Também podemos passar o limite (<code>limit</code>) como parâmetro opcional para o método <code>split()</code>.</p><pre><code class="language-js">string.split(splitter, limit);</code></pre><p>Como o próprio nome sugere, o parâmetro <code>limit</code> limitará o número de divisões. Isso significa que o array resultante terá, no máximo, o número de elementos especificado no parâmetro de limite.</p><p>No exemplo abaixo, dividimos uma string usando o caractere de espaço (' ') como separador. Passamos, também, o número <code>4</code> como o limite. Feito isso, o método <code>split()</code> retornará apenas quatro elementos — ignorando o restante.</p><pre><code class="language-js">let message = 'I am a Happy Go lucky Guy';
console.log(message.split(' ', 4)); // ["I", "am", "a", "Happy"] </code></pre><h1 id="como-dividir-usando-regex"><strong>Como dividir usando regex</strong></h1><p>Também é possível passar uma expressão regular (<em>regex</em>) como separador para o método <code>split()</code>. Consideremos a seguinte string a ser dividida:</p><pre><code class="language-js">let message = 'The sky is blue. Grass is green! Do you know the color of the Cloud?';</code></pre><p>Agora, vamos dividi-la nos caracteres de ponto final (.), ponto de exclamação (!) e ponto de interrogação (?). Podemos, agora, escrever uma <em>regex </em>para identificar a presença desses caracteres. Em seguida, passaremos a <em>regex </em>para o método <code>split()</code> e chamaremos o método na string acima.</p><pre><code class="language-js">let sentences = message.split(/[.,!,?]/);
console.log(sentences);</code></pre><p>O resultado será semelhante a este:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-102.png" class="kg-image" alt="image-102" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/image-102.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-102.png 810w" sizes="(min-width: 720px) 720px" width="810" height="220" loading="lazy"><figcaption>Dividindo a string com uma expressão regular</figcaption></figure><p>Podemos ainda usar o parâmetro <code>limit</code> para limitar o resultado aos três primeiros elementos. Fazemos isso da seguinte maneira:</p><pre><code class="language-js">sentences = message.split(/[.,!,?]/, 3);
console.log(sentences);</code></pre><p>O resultado será semelhante a este:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-103.png" class="kg-image" alt="image-103" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/image-103.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/image-103.png 787w" sizes="(min-width: 720px) 720px" width="787" height="194" loading="lazy"><figcaption>Dividindo a string com uma expressão regular e um valor de limite</figcaption></figure><blockquote>💡 Para pegar os caracteres usados na expressão regular, é preciso ajustar a regex um pouco. Devemos usar parênteses para pegar os caracteres correspondentes. A regex atualizada será:<code>/([.,!,?])/</code>.</blockquote><h1 id="como-substituir-caracteres-em-uma-string-usando-o-m-todo-split-"><strong>Como substituir caracteres em uma string usando o método Split()</strong></h1><p>Podemos resolver diversos problemas usando o método <code>split()</code> em conjunto com outros métodos de string e de array. Vejamos um desses problemas agora. Pode ser uma situação comum precisar substituir todas as ocorrências de um caractere na string por outro caractere diferente.</p><p>Por exemplo, você pode querer criar o <code>id</code> de um elemento HTML a partir do valor de um elemento <code>name</code>. O valor de <code>name</code> pode ter um espaço (' '). Porém, no HTML, valores de <code>id</code> não podem ter espaços. Podemos resolver esse problema da seguinte maneira:</p><pre><code class="language-js">let name = 'Tapas Adhikary';
let subs = name.split(' ');
console.log(subs); // ["Tapas", "Adhikary"]

let joined = subs.join('-');
console.log(joined); // Tapas-Adhikary</code></pre><p>Consideremos que o valor de <code>name</code> seja o primeiro nome (Tapas), com o sobrenome (Adhikary) separados por um espaço. Nesse caso, primeiramente devemos dividir <code>name</code> usando o caractere de espaço como separador. Isso retornará um array contendo os valores de nome e sobrenome: <code>['Tapas', 'Adhikary']</code>.</p><p>Em seguida, usamos o método array chamado <code>join()</code> para unir os elementos do array usando o seguinte caractere: <code>-</code>. O método <code>join()</code> retorna uma string resultante da união dos elementos a partir do caractere passado como parâmetro. Assim, obteremos como resultado da operação o valor <code>Tapas-Adhikary</code>.</p><h1 id="es6-como-dividir-usando-desestrutura-o-de-array"><strong>ES6: como dividir usando desestruturação de array</strong></h1><p>O ECMAScript2015 (ES6) introduziu uma maneira mais inovadora de extrair um elemento de um array e atribuí-lo a uma variável. Essa sintaxe inteligente é conhecida como <code>desestruturação de array</code>. Podemos usá-la juntamente com o método <code>split()</code> para atribuir o resultado a uma variável de maneira mais fácil e usando menos linhas de código.</p><pre><code class="language-js">let name = 'Tapas Adhikary';
let [firstName, lastName] = name.split(' ');
console.log(firstName, lastName);</code></pre><p>Nesse exemplo, dividimos o nome usando o caractere de espaço como separador. Em seguida, atribuímos os valores retornados pelo array a duas variáveis (<code>firstName</code> e <code>lastName</code>) usando a sintaxe da desestruturação de array.</p><h1 id="antes-de-terminarmos-"><strong>Antes de terminarmos...</strong></h1><p>👋 Gostaria de programar e aprender comigo? Você pode encontrar o mesmo conteúdo deste artigo no vídeo do YouTube abaixo. Basta abrir o seu editor de código favorito e começar a pôr a mão na massa.</p><figure class="kg-card kg-embed-card" data-test-label="fitted">
        <div class="fluid-width-video-container">
          <div style="padding-top: 56.49999999999999%;" class="fluid-width-video-wrapper">
            <iframe width="200" height="113" src="https://www.youtube.com/embed/xbHFdstSpvc?feature=oembed" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" allowfullscreen="" title="JavaScript Split - How to Split a String into an Array and More" name="fitvid0"></iframe>
          </div>
        </div>
      </figure><p>Espero que você tenha achado este artigo esclarecedor e que ele o ajude a entender o método <code>split()</code> do JavaScript mais claramente. Peço que, por favor, pratique exaustivamente os exemplos aqui apresentados para obter um bom domínio sobre esses conceitos. Você pode encontrar todos os <a href="https://github.com/atapas/js-handbook-examples/blob/master/string/split/index.js">exemplos de código no meu repositório no GitHub</a>.</p><p>Vamos nos conectar. Você pode me encontrar no <a href="https://twitter.com/tapasadhikary">Twitter (@tapasadhikary)</a>. Fique à vontade para me seguir.</p><p>Você também pode se interessar por estes artigos:</p><ul><li><a href="https://www.freecodecamp.org/news/the-javascript-array-handbook/">The JavaScript Array Handbook – JS Array Methods Explained with Examples</a> (conteúdo em inglês)</li><li><a href="https://blog.greenroots.info/10-devtools-tricks-to-help-you-with-css-and-ux-design-ckpp7mtnu04u6whs143e7huwx">10 DevTools tricks to help you with CSS and UX design</a> (conteúdo em inglês)</li><li><a href="https://blog.greenroots.info/a-practical-guide-to-object-destructuring-in-javascript-cknx6tb2l06yvg1s1425rh54f">A practical guide to object destructuring in JavaScript</a> (conteúdo em inglês)</li><li><a href="https://blog.greenroots.info/10-trivial-yet-powerful-html-facts-you-must-know-ckmx0d7q30346c1s125iydcsa">10 trivial yet powerful HTML facts you must know</a> (conteúdo em inglês)</li><li><a href="https://blog.greenroots.info/10-vs-code-emmet-tips-to-make-you-more-productive-ckknjvxal028f1qs18w20e94t">10 VS Code emmet tips to make you more productive</a> (conteúdo em inglês)</li></ul> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Substrings em Python — como recortar uma string ]]>
                </title>
                <description>
                    <![CDATA[ Em Python, uma string é uma sequência de caracteres que podem ser especiais ou alfanuméricos. Um exemplo de string é: "nos vemos na sexta-feira" (em inglês, we meet on Friday ). Você pode acessar subpartes específicas da string, que são popularmente conhecidas como substrings. Podemos definir uma substring como sendo ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/substrings-em-python-como-recortar-uma-string-2/</link>
                <guid isPermaLink="false">64529b2ae704550645dff76e</guid>
                
                    <category>
                        <![CDATA[ Python ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Tue, 23 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/pexels-hitesh-choudhary-7775640.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/python-substring-how-to-slice-a-string/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Python Substring – How to Slice a String</a>
      </p><p>Em Python, uma <em>string</em> é uma sequência de caracteres que podem ser especiais ou alfanuméricos.</p><p>Um exemplo de <em>string </em>é: <em>"nos vemos na sexta-feira</em>" (em inglês, <em>we meet on Friday</em>). Você pode acessar subpartes específicas da <em>string</em>, que são popularmente conhecidas como <em>substrings</em>.</p><p>Podemos definir uma <em>substring </em>como sendo uma sequência de caracteres dentro de uma <em>string</em>. Usemos a frase anterior como exemplo. No Python, poderíamos considerar como <em>substrings </em>as partes "sexta-feira", "na" e "vemos".</p><h2 id="como-criar-uma-substring-em-python"><strong>Como criar uma <em>substring</em> em Python</strong></h2><p>O Python nos fornece diferentes maneiras e métodos para criarmos uma <em>substring</em>, para verificarmos se uma <em>substring </em>está presente, para obtermos o índice de uma <em>substring</em>, entre outras funcionalidades.</p><p>Você pode extrair uma <em>substring </em>de uma <em>string </em>recortando-a com índices que obtêm sua <em>substring </em>da seguinte maneira:</p><p><code>string[começo:fim:passo]</code></p><ul><li><strong>começo </strong>— O índice inicial da <em>substring</em>. O caractere deste índice estará incluso no recorte.</li><li><strong>parada </strong>— O índice final da <em>substring</em>. O caractere deste índice serve apenas como ponto de parada e não estará incluso no recorte.</li><li><strong>passo </strong>— O número que determina o intervalo do recorte. O valor padrão é 1.</li></ul><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image--2-.png" class="kg-image" alt="image--2-" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/image--2-.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/image--2-.png 798w" sizes="(min-width: 720px) 720px" width="798" height="184" loading="lazy"></figure><p>Os valores dos índices podem ser positivos ou negativos. Índices positivos começam do início e vão até o final da <em>string</em>, enquanto que índices negativos começam do final e vão até o início da <em>string</em>.</p><p>Neste artigo, você aprenderá como executar várias operações relacionadas às <em>substrings </em>em Python.</p><h2 id="como-obter-os-primeiros-n-caracteres-de-uma-string-em-python"><strong>Como obter os primeiros n caracteres de uma <em>string </em>em Python</strong></h2><p>Este exemplo nos mostra como recortar os primeiros 5 caracteres da <em>string</em>:</p><pre><code class="language-python">string = "hello world"
print(string[:5])
</code></pre><p>Aqui definimos o índice de parada como 5. O índice de começo é 0 por padrão.</p><p>A saída é: <code>'hello'</code>.</p><h2 id="como-obter-os-caracteres-do-meio-de-uma-string-usando-substrings-em-python"><strong>Como obter os caracteres do meio de uma <em>string </em>usando <em>substrings </em>em Python</strong></h2><p>Este exemplo nos mostra como recortar os caracteres a partir do índice 3 até o índice 5 de uma <em>string</em>:</p><pre><code class="language-python">string = "hello world"
print(string[3:5])
</code></pre><p>A saída é: <code>'lo'</code>.</p><h2 id="como-obter-o-ltimo-caractere-de-uma-string-em-python"><strong>Como obter o último caractere de uma <em>string </em>em Python</strong></h2><p>Para obter o último caractere, basta usar o índice -1 (índice negativo). Vejamos o seguinte exemplo:</p><pre><code class="language-python">string = "freecodecamp"
print(string[-1])
</code></pre><p>A saída será: <code>'p'</code>.</p><h2 id="como-obter-os-ltimos-n-caracteres-de-uma-string-em-python"><strong>Como obter os últimos n caracteres de uma <em>string </em>em Python</strong></h2><p>Neste exemplo, recortaremos os últimos 4 caracteres da <em>string</em>. Aqui, usamos o índice negativo para começarmos o recorte a partir do final da <em>string</em>.</p><pre><code class="language-python">string = "freecodecamp"
print(string[-4:])
</code></pre><p>A saída será: <code>'camp'</code>.</p><h2 id="como-recortar-a-string-com-passos-usando-substrings-em-python"><strong>Como recortar a <em>string </em>com passos usando <em>substrings </em>em Python</strong></h2><p>Podemos indicar o passo no recorte da <em>string </em>após indicarmos os índices de começo e de parada. Por padrão, o passo tem valor 1. No exemplo a seguir, porém, usaremos o passo com valor 2.</p><pre><code class="language-python">string = "welcome to freecodecamp"
print(string[::2])
</code></pre><p>A saída será: <code>'wloet fecdcm'</code>. Isso porque, com passo 2, recortamos de 2 em 2 caracteres.</p><h2 id="como-verificar-se-uma-substring-est-presente-em-uma-string-em-python"><strong>Como verificar se uma <em>substring </em>está presente em uma <em>string </em>em Python</strong></h2><p>Às vezes, gostaríamos de verificar se uma <em>substring </em>está presente em uma <em>string</em>. O exemplo a seguir verificará se a <em>substring</em> 'code' faz parte da <em>string</em>:</p><pre><code class="language-python">substring = "code"
string = "welcome to freecodecamp"
print(substring in string)
</code></pre><p>Se a <em>substring </em>definida estiver presente na <em>string</em>, o retorno será <code>True</code>. Do contrário, será <code>False</code>.<br><br>Nesse caso, a saída será: <code>True</code>. Isso acontece porque '<strong>code</strong>' faz parte de 'free<strong>code</strong>camp'.</p><h2 id="outra-maneira-de-verificar-se-uma-substring-est-presente-em-uma-string-em-python"><strong>Outra maneira de verificar se uma <em>substring </em>está presente em uma <em>string </em>em Python</strong></h2><p>Podemos usar o método <code>find()</code> para verificar se encontramos a <em>substring </em>desejada na <em>string</em>.</p><p>Vejamos o seguinte exemplo:</p><pre><code class="language-python">substring = "zz"
string = "hello world"
print(string.find(substring))
</code></pre><p>Se a <em>substring </em>for encontrada na <em>string</em>, o retorno será o índice em que a <em>substring </em>começa. Se não for encontrada, o método retorna -1.</p><p>Neste caso, a saída é: <code>-1</code>. Isso significa que "<strong>zz</strong>" não está faz parte de "hello world".</p><h2 id="como-obter-o-caractere-de-um-determinado-ndice-em-uma-string-em-python"><strong>Como obter o caractere de um determinado índice em uma <em>string </em>em Python</strong></h2><p>Podemos passar o índice de um caractere específico para recortá-lo.</p><pre><code class="language-python">string ="hello world"
print(string[4])
</code></pre><p>A saída será: <code>'O'</code>, que é o caractere presente na posição 4.</p><h2 id="como-criar-uma-lista-de-substrings-a-partir-de-uma-string-em-python"><strong>Como criar uma lista de <em>substrings </em>a partir de uma <em>string </em>em Python</strong></h2><p>Podemos usar o método <code>split()</code><strong><strong> </strong></strong>para criarmos uma lista de <em>substrings</em>. Vejamos sua aplicação no seguinte exemplo:</p><pre><code class="language-python">string = "welcome to freecodecamp platform"
print(string.split())
</code></pre><p>A saída será: <code>['welcome', 'to', 'freecodecamp', 'platform']</code>.</p><h2 id="como-inverter-uma-string-em-python-usando-passo-negativo"><strong>Como inverter uma <em>string </em>em Python usando passo negativo</strong></h2><p>Para inverter a <em>string</em>, o passo deve ter um valor negativo, por exemplo: -1.</p><pre><code class="language-python">string = "welcome to freecodecamp"
print(string[::-1])
</code></pre><p>A saída será: <code>'pmacedoceerf ot emoclew'</code>.</p><h2 id="como-contar-quantas-vezes-uma-substring-est-presente-em-uma-string-em-python"><strong>Como contar quantas vezes uma <em>substring</em> está presente em uma <em>string </em>em Python</strong></h2><p>Podemos usar o método <code>count()</code> para sabermos quantas vezes uma determinada <em>substring </em>aparece em uma <em>string</em>.</p><pre><code class="language-python">string = "we will have a quick coding lesson this afternoon"
print(string.count('noon'))
</code></pre><p>A saída será: 1.</p><h2 id="considera-es-finais-sobre-substrings-em-python"><strong>Considerações finais sobre <em>substrings </em>em Python</strong></h2><p>Parabéns por chegar ao final deste artigo. 👏👏 Espero que você tenha aprendido algo novo sobre <em>substrings </em>em Python.</p><p>Se você, de fato, aprendeu algo novo ou se gostou de ler este artigo, compartilhe-o para que outras pessoas também possam lê-lo. Até lá, nos vemos no próximo artigo!</p><p>Você também pode encontrar o autor no <a href="https://twitter.com/Davis_McDavid?ref=hackernoon.com">Twitter</a> e ler mais artigos como este <a href="https://hackernoon.com/u/davisdavid?ref=hackernoon.com">aqui</a> (textos em inglês).</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ PHP x JavaScript: escolhendo a melhor linguagem para seus projetos ]]>
                </title>
                <description>
                    <![CDATA[ Se por acaso alguém disser que "JavaScript é apenas para desenvolvimento para front-end e PHP é para back-end", não dê ouvidos. Antes de começar a afirmar que uma língua é melhor do que a outra, há algo que preciso deixar claro. Não quero transformar a discussão entre PHP e JavaScript ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/php-x-javascript-escolhendo-a-melhor-linguagem-para-seus-projetos/</link>
                <guid isPermaLink="false">64348ef684d2fb0595fd5d0d</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Wed, 17 May 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/title_images__40_-min_720.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/php-vs-javascript-which-technology-will-suit-your-business-better/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/php-vs-javascript-which-technology-will-suit-your-business-better/</a>
      </p><p>Se por acaso alguém disser que "JavaScript é apenas para desenvolvimento para front-end e PHP é para back-end", não dê ouvidos.</p><p>Antes de começar a afirmar que uma língua é melhor do que a outra, há algo que preciso deixar claro. Não quero transformar a discussão entre PHP e JavaScript em uma comparação de maçãs e laranjas. Portanto, explicarei a principal diferença entre as duas.</p><p>PHP é uma linguagem de programação voltada apenas para desenvolvimento para back-end. O JavaScript, por sua vez, foi inicialmente criado como uma linguagem para desenvolvimento para front-end. No entanto, com a introdução do Node.js, em 2009, o JavaScript tornou-se o que chamamos de <em>full-stack</em>.</p><p>Tendo isso em vista, a afirmação comumente citada de que "JavaScript é apenas para desenvolvimento para front-end e PHP é para back-end" simplesmente não é verdade. Hoje, você pode desenvolver toda uma aplicação usando JavaScript – tanto o lado do <em>client</em> quanto o lado do servidor. A questão é: qual linguagem é mais adequada para o seu projeto?</p><p>Portanto, se você está tentando decidir entre PHP e JavaScript, a discussão é reduzida a qual linguagem você deseja usar para o desenvolvimento do back-end. Para ajudá-lo a tomar essa decisão, compararei PHP e JavaScript para desenvolvimento para a web com base nos seguintes critérios:</p><ol><li>Visão geral</li><li>Desempenho e velocidade</li><li>Extensibilidade</li><li>Universalidade</li><li>Comunidade</li><li>Curva de aprendizagem</li><li>Sintaxe</li><li>Apps para os quais é mais adequado</li></ol><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Angular_React-min.png" class="kg-image" alt="Angular_React-min" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/05/Angular_React-min.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/05/Angular_React-min.png 1000w" sizes="(min-width: 720px) 720px" width="1000" height="1465" loading="lazy"></figure><h2 id="vis-o-geral"><strong>Visão geral</strong></h2><h3 id="javascript"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>O JavaScript é uma linguagem de programação dinâmica, leve, multiparadigma, de alto nível, interpretada ou compilada <em>just-in-time</em>. Criado em 1995 por Brendan Eich, o JavaScript é caracterizado por sintaxe com uso de chaves (<code>{}</code>), funções de primeira classe e orientação a objetos baseada em protótipos.</p><p>De acordo com o site <a href="https://www.statista.com/statistics/869092/worldwide-software-developer-survey-languages-used/"><u>Statista</u></a>(em inglês), 69% dos desenvolvedores ao redor do mundo usam JavaScript. Outros 5% pretendem adotar a linguagem. O relatório nos mostra que essa era a linguagem de programação mais popular no mundo ao no início desta década.</p><h3 id="php"><strong><strong><strong>PHP</strong></strong></strong></h3><p>PHP é a sigla para <em>PHP Hypertext Preprocessor</em>. É uma linguagem de script de código aberto para desenvolvimento para back-end. Desenvolvida em 1994 por Rasmus Lerdorf, a linguagem é mundialmente reconhecida. De acordo com o site <u><a href="https://w3techs.com/technologies/details/pl-php">W3Tech</a>(em inglês)</u>, 79% dos websites usam PHP. Entre os mais populares estão o Facebook, a Wikipédia e, claro, o WordPress.</p><p><strong>PHP 0 x 0 JavaScript</strong></p><h2 id="desempenho-e-velocidade"><strong>Desempenho e velocidade</strong></h2><h3 id="javascript-1"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>O JavaScript é caracterizado por um modelo de execução orientado por eventos,<em> sem bloqueio de entrada e saída </em>e <em>thread única</em>. Esse modelo é possível graças ao evento de <em>loop</em> e ao <em>clustering </em>do Node.</p><p>A natureza assíncrona do Node.js permite que ele percorra todo o código simultaneamente sem precisar esperar que algumas funções sejam executadas. Graças a isso, o JavaScript é a melhor solução para aplicações de baixa latência, como plataformas de <em>streaming</em>. O Node.js ganha ainda mais velocidade por conta do mecanismo V8, conexão constante com o servidor e funções de <em>callback</em>.</p><h3 id="php-1"><strong><strong><strong>PHP</strong></strong></strong></h3><p>O PHP é caracterizado por um modelo de execução de <em>threads múltiplas com bloqueio de entrada e saída</em>. Ao contrário do JavaScript, o PHP é síncrono. A segunda linha de código em PHP só pode ser executada depois da primeira, o que o torna muito mais lento do que o JavaScript.</p><p>Embora o PHP, sem dúvida, perca em velocidade, alguns dizem que ele é mais estável do que o JavaScript. Porém, essa vantagem é duvidosa e ainda não foi totalmente comprovada.</p><p><em>A confiabilidade e a estabilidade de ambas as linguagens é uma questão que permanece aberta à interpretação. Porém, graças à sua excelente velocidade, o JavaScript ganha um ponto no critério <strong>desempenho e velocidade</strong></em>.</p><p><strong>PHP 0 x 1 JavaScript</strong></p><h2 id="extensibilidade"><strong>Extensibilidade</strong></h2><h3 id="javascript-2"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>O JavaScript pode ser combinado com HTML, XML e Ajax.</p><p>Há um grande volume de <em>frameworks </em>para JavaScript. Seu número beira ao incontável, tendo em vista que novos surgem com bastante frequência.</p><p>As tecnologias de JS mais populares são: <u>Vue</u>, <u>Angular</u> e <u>React</u>. Aqui na KeenEthics, porém, vislumbramos um futuro promissor para o Svelte.</p><p>O <em>framework </em>mais comum do lado do servidor é o <a href="https://keenethics.com/services-web-development-node"><u>Node.js</u></a>. O <em>framework </em>que você escolher para desenvolver sua aplicação pode determinar sua velocidade e custo de desenvolvimento, assim como desempenho e outros fatores técnicos.</p><p>Com relação aos gerenciadores de pacotes, o Node.js já conta com o NPM (<em>Node Package Manager</em>) pré-instalado. O NPM facilita muito a vida dos desenvolvedores, sendo o maior registro de softwares do mundo.</p><h3 id="php-2"><strong><strong><strong>PHP</strong></strong></strong></h3><p>O PHP pode ser combinado apenas com HTML.</p><p>Provavelmente, a maior vantagem do PHP é a disponibilidade de CMSs, como o WordPress ou o Drupal. Essas soluções podem facilitar muito o desenvolvimento para a web e até torná-lo mais barato. O PHP também pode ser estendido com qualquer tecnologia da <em>stack </em>LAMP e soluções de servidor, como MySQL ou PostgreSQL.</p><p>Existem dois gerenciadores de pacotes para o PHP: PEAR e Composer. O PEAR (PHP Extension and Application Repository) é uma biblioteca estruturada do PHP de código aberto. O Composer é uma ferramenta de gerenciamento de dependências para PHP.</p><p><em>De maneira geral, o JavaScript oferece mais oportunidades de extensibilidade. Portanto, ele leva o ponto no critério <strong>extensibilidade</strong></em>.</p><p><strong>PHP 0 x 2 JavaScript</strong></p><h2 id="universalidade"><strong>Universalidade</strong></h2><p>O JavaScript é multiplataforma, assim como o PHP. Tanto o PHP quanto o JavaScript são voltados, principalmente, para o desenvolvimento de aplicações para a web. Embora ambos possam ser utilizados para o desenvolvimento de aplicações móveis.</p><h3 id="javascript-3"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>A maior vantagem do JavaScript sobre o PHP está no fato de o JavaScript ser uma linguagem de desenvolvimento <em>full-stack</em>. A maior parte das comparações entre JS e PHP enfatizam que o JavaScript é uma linguagem usada apenas no front-end, o que não é verdade. Você pode desenvolver uma aplicação para a web ou para dispositivos móveis usando apenas o JavaScript.</p><p>A experiência da KeenEthics prova isso. Como uma empresa orientada para o JS, desenvolvemos soluções para a web e dispositivos móveis personalizadas a partir do zero usando apenas JavaScript.</p><h3 id="php-3"><strong><strong><strong>PHP</strong></strong></strong></h3><p>O PHP é apenas uma linguagem de desenvolvimento para back-end. Além disso, o PHP pertence à <em>stack</em> LAMP, que é uma sigla para: Linux, Apache, MySQL e PHP/Perl/Python.</p><p>Para desenvolver um aplicativo para a web com essa <em>stack </em>de tecnologias, um engenheiro de software precisa conhecer quatro sistemas de sintaxe diferentes — bem como HTML e CSS. Alternar entre linguagens é tão inconveniente quanto ineficiente, além de complicar muito a curva de aprendizagem.</p><p><em>Desenvolver em JavaScript é desenvolver de maneira full-stack, sendo essa a maior vantagem da linguagem. Ponto para o JavaScript no critério <strong>universalidade</strong></em>.</p><p><strong>PHP 0 x 3 JavaScript</strong></p><h2 id="comunidade"><strong>Comunidade</strong></h2><h3 id="javascript-4"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>De acordo com o site <a href="https://stackshare.io/stackups/javascript-vs-php"><u>stackshare.io</u></a><u> </u>(em inglês), as principais razões que levam os desenvolvedores a gostar de trabalhar com o JavaScript são: sua universalidade (pode ser usado no front-end e no back-end), sua popularidade (está em todo lugar) e sua extensibilidade (conta com uma série de <em>frameworks</em> excelentes).</p><p>O JavaScript é usado pelas plataformas: Netflix, LinkedIn, Trello, Uber, Airbnb, Instagram, eBay, NASA e Medium.</p><p>A maioria dos <em>frameworks </em>de JS são de código aberto, embora o JavaScript propriamente dito não o seja.</p><p>O JavaScript é a linguagem mais popular do <a href="https://madnight.github.io/githut/#/pull_requests/2019/4"><u>GitHub</u></a>, com mais de 20% de <em>pull requests</em> compartilhados.</p><h3 id="php-4"><strong><strong><strong>PHP</strong></strong></strong></h3><p>O <a href="https://stackshare.io/stackups/javascript-vs-php"><u>stackshare.io</u></a> nos mostra que as vantagens mais adoradas do PHP são: uma ampla comunidade, código aberto e facilidade de <em>deploy</em>.</p><p>O PHP é usado por empresas como Facebook, Lyft, Wikipedia, Slack, Tumblr e 9GAG.</p><p>O PHP é uma linguagem de código aberto, o que o torna mais flexível e personalizável.</p><p>No <a href="https://madnight.github.io/githut/#/pull_requests/2019/4"><u>GitHub</u></a>, o PHP ocupa a oitava posição — com cerca de 5% de <em>pull requests</em>.</p><p><em>Ambas as linguagens têm enormes comunidades de suporte e são favorecidas por gigantes da tecnologia. Tanto o PHP quanto o JavaScript levam este ponto no critério <strong>comunidade</strong></em>.</p><p><strong>PHP 1 x 4 JavaScript</strong></p><h2 id="curva-de-aprendizagem"><strong>Curva de aprendizagem</strong></h2><h3 id="php-5"><strong><strong><strong>PHP</strong></strong></strong></h3><p>PHP é muito mais simples de começar a aprender do que JavaScript. Configurar um servidor e tão simples quanto criar um arquivo .php — basta escrever algumas linhas de código envolvidas pelas tags <code>&lt;?php?&gt;</code> e colocar o URL no navegador.</p><p>Além disso, as particularidades do PHP — como funções inconsistentes ou valores de retorno — são mais fáceis de entender e de dominar do que as do JavaScript e de certos <em>frameworks</em> do JS.</p><h3 id="javascript-5"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>Configurar o JavaScript — ou seja, o Node.js — para o lado do servidor não é tão complicado. É, porém, mais difícil do que seria com PHP. Um desenvolvedor de JS iniciante precisa de mais conhecimento sobre o assunto do que um desenvolvedor de PHP iniciante precisaria.</p><p>Porém, o esforço feito para se aprender JavaScript é totalmente recompensado. Por ser uma linguagem mais universal do que o PHP, o esforço de se aprender JavaScript acaba sendo mais valioso.</p><p><em>O PHP ganha este ponto pela sua simplicidade de aprendizagem. Fator que agrada aos desenvolvedores iniciantes</em>.</p><p><strong>PHP 2 x 4 JavaScript</strong></p><h2 id="sintaxe"><strong>Sintaxe</strong></h2><p>A sintaxe de uma linguagem de programação, na maioria dos casos, é apenas uma questão de preferência pessoal. Portanto, nenhuma das linguagens ganha este ponto.</p><p>Ainda assim, apresentarei uma comparação entre as regras de sintaxe de ambas, para o caso de o leitor estar em dúvida sobre qual delas aprender. Talvez as particularidades de uma linguagem sejam mais adequadas para você. Talvez seja assim que você fará sua escolha.</p><ul><li>Tanto o PHP como o JavaScript fazem uso de parênteses, colchetes e chaves.</li><li>As variáveis em PHP e em JavaScript podem ser de qualquer tipo, podem mudar de tipo e podem ter seu tipo verificado pelo respectivo operador de cada linguagem — <em>typeof </em>no JS e <em>gettype </em>no PHP.</li><li>Em ambas as linguagens, os arrays iniciam em "0".</li><li>O laço <em>for() </em>funciona de maneira idêntica no PHP e no JavaScript. A diferença está apenas em como a variável dentro dos parênteses é declarada. O laço <em>foreach() </em>do PHP pode ser facilmente convertido para um laço <em>for() </em>do JavaScript.</li><li>Em JS, as variáveis têm escopo global por padrão, a não ser que declaremos seu escopo como local com a palavra reservada <em>var</em>. Uma variável local está disponível para tudo dentro da função e de suas subfunções.</li><li>Em JS, a adição e a concatenação são feitas com "+".</li><li>O JS diferencia letras maiúsculas de minúsculas em variáveis e funções.</li><li>Não há arrays associativos (pares de chave-valor) em JS. É necessário usar strings do JSON para esse recurso.</li><li>Em JS, arrays e objetos são muito semelhantes e, muitas vezes, intercambiáveis. Um item de objeto também pode ser referenciado como um item de array.</li><li>Em JS, os itens de objetos são referenciados por meio do ponto final ".".</li><li>O PHP faz uso de cifrões "$" para indicar variáveis, coisa que o JS não faz. Todas as variáveis têm escopo local por padrão, a menos que declaradas globais com a palavra reservada <em>global</em>. Uma variável local não estará disponível em subfunções, a menos que a passemos como argumento.</li><li>Em PHP, a adição é feita com " + " e a concatenação é feita com ".".</li><li>O PHP diferencia letras maiúsculas de minúsculas APENAS em variáveis.</li><li>O PHP permite arrays numéricos e associativos.</li><li>Em PHP, arrays e objetos são duas coisas completamente diferentes — com sintaxes também diferentes.</li><li>No PHP, itens em objetos são referenciados com uma seta "-&gt;".</li></ul><p>Essas são algumas das diferenças mais básicas que você deve saber sobre as duas linguagens. Para conhecer mais diferenças de sintaxe entre o PHP e o confira <a href="https://engineering.carsguide.com.au/php-vs-javascript-syntax-5e11303239b8"><u>este artigo</u></a> (em inglês).</p><p><em>Como já foi mencionado, nenhuma das linguagens leva o ponto neste critério, pois a sintaxe é uma questão de preferência pessoal</em>.</p><p><strong>PHP 2 x 4 JavaScript</strong></p><h2 id="aplica-es-para-as-quais-mais-adequado"><strong>Aplicações para as quais é mais adequado</strong></h2><h3 id="javascript-6"><strong><strong><strong>JavaScript</strong></strong></strong></h3><p>O JavaScript tem hospedagem de servidor dedicado, o que o torna perfeitamente adequado para grandes projetos. Ele pode ser usado para desenvolver para o front-end e para o back-end para quase qualquer tipo de aplicação de software — incluindo jogos 3D, soluções AR/VR, produtos IoT e assim por diante.</p><h3 id="php-6"><strong><strong><strong>PHP</strong></strong></strong></h3><p>Embora o PHP seja uma linguagem de programação de uso geral, ele é usado principalmente para o desenvolvimento de páginas web dinâmicas. Considerando a disponibilidade de sistemas de gerenciamento de conteúdo baseados em PHP, como Moodle e WordPress, o PHP é a melhor opção para blogs, sistemas de gerenciamento de aprendizagem e sites de <em>e-commerce</em>.</p><p><em>Novamente, em termos de aplicações para as quais é mais adequada, cada linguagem é diferente, mas não necessariamente melhor ou pior do que a concorrente. Tanto o PHP quanto o JavaScript são bastante universais. Portando, as duas linguagens levam este ponto</em>.</p><p><strong>PHP 3 x 5 JavaScript</strong></p><h2 id="para-finalizar"><strong>Para finalizar</strong></h2><p>A comparação entre PHP e JavaScript termina com um placar de 3 x 5 — conferindo a "vitória" para o JavaScript.</p><p>Ambas as linguagens são muito boas em termos de suporte da comunidade, extensibilidade e aplicações às quais são adequadas. O JavaScript é certamente mais eficiente em termos de velocidade e universalidade. Por outro lado, perde para o PHP em termos de curva de aprendizagem — embora a sintaxe, como concluímos, seja apenas uma questão de preferência pessoal.</p><p>Tenha em mente que nem sempre o JavaScript e o Node.js serão a melhor escolha. Isso cabe a você e ao seu projeto.</p><p><strong>Opte pelo Node.js quando você for:</strong></p><ul><li>Desenvolver uma aplicação de página única.</li><li>Desenvolver uma aplicação em tempo real, tal como um serviço de <em>streaming </em>ou de troca de mensagens.</li><li>Construir um grande projeto com uma carga de dados pesada.</li><li>Usar o JavaScript para desenvolvimento para front-end.</li></ul><p><strong>Opte pelo PHP quando você for:</strong></p><ul><li>Desenvolver um blog ou um site <em>e-commerce</em>.</li><li>Fazer uso das tecnologias LAMP.</li></ul><h2 id="tem-uma-ideia-para-um-projeto"><strong>Tem uma ideia para um projeto?</strong></h2><p>Minha empresa, a KeenEthics, pode não ajudá-lo com PHP exatamente, mas somos um <a href="https://keenethics.com/#tech-stack">empresa experiente em JavaScript</a> e estamos dispostos a aceitar o desafio. Se você está pronto para fazer a diferença e iniciar seu projeto, sinta-se à vontade para <a href="https://keenethics.com/contacts">entrar em contato conosco</a><em>.</em></p><p>Se você gostou deste artigo, definitivamente deveria ler outra comparação maravilhosa: <a href="https://www.freecodecamp.org/portuguese/news/angular-x-react-qual-deles-escolher-para-a-sua-aplicacao/#:~:text=Conclus%C3%A3o,o%20aux%C3%ADlio%20de%20bibliotecas%20adicionais">Angular x React: qual deles escolher para a sua aplicação</a> ou <a href="https://www.freecodecamp.org/portuguese/news/node-js-x-python-como-escolher-a-melhor-tecnologia-para-desenvolver-o-back-end-de-seu-aplicativo-web/">Node.JS x Python: como escolher a melhor tecnologia para desenvolver o back-end do seu aplicativo web</a>.</p><h2 id="para-encerrar"><strong>Para encerrar</strong></h2><p>Gostaria também de agradecer a Yaryna Korduba, uma das mais impressionantes desenvolvedoras para a web da KeenEthics, por inspirar e contribuir para este artigo.</p><p>O artigo original publicado no blog da KeenEthics pode ser encontrado aqui: <a href="https://keenethics.com/blog/php-vs-javascript">PHP vs JavaScript: Which Technology Will Suit Your Business Better?</a></p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Design responsivo para a web – como adaptar um site a celulares e tablets ]]>
                </title>
                <description>
                    <![CDATA[ Com a rápida evolução dos dispositivos conectados, o design responsivo continua a ser fundamental para o desenvolvimento para a web. Até pouco tempo atrás, a expressão "design responsivo para a web" sequer existia. Porém, hoje, muitos de nós precisaram adotar esse conceito de alguma maneira. De acordo com o site ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/design-responsivo-para-a-web-como-adaptar-um-site-a-celulares-e-tablets/</link>
                <guid isPermaLink="false">63f295b558018c06027bf8b9</guid>
                
                    <category>
                        <![CDATA[ Design responsivo ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ João Eduardo Gomes ]]>
                </dc:creator>
                <pubDate>Thu, 13 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/curve-design-futuristic-lines-911738.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/responsive-web-design-how-to-make-a-website-look-good-on-phones-and-tablets/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Responsive Web Design – How to Make a Website Look Good on Phones and Tablets</a>
      </p><p>Com a rápida evolução dos dispositivos conectados, o design responsivo continua a ser fundamental para o desenvolvimento para a web.</p><p>Até pouco tempo atrás, a expressão "design responsivo para a web" sequer existia. Porém, hoje, muitos de nós precisaram adotar esse conceito de alguma maneira.</p><p><a href="https://www.statista.com/statistics/275814/mobile-share-of-organic-search-engine-visits/">De acordo com o site Statistica</a> (em inglês), em 2019, 61% das pesquisas feitas no Google partiram de um dispositivo móvel. Em setembro de 2020, <a href="https://webmasters.googleblog.com/2020/03/announcing-mobile-first-indexing-for.html">a Google viria a mudar seu algoritmo de pesquisa</a> (texto em inglês) a fim de dar prioridade a sites que fossem compatíveis com dispositivos móveis.</p><p><strong>Neste artigo, serão abordados os seguintes tópicos:</strong></p><ul><li>O que é o design responsivo para a web?</li><li>A tag meta viewport e como ela funciona</li><li>Técnicas eficazes de design responsivo para a web para adaptar seu conteúdo a dispositivos móveis</li><li>Ferramentas para ajudar a simular e monitorar a experiência do usuário em celulares e tablets</li></ul><h2 id="o-que-o-design-responsivo-para-a-web"><strong>O que é o design responsivo para a web?</strong></h2><p>O design responsivo para a web é uma abordagem que tem como foco o ambiente do usuário do site. O ambiente do usuário dependerá do dispositivo que ele usa para se conectar à internet.</p><p>Existem diversos fatores que oferecem oportunidades para uma abordagem focada no usuário. Alguns desses fatores são:</p><ul><li>conexão de rede;</li><li>tamanho de tela;</li><li>tipo de interação (como tela sensível ao toque ou painel tátil);</li><li>resolução gráfica.</li></ul><p>Antes da popularização do design responsivo para a web, muitas empresas administravam um site à parte para receber tráfego encaminhado com base no agente do usuário.</p><p>Porém, no design responsivo para a web, o servidor sempre envia o mesmo código HTML para todos os dispositivos, enquanto o CSS é usado para alterar a renderização da página em cada dispositivo.</p><p>Independentemente dessas duas abordagens, a primeira etapa na criação de um site para celular ou tablet é garantir que o navegador conheça a intenção. É nesse ponto que a tag <em>meta viewport</em> entra em jogo.</p><h2 id="identificando-um-site-da-web-para-dispositivos-m-veis-com-a-tag-meta-viewport"><strong>Identificando um site da web para dispositivos móveis com a tag <em>meta viewport</em></strong></h2><p>A tag meta viewport faz o navegador se ajustar à largura da tela de cada dispositivo.</p><p>Sem o elemento <em>meta viewport</em>, os navegadores de dispositivos móveis exibirão páginas da web com configurações padrão para dispositivos desktop. O resultado disso é uma experiência não responsiva e com uma visualização bastante distanciada do conteúdo.</p><p>A seguir, temos uma implementação padrão:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;meta name="viewport" content="width=device-width,initial-scale=1"/&gt;</code></pre><figcaption>Exemplo da tag meta viewport</figcaption></figure><p>Agora que informamos ao navegador o que está acontecendo, que tal utilizarmos técnicas populares para tornar nosso site responsivo?</p><h2 id="media-queries-do-css-para-diferentes-tamanhos-e-orienta-es-de-tela"><strong>Media queries do CSS para diferentes tamanhos e orientações de tela</strong></h2><p>Se você é novo no design responsivo para a web, saiba que as <em>media queries</em> são o primeiro e mais importante recurso a ser aprendido. As <em>media queries</em> nos permitem estilizar os elementos com base na largura da <em>viewport</em>. Uma estratégia popular do CSS é estabelecer estilos com foco nos dispositivos móveis primeiro (técnica que, em inglês, chama-se <em>mobile first</em>) e, a partir deles, desenvolver estilos mais complexos e específicos para o desktop.</p><p>As <em>media queries</em> são uma parte importante do design responsivo para a web. Elas são comumente usadas para atributos como <em>grid layout</em>, <em>font-size</em>, <em>margin</em> e <em>padding</em> para que eles possam se comportar de maneira diferente, dependendo da tela do dispositivo.</p><p>Aqui, temos um exemplo bastante comum de estilo usando a técnica do <em>mobile first</em>. Nele, vemos que a largura da coluna será de 100% em telas pequenas e de 50% em telas maiores.</p><figure class="kg-card kg-code-card"><pre><code class="language-css">.column {
  width: 100%;
}

@media (min-width: 600px) {
  .column {
    width: 50%;
  }
}</code></pre><figcaption>Exemplo de CSS usando a técnica do <em>mobile first</em></figcaption></figure><p>O código acima pode ser simples, mas seu resultado é bem interessante.</p><ol><li>Considerando o <em>mobile first</em>, O elemento "<em>column</em>" é definido como tendo uma largura de 100%;</li><li>Usando uma <em>media query</em> com <code>min-width</code>, definimos estilos específicos para <em>viewports </em>que tenham a partir de <code>600px</code>. Assim, para <em>viewports </em>maiores que <code>600px</code>, nosso elemento "<em>column</em>" terá uma largura que é de 50% com relação ao seu elemento pai.</li></ol><p>Embora as <em>media queries</em> sejam essenciais para o design responsivo para a web, outros diversos recursos do CSS vêm sendo amplamente adotados e aceitos pelos navegadores. O <em>flexbox</em> é um desses novos e importantes recursos para o design responsivo para a web.</p><h2 id="o-que-o-flexbox"><strong>O que é o Flexbox?</strong></h2><p>Você pode estar se perguntando: "o que o Flexbox faz"? A pergunta mais adequada seria: "o que o Flexbox não faz"? Qual é a maneira mais fácil de centralizar um elemento verticalmente com CSS? Flexbox. Como criar um <em>grid layout</em> responsivo? Flexbox. Como conquistar a paz mundial? Flexbox.</p><p>O módulo de layout do Flexbox (Flexible Box) oferece um modo mais eficiente de dispor, alinhar e distribuir o espaço entre os itens em um contêiner; mesmo quando o seu tamanho é dinâmico (daí a palavra "flex").</p><p>No exemplo a seguir, combinamos as já mencionadas <em>media queries </em>para criar um <em>grid </em>responsivo:</p><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  main {
    background: #d9d7d5;
    display: flex;
    flex-wrap: wrap;
    justify-content: space-between;
  }

  div {
    background: #767775;
    flex-basis: 100%;
    height: 100px;
    margin-bottom: 0.5rem;
  }

  @media (min-width: 600px) {
    main {
      flex-wrap: nowrap;
    }

    div {
      flex-basis: 33%;
    }
  }
&lt;/style&gt;
&lt;main&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
  &lt;div&gt;&lt;/div&gt;
&lt;/main&gt;</code></pre><figcaption>Exemplo do CSS Flexbox</figcaption></figure><p>Com esse código, nós:</p><ol><li>Estabelecemos um layout com Flexbox usando <code>display: flex</code> em nosso contêiner <code>main</code>.</li><li>Estilizamos seguindo a técnica do mobile first. Definimos o elemento <code>main</code> para <code>flex-wrap: wrap</code>, o que habilitará uma quebra de linha para os elementos filhos — conforme podemos ver na figura 1. Definimos um <code>flex-basis: 100%</code> em nossas <code>div</code>s para garantir que elas ocupem 100% da largura do elemento pai (também na figura 1).</li><li>Definimos um estilo para dispositivos maiores, como tablets e desktops. Utilizamos uma <em>media query </em>igual à do exemplo da seção anterior para declarar no contêiner <code>main</code> a propriedade <code>flex-wrap: nowrap</code>. Isso impede que os elementos filhos tenham uma quebra de linha, o que os mantêm lado a lado no mesmo eixo. Ao configurar na <code>div</code> um <code>flex-basis: 33%</code> para essa mesma <em>media query</em>, estabelecemos que as colunas tenham 33% da largura do elemento pai.</li><li>A mágica deste exemplo deve acontecer em dispositivos maiores — com a combinação das nossas regras de <em>media query</em> e o Flexbox. Por termos definido <code>display: flex</code> e por termos mantido essa regra na <em>media query</em>, pudemos criar um layout de Flexbox para celulares, tablets e desktops. A <em>media query </em>que herda o <code>display: flex</code> e define a regra <code>flex-basis: 33%</code> nos apresentará um layout do Flexbox conforme podemos observar na figura 2. Antigamente, para conseguirmos esse layout em colunas, teríamos o trabalho de escrever extensas regras de CSS.</li></ol><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-mobile-1.png" class="kg-image" alt="grid-mobile-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/grid-mobile-1.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/grid-mobile-1.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/grid-mobile-1.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-mobile-1.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="2250" loading="lazy"><figcaption>Figura 1: exemplo de grid com o Flexbox para dispositivos móveis</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-desktop.png" class="kg-image" alt="grid-desktop" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/grid-desktop.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/grid-desktop.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/grid-desktop.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/grid-desktop.png 2000w" sizes="(min-width: 720px) 720px" width="2000" height="789" loading="lazy"><figcaption>Figura 2: exemplo de grid com o Flexbox para desktop</figcaption></figure><p>Graças ao Flexbox, porém, conseguimos ter layouts variados e fluídos. Em alguns casos, podemos não ter tanta liberdade no espaço vertical. Talvez seja necessário ajustar um elemento a uma altura fixa. Para isso, temos outra ferramenta à nossa disposição: a rolagem horizontal (do inglês, <em>horizontal scroll</em>).</p><h2 id="rolagem-horizontal-com-overflow-scroll"><strong>Rolagem horizontal com <em>overflow scroll</em></strong></h2><p>Em algum momento, você talvez se depare com conteúdo saindo da <em>viewport </em>e queira deixá-lo mais, digamos, elegante. Eis que temos <em>overflow scroll</em> para salvar o dia. Essa técnica pode ser aplicada para menus e tabelas com rolagem de conteúdo. Segue abaixo um exemplo de menu com essa característica.</p><!--kg-card-begin: html--><menu style="margin: auto; max-width: 826px; background: #d9d7d5; padding: 0.25rem; overflow-y: scroll; white-space: nowrap;">
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Design responsivo para a web</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Responsividade</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Menu responsivo</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Exemplo de overflow scroll</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">É muita coisa!</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">Sim</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">temos</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">mais</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">um</span>
  <span style="background: #767775; color: #ffffff; display: inline-block; margin: 0.25rem; padding: 0.5rem;">item</span>
</menu><!--kg-card-end: html--><figure class="kg-card kg-code-card"><pre><code class="language-html">&lt;style&gt;
  menu {
    background: #d9d7d5;
    padding: 0.25rem;
    overflow-y: scroll;
    white-space: nowrap;
  }

  span {
    background: #767775;
    color: #ffffff;
    display: inline-block;
    margin: 0.25rem;
    padding: 0.5rem;
  }
&lt;/style&gt;
&lt;menu&gt;
  &lt;span&gt;Design responsivo para a web&lt;/span&gt;
  &lt;span&gt;Responsividade&lt;/span&gt;
  &lt;span&gt;Menu responsivo&lt;/span&gt;
  &lt;span&gt;Exemplo de overflow scroll&lt;/span&gt;
  &lt;span&gt;É muita coisa!&lt;/span&gt;
  &lt;span&gt;Sim&lt;/span&gt;
  &lt;span&gt;temos&lt;/span&gt;
  &lt;span&gt;mais&lt;/span&gt;
  &lt;span&gt;um&lt;/span&gt;
  &lt;span&gt;item&lt;/span&gt;
&lt;/menu&gt;</code></pre><figcaption>Exemplo de menu de rolagem horizontal</figcaption></figure><p>Como fazemos isso? Vamos analisar mais de perto.</p><ul><li><code>overflow-y: scroll</code> é o ingrediente secreto da nossa receita. Com essa declaração, os elementos filhos terão uma rolagem no eixo horizontal.</li><li>Muita calma nessa hora, no entanto! Você pode pensar que o <code>overflow-y</code> seja suficiente, mas também precisamos dizer ao navegador para não envolver os elementos filhos com <code>white-space: nowrap</code>?</li></ul><p>Agora que temos algumas técnicas de layout do design responsivo para a web na manga, vamos dar uma olhada em dois elementos que nos trazem desafios específicos à sua natureza visual: imagens e vídeos.</p><h2 id="imagens-responsivas"><strong>Imagens responsivas</strong></h2><p>Usando atributos modernos das tags de imagem, podemos adaptar seu conteúdo a uma variedade de dispositivos e resoluções. Veja este exemplo de imagem responsiva:</p><pre><code class="language-html">&lt;style&gt;
  img {
    max-width: 100%;
  }
&lt;/style&gt;

&lt;picture&gt;
  &lt;source type="image/webp" srcset="https://my-image.com/my-image-100.webp 1x, https://my-image.com/my-image-200.webp 2x"&gt;
  &lt;source type="image/png" srcset="https://my-image.com/my-image-100.png 1x, https://my-image.com/my-image-200.png 2x"&gt;
  &lt;img alt="my image" src="https://my-image.com/my-image-200.png" loading="lazy" width="100" height="100"&gt;
&lt;/picture&gt;</code></pre><p>Essa estrutura faz muita coisa acontecer. Vamos por partes:</p><ol><li>Ao declarar <code>max-width: 100%</code>, a imagem será redimensionada para um tamanho maior ou menor dependendo da largura do contêiner.</li><li>Combinando as declarações das tags <code>picture</code>, <code>source</code> e <code>img</code>, vamos renderizar e carregar a imagem mais adequada ao dispositivo do usuário.</li><li><strong><strong>WebP</strong></strong> é um formato de imagem moderno, que fornece uma melhor compressão para imagens na web. Com a tag <code>source</code>, podemos referenciar uma imagem WebP para usá-la em navegadores que têm suporte a esse formato. Para os que não tem, usamos outra <code>source</code> que referencia uma imagem PNG.</li><li><code>srcset</code> é usado para informar ao navegador qual imagem usar com base na resolução do dispositivo.</li><li>Estabelecemos o <a href="https://web.dev/i18n/pt/browser-level-image-lazy-loading/">lazy loading nativo</a> ao declararmos <code>loading="lazy"</code>.</li></ol><h2 id="v-deos-responsivos"><strong>Vídeos responsivos</strong></h2><p>A responsividade de vídeos é outro assunto que levou à elaboração de inúmeros artigos e documentações.</p><p>Uma coisa fundamental para termos em mente quando o assunto são imagens, vídeos, iframes e outros elementos responsivos é o uso da proporção de tela (em inglês, <em>aspect ratio</em>). A "caixa" de proporção de tela já é uma técnica conhecida e também uma ferramenta bastante útil que o desenvolvedor para a web deve ter no seu arsenal.</p><p><a href="https://css-tricks.com/fluid-width-video/">Este artigo fornece uma demonstração sólida</a> de como se ter vídeos com largura "fluída" (texto em inglês). Vamos dar uma olhada no código a seguir e analisá-lo:</p><pre><code class="language-html">&lt;style&gt;
  .videoWrapper {
    position: relative;
    padding-bottom: 56.25%; /* 16:9 */
    height: 0;
  }

  .videoWrapper iframe {
    position: absolute;
    top: 0;
    left: 0;
    width: 100%;
    height: 100%;
  }
&lt;/style&gt;

&lt;div class="videoWrapper"&gt;
  &lt;!-- Copy &amp; Pasted from YouTube --&gt;
  &lt;iframe width="560" height="349" src="http://www.youtube.com/embed/n_dZNLr2cME?rel=0&amp;hd=1" frameborder="0" allowfullscreen&gt;&lt;/iframe&gt;
&lt;/div&gt;</code></pre><p>No exemplo, temos a integração de um vídeo do YouTube em uma tag <code>iframe</code> dentro de uma <code>div</code> com a classe <code>videoWrapper</code>. Vamos ver o que esse nosso código faz:</p><ul><li>A declaração <code>position: relative</code> no contêiner faz os elementos filhos terem uma posição absoluta em relação a ele.</li><li><code>height: 0</code>, junto a <code>padding-bottom: 56.25%</code>, é a chave para estabelecer um comportamento dinâmico; reforçando a proporção de tela <code>16:9</code>.</li><li>As declarações <code>position: absolute</code>, <code>top: 0</code> e <code>left: 0</code> do <em>iframe </em>criam um comportamento no qual o elemento se posiciona de maneira absoluta em relação ao seu elemento pai, fixando-o no canto superior esquerdo.</li><li>Por fim, largura e altura (as propriedades <code>height</code> e <code>width</code>) de 100% fazem com que o <em>iframe</em> tenha 100% da largura e da altura do seu elemento pai, enquanto o <code>.videoWrapper</code> — o elemento pai — assume total controle em estabelecer a proporção de tela.</li></ul><p>Eu sei... é muita coisa. Podemos fazer ainda mais para que vídeos e imagens tenham a melhor adaptação possível para celulares e tablets. Inclusive, eu gostaria que você pesquisasse por conta própria por outras ferramentas para utilizar em conjunto com as já mencionadas.</p><p>Certo, agora que já dominamos o design responsivo para a web, como podemos testar tudo o que fizemos? Felizmente, temos uma série de ferramentas para simular e monitorar a experiência do usuário em uma variedade de dispositivos.</p><h2 id="ferramentas-para-simular-e-monitorar-sites-da-web-responsivos"><strong>Ferramentas para simular e monitorar sites da web responsivos</strong></h2><p>Há uma variedade de ferramentas úteis para nos ajudar a criar sites com o design responsivo para a web. Abaixo estão algumas que considero especialmente úteis.</p><h3 id="emula-o-de-dispositivos-m-veis-nas-ferramentas-do-desenvolvedor-do-google-chrome"><strong>Emulação de dispositivos móveis nas ferramentas do desenvolvedor do Google Chrome</strong></h3><p>As ferramentas do desenvolvedor do Google Chrome fornecem emulação de uma variedade de dispositivos móveis, como tablets e celulares. Ele também fornece uma opção "responsive ", que permite definir um tamanho de <em>viewport</em> personalizado.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.19.18-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.19.18-PM.png 718w" width="718" height="1282" loading="lazy"><figcaption>Figura 3: ferramentas do desenvolvedor do Chrome e a emulação de dispositivos móveis, como tablets e celulares</figcaption></figure><h3 id="monitorando-o-desempenho-de-um-site-da-web-para-dispositivos-m-veis-com-o-foo"><strong>Monitorando o desempenho de um site da web para dispositivos móveis com o Foo</strong></h3><p>O Lighthouse é uma ferramenta de código aberto que fornece uma maneira de analisar o desempenho de um site para um dispositivo específico.</p><p>O <a href="https://www.foo.software/lighthouse/">Foo usa o Lighthouse internamente para monitorar o desempenho de um site, fornecendo um feedback para análise</a>. Você pode configurar o monitoramento para dispositivos desktop e móveis para obter feedback contínuo sobre o nível de responsividade de seu site.</p><p>Por exemplo, um relatório do Lighthouse indicará se e quais imagens estão sendo carregadas incorretamente em algum dispositivo.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png" class="kg-image" alt="Screen-Shot-2020-07-12-at-6.31.09-PM" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/Screen-Shot-2020-07-12-at-6.31.09-PM.png 1788w" sizes="(min-width: 720px) 720px" width="1788" height="748" loading="lazy"><figcaption>Figura 4: o relatório do Lighthouse com emulação de dispositivos móveis</figcaption></figure><h2 id="conclus-o"><strong>Conclusão</strong></h2><p>O design responsivo para a web seguirá evoluindo rapidamente, mas — se ficarmos por dentro das tendências atuais — poderemos proporcionar a melhor experiência aos nossos usuários. Espero que as ferramentas e técnicas apresentadas aqui sejam úteis a você! Com elas, podemos agradar aos usuários dos nossos sites e ainda conseguir um melhor posicionamento nos mecanismos de busca.</p> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
