<?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[ David Esdras Ferreira da Silva - 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[ David Esdras Ferreira da Silva - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 23 May 2026 19:22:11 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/david/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como criar um pacote do npm lindo e pequeno – e como publicá-lo ]]>
                </title>
                <description>
                    <![CDATA[ Você não vai acreditar; é muito fácil! Se você já criou muitos módulos do npm, pode pular essa seção. Se não, vamos fazer uma rápida introdução. Versão abreviada Um módulo do npm necessita apenas de um arquivo package.json com as propriedades  name e version. Olá! Aí está você, apenas ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-um-pacote-do-npm-lindo-e-pequeno-e-como-publica-lo/</link>
                <guid isPermaLink="false">65fb55b64f187703fea1fff2</guid>
                
                    <category>
                        <![CDATA[ JavaScript ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ David Esdras Ferreira da Silva ]]>
                </dc:creator>
                <pubDate>Mon, 10 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/0_7m8mTkj_Fp916sdm.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/how-to-make-a-beautiful-tiny-npm-package-and-publish-it-2881d4307f78/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to make a beautiful, tiny npm package and publish it</a>
      </p><p>Você não vai acreditar; é muito fácil!</p><p>Se você já criou muitos módulos do npm, pode pular essa seção. Se não, vamos fazer uma rápida introdução.</p><h4 id="vers-o-abreviada">Versão abreviada</h4><p>Um módulo do npm necessita <strong>apenas </strong>de um arquivo <code>package.json</code> com as propriedades <strong>name </strong>e <strong>version</strong>.</p><h3 id="ol-">Olá!</h3><p>Aí está você, apenas um pequeno elefante com a vida toda pela frente. Você não é um mestre em fazer pacotes do npm, mas adoraria saber como, certo? Todos os grandes elefantes andam por aí com suas patas gigantes, fazendo pacotes após pacotes. Você pode pensar:</p><blockquote><em>"Não consigo competir com isso".</em></blockquote><p>Bem, estou aqui para dizer para você que você consegue! Não precisa duvidar da sua capacidade.</p><p>Vamos começar!</p><h3 id="voc-n-o-um-elefante">Você não é um elefante</h3><p>Entenda o que eu disse como uma <a href="https://brasilescola.uol.com.br/gramatica/metafora.htm">metáfora</a>.</p><p>Você já se perguntou como elefantes bebês são chamados?</p><p><em>Com certeza, já. </em>Um elefante bebê é um "bebê elefante", oras.</p><h3 id="eu-acredito-em-voc-">Eu acredito em você</h3><p>A <a href="https://en.wikipedia.org/wiki/Impostor_syndrome"></a><a href="https://pt.wikipedia.org/wiki/S%C3%ADndrome_do_impostor">autossabotagem</a> é real. Acaba ocorrendo que as pessoas deixam de fazer coisas muito legais. Você acha que você não será bem-sucedido. Então, você acaba não fazendo nada, mas exalta as pessoas que fazem coisas incríveis. Isso é muito irônico. Por isso, vou mostrar para você o menor módulo npm possível.</p><p>Em breve, você terá várias ideias de módulos npm ao seu alcance, código reutilizável até onde os olhos podem ver – tudo isso sem truques e sem instruções complexas.</p><h3 id="as-instru-es-complexas">As instruções complexas</h3><p>Eu prometi que eu não usaria instruções complexas, mas usei. Elas, porém, não são tão complexas assim. Você vai me perdoar um dia.</p><h4 id="passo-1-conta-do-npm"><strong>Passo 1: conta do npm</strong></h4><p>Você vai precisar de uma. É parte do acordo. <a href="https://www.npmjs.com/signup" rel="noopener">Crie a conta aqui</a>.</p><h4 id="passo-2-login">Passo 2: login</h4><p>Você fez a conta do npm? Já fez? Legal. Também vou assumir que você sabe usar <a href="https://www.davidbaumgold.com/tutorials/command-line/">linha de comando</a>/<a href="https://www.davidbaumgold.com/tutorials/command-line/">console</a> etc (textos em inglês). Eu vou chamar de terminal a partir de agora. Aparentemente, há uma diferença.</p><p>Vá no terminal e escreva:</p><pre><code class="language-bash">npm adduser</code></pre><p>Você também pode usar o comando:</p><pre><code class="language-bash">npm login</code></pre><p>Escolha o comando que agrade a você.</p><p>Você receberá uma mensagem pedindo seu <strong>nome de usuário</strong>, <strong>senha </strong>e <strong>e-mail</strong>.</p><p>A mensagem será parecida com esta:</p><pre><code>Logged in as bamblehorse to scope @username on https://registry.npmjs.org/.</code></pre><p>Vamos em frente!</p><h3 id="hora-de-fazer-um-pacote">Hora de fazer um pacote</h3><p>Primeiramente, precisamos de uma pasta para colocar nosso código. Crie uma pasta da maneira que se sentir confortável. Eu vou chamar o meu pacote de <strong>tiny </strong>(palavra em inglês para <em>minúsculo</em>) porque o pacote será, de fato, muito pequeno. Eu adicionei alguns comandos de terminal para aqueles que não estão familiarizados com eles.</p><pre><code class="language-bash">md tiny</code></pre><p>Nessa pasta, vamos precisar de um arquivo <a href="https://docs.npmjs.com/files/package.json" rel="noopener"><strong>package.json</strong></a><strong>. </strong>Se você já usa <a href="https://en.wikipedia.org/wiki/Node.js" rel="noopener">Node.js</a>, já viu esse arquivo antes. É um arquivo <a href="https://en.wikipedia.org/wiki/JSON" rel="noopener">JSON</a> que inclui informações sobre o seu projeto e possui uma infinidade de opções diferentes. Neste tutorial, vamos focar apenas em duas delas.</p><pre><code class="language-bash">cd tiny &amp;&amp; touch package.json</code></pre><h4 id="qual-deve-ser-o-tamanho-do-pacote">Qual deve ser o tamanho do pacote?</h4><p>Muito pequeno.</p><p>Todos os tutoriais sobre fazer um pacote npm, inclusive o da documentação oficial, dizem para você adicionar determinados campos no seu <code>package.json</code>. Vamos tentar publicar nosso pacote com o mínimo possível até ele funcionar. Como se fosse um <a href="https://pt.wikipedia.org/wiki/Test-driven_development">TDD</a> para um pacote do npm mínimo.</p><p><strong>Observação: </strong>eu estou mostrando isso para demonstrar que fazer um pacote do npm não precisa ser complicado. Para ser útil para a comunidade em geral, um pacote precisa de algumas coisas a mais – e vamos abordar isso mais adiante no artigo.</p><h4 id="publica-o-primeira-tentativa">Publicação: primeira tentativa</h4><p>Para publicar o seu pacote do npm, você deve executar um comando bem conveniente: <strong>npm publish</strong>.</p><p>Então, temos um <code>package.json</code> vazio na nossa pasta e vamos fazer uma tentativa:</p><pre><code class="language-bash">npm publish</code></pre><p>Opa!</p><p>Recebemos um erro:</p><pre><code>npm ERR! file package.json
npm ERR! code EJSONPARSE
npm ERR! Failed to parse json
npm ERR! Unexpected end of JSON input while parsing near ''
npm ERR! File: package.json
npm ERR! Failed to parse package.json data.
npm ERR! package.json must be actual JSON, not just JavaScript.
npm ERR!
npm ERR! Tell the package author to fix their package.json file. JSON.parse</code></pre><p>O npm não gostou muito do seu pacote.</p><p>Faz sentido.</p><h4 id="publica-o-segunda-tentativa">Publicação: segunda tentativa</h4><p>Vamos dar um nome para o nosso pacote no arquivo <code>package.json</code>:</p><pre><code class="language-json">{
"name": "@bamblehorse/tiny"
}</code></pre><p>Você deve ter percebido que eu adicionei meu username do npm no começo.</p><p>Por que fazer isso?</p><p>Usando o nome <strong>@bamblehorse/tiny </strong>ao invés de apenas <strong>tiny, </strong>criamos um pacote sob o escopo do nosso <em>username</em>. Isso é chamado de <a href="https://docs.npmjs.com/misc/scope" rel="noopener"><strong>scoped package</strong></a><strong> </strong>(em português, pacote com escopo).<strong> </strong>Isso nos permite usar nomes curtos que talvez já foram usados. Por exemplo, o pacote <a href="https://www.npmjs.com/package/tiny" rel="noopener"><strong>tiny</strong></a><strong> </strong>já existe no npm.</p><p>Você já deve ter visto isso em bibliotecas populares como a do <em>framework</em> <a href="https://angular.io/" rel="noopener">Angular</a>, da Google. Eles possuem alguns <em>scoped packages, </em>como <a href="https://www.npmjs.com/package/@angular/core" rel="noopener">@angular/core</a> e <a href="https://www.npmjs.com/package/@angular/http" rel="noopener">@angular/http</a>.</p><p>Bem legal, não?</p><p>Vamos tentar publicar uma segunda vez:</p><pre><code class="language-bash">npm publish</code></pre><p>O erro é menor dessa vez – tivemos um progresso.</p><pre><code>npm ERR! package.json requires a valid "version" field</code></pre><p>Cada pacote do npm precisa de uma versão para que os desenvolvedores saibam se eles podem atualizar com segurança para uma nova versão do nosso pacote sem quebrar o resto do código deles. O sistema de versionamento do npm é chamado de <a href="https://semver.org/" rel="noopener"><strong>SemVer</strong></a><strong>, </strong>que significa <strong>Semantic Versioning </strong>(em português, versionamento semântico).</p><p>Não se preocupe muito em entender os nomes mais complexos de versão, mas aqui está um resumo de como os mais básicos funcionam:</p><blockquote>Dado um número de versão MAJOR.MINOR.PATCH, incremente o:</blockquote><blockquote>1. MAJOR quando você faz mudanças incompatíveis na API.</blockquote><blockquote>2. MINOR quando você adiciona uma funcionalidade de modo compatível com a versão anterior, e</blockquote><blockquote>3. PATCH quando você conserta erros de maneira compatível com a última versão.</blockquote><blockquote>Rótulos adicionais para pré-lançamento e metadados de build estão disponíveis como extensões do formato MAJOR.MINOR.PATCH.</blockquote><blockquote><a href="https://semver.org/" rel="noopener">https://semver.org</a></blockquote><h4 id="publicando-terceira-tentativa"><strong>Publicando: terceira tentativa</strong></h4><p>Vamos colocar no nosso <code>package.json</code> a versão: <strong>1.0.0</strong> – o primeiro lançamento major.</p><pre><code class="language-json">{
"name": "@bamblehorse/tiny",
"version": "1.0.0"
}</code></pre><p>Vamos publicar!</p><pre><code class="language-bash">npm publish</code></pre><p>Ah, droga.</p><pre><code>npm ERR! publish Failed PUT 402
npm ERR! code E402
npm ERR! You must sign up for private packages : @bamblehorse/tiny</code></pre><p>Permita-me explicar.</p><p><em>Scoped packages </em>são automaticamente publicados de maneira privada, pois, além de serem úteis para usuários únicos como nós, eles também são utilizados por empresas para compartilhar código entre projetos. Se tivéssemos publicado um pacote normal, nossa jornada teria acabado aqui.</p><p>Tudo que precisamos mudar é dizer para o npm que, na verdade, queremos que todo mundo possa usar esse módulo – não o manter trancado nos cofres deles. Portanto, executamos o seguinte comando:</p><pre><code class="language-bash">npm publish --access=public</code></pre><p>De repente, o sucesso!</p><pre><code>+ @bamblehorse/tiny@1.0.0</code></pre><p>Recebemos um sinal de adição, o nome do nosso pacote e a versão.</p><p>Conseguimos — estamos no clube do npm.</p><p>Estou animado. <em>Você deve estar animado também.</em></p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_oBaHFxAXy-BWtzyAKeMGBQ.png" class="kg-image" alt="1_oBaHFxAXy-BWtzyAKeMGBQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_oBaHFxAXy-BWtzyAKeMGBQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_oBaHFxAXy-BWtzyAKeMGBQ.png 695w" width="695" height="346" loading="lazy"><figcaption>Removi algumas informações deixando uma fita azul bonita por cima</figcaption></figure><h4 id="voc-viu">Você viu?</h4><blockquote>npm loves you <em>(em português, o npm ama você)</em></blockquote><p>Que fofo!</p><p>A <a href="https://www.npmjs.com/package/@bamblehorse/tiny/v/1.0.0" rel="noopener">primeira versão</a> está disponível no npm!</p><h3 id="seguindo-em-frente">Seguindo em frente</h3><p>Se quisermos ser levados a sério como desenvolvedores e se quisermos que nosso pacote seja usado, precisaremos mostrar o código para as pessoas e dizer para elas como elas devem usar. Em geral, fazemos isso colocando nosso código em algum lugar público e adicionando um arquivo <code>readme</code>.</p><p>Também precisamos de algum código. É verdade, não temos código ainda.</p><p>O Github é um ótimo lugar para colocar o seu código. Vamos fazer um <a href="https://github.com/new">novo repositório</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_NGHjzcMgnzBtmSFfQuqVow.png" class="kg-image" alt="1_NGHjzcMgnzBtmSFfQuqVow" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_NGHjzcMgnzBtmSFfQuqVow.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_NGHjzcMgnzBtmSFfQuqVow.png 723w" sizes="(min-width: 720px) 720px" width="723" height="614" loading="lazy"><figcaption>Criando um repositório no GitHub</figcaption></figure><h4 id="readme-">README!</h4><p>Eu me acostumei a escrever arquivos <strong>README </strong>(do inglês "<em>read me"</em> – em português, leia-me) ao invés de <strong>readme</strong>. Você não tem que fazer isso mais. É uma convenção divertida. Vamos adicionar algumas <em>badges </em>descoladas do <a href="https://shields.io/" rel="noopener">shields.io</a> para as pessoas saberem que somos superlegais e profissionais. Aqui está uma que permite as pessoas saberem a versão atual do nosso pacote:‌</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_ZbzgGAfTeBlqNH2gtLy-GQ.png" class="kg-image" alt="1_ZbzgGAfTeBlqNH2gtLy-GQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_ZbzgGAfTeBlqNH2gtLy-GQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_ZbzgGAfTeBlqNH2gtLy-GQ.png 700w" width="700" height="247" loading="lazy"><figcaption>npm (com escopo)</figcaption></figure><p>A próxima <em>badge </em>é interessante. Ela falhou porque não temos nenhum código, na verdade. Deveríamos, realmente, escrever um pouco de código...</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_mxZkgckYLK16mhkRte1Bqw.png" class="kg-image" alt="1_mxZkgckYLK16mhkRte1Bqw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_mxZkgckYLK16mhkRte1Bqw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_mxZkgckYLK16mhkRte1Bqw.png 699w" width="699" height="244" loading="lazy"><figcaption>npm com tamanho reduzido (minificado)</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_gY_-15Q4rLU129dXLg5ibQ.png" class="kg-image" alt="1_gY_-15Q4rLU129dXLg5ibQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_gY_-15Q4rLU129dXLg5ibQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_gY_-15Q4rLU129dXLg5ibQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="212" loading="lazy"><figcaption>Nosso pequeno readme</figcaption></figure><h4 id="licen-a-para-programar">Licença para <em>programar</em></h4><p>O título é definitivamente uma <a href="https://www.imdb.com/title/tt0097742/">referência a James Bond</a>. Na verdade, eu me esqueci de adicionar uma licença. Uma licença permite que as pessoas saibam em quais situações elas podem usar seu código. Há várias <a href="https://choosealicense.com/">licenças diferentes</a>.</p><p>Existe uma página legal chamada <em>insights</em> em todo repositório do GitHub onde você pode checar várias estatísticas – incluindo os padrões da comunidade para o projeto. Vou adicionar minha licença por lá.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_hkUyteXGLLTDt0WwKEpZ6A.png" class="kg-image" alt="1_hkUyteXGLLTDt0WwKEpZ6A" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_hkUyteXGLLTDt0WwKEpZ6A.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_hkUyteXGLLTDt0WwKEpZ6A.png 800w" sizes="(min-width: 720px) 720px" width="800" height="552" loading="lazy"><figcaption>Recomendações da comunidade</figcaption></figure><p>Então, você vai para esta página:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_ZWgFtTjkB8RpBDfRsCsLUQ.png" class="kg-image" alt="1_ZWgFtTjkB8RpBDfRsCsLUQ" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/1_ZWgFtTjkB8RpBDfRsCsLUQ.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/1_ZWgFtTjkB8RpBDfRsCsLUQ.png 800w" sizes="(min-width: 720px) 720px" width="800" height="379" loading="lazy"><figcaption>O Github oferece a você um resumo bem útil de cada licença</figcaption></figure><h4 id="o-c-digo">O código</h4><p>Ainda não temos um código. Isso é um pouco constrangedor.</p><p>Vamos adicionar o código agora antes que percamos toda a credibilidade.</p><figure class="kg-card kg-code-card"><pre><code class="language-js">module.exports = function tiny(string) {
  if (typeof string !== "string") throw new TypeError("Tiny wants a string!");
  return string.replace(/\s/g, "");
};</code></pre><figcaption>Inútil, eu sei — mas lindo</figcaption></figure><p>Aí está. Uma função minúscula (do inglês, <strong><em>tiny</em></strong>)<strong> </strong>que remove todos os espaços de uma string.</p><p>Então, tudo que um pacote do npm exige é um arquivo <strong>index.js</strong>. Esse é o ponto de entrada do seu pacote. Você pode fazer isso de diferentes maneiras à medida que o seu pacote fica mais complexo. Por agora, porém, isso é tudo de que precisamos.</p><h3 id="j-chegamos-l-"><strong>Já chegamos lá?</strong></h3><p>Estamos bem perto. Provavelmente, deveríamos atualizar nosso <strong>package.json</strong> minimalista e adicionar algumas instruções ao nosso <strong>readme.md</strong>. Senão, ninguém saberia como usar nosso belíssimo código.</p><h4 id="package-json">package.json</h4><figure class="kg-card kg-code-card"><pre><code class="language-json">{
  "name": "@bamblehorse/tiny",
  "version": "1.0.0",
  "description": "Removes all spaces from a string",
  "license": "MIT",
  "repository": "bamblehorse/tiny",
  "main": "index.js",
  "keywords": [
    "tiny",
    "npm",
    "package",
    "bamblehorse"
  ]
}</code></pre><figcaption>Descritivo!</figcaption></figure><p>Adicionamos:</p><ul><li><a href="https://docs.npmjs.com/files/package.json#description-1" rel="noopener">description</a>: uma descrição curta do pacote</li><li><a href="https://docs.npmjs.com/files/package.json#repository" rel="noopener">repository</a>: compatível com o GitHub — então, você pode escrever <strong>username/repo</strong></li><li><a href="https://docs.npmjs.com/files/package.json#license" rel="noopener">license</a>: a licença da MIT, neste caso</li><li><a href="https://docs.npmjs.com/files/package.json#main" rel="noopener">main</a>: o ponto de entrada do pacote, relativo à pasta raiz</li><li><a href="https://docs.npmjs.com/files/package.json#keywords" rel="noopener">keywords</a>: uma lista de palavras-chave usadas para descobrir seu pacote em uma pesquisa no npm.</li></ul><h4 id="readme-md">readme.md</h4><!--kg-card-begin: markdown--><h1 id="bamblehorsetiny">@bamblehorse/tiny</h1>
<p><a href="https://www.npmjs.com/package/@bamblehorse/tiny"><img src="https://img.shields.io/npm/v/@bamblehorse/tiny.svg" alt="npm (scoped)" width="80" height="20" loading="lazy"></a><br>
<a href="https://www.npmjs.com/package/@bamblehorse/tiny"><img src="https://img.shields.io/bundlephobia/min/@bamblehorse/tiny.svg" alt="npm bundle size (minified)" width="122" height="20" loading="lazy"></a></p>
<p>Removes all spaces from a string.</p>
<h2 id="install">Install</h2>
<pre><code>$ npm install @bamblehorse/tiny
</code></pre>
<h2 id="usage">Usage</h2>
<pre><code class="language-js">const tiny = require("@bamblehorse/tiny");

tiny("So much space!");
//=&gt; "Somuchspace!"

tiny(1337);
//=&gt; Uncaught TypeError: Tiny wants a string!
//    at tiny (&lt;anonymous&gt;:2:41)
//    at &lt;anonymous&gt;:1:1
</code></pre>
<!--kg-card-end: markdown--><p>Adicionamos instruções sobre como instalar e usar o pacote. Legal!</p><p>Se você quer um bom modelo para seu <em>readme</em>, é só conferir pacotes populares na comunidade de código aberto (do inglês, <em>open source</em>) e usar os formatos deles para começar.</p><h3 id="conclus-o">Conclusão</h3><p>Vamos publicar nosso pacote espetacular.</p><h4 id="vers-o">Versão</h4><p>Primeiramente, vamos atualizar a versão com o comando <a href="https://docs.npmjs.com/cli/version" rel="noopener">npm version</a>.</p><p>Esse é um lançamento <em>major</em>. Então, escrevemos:</p><pre><code class="language-bash">npm version major</code></pre><p>O que nos retorna:</p><pre><code>v2.0.0</code></pre><h4 id="publique-">Publique!</h4><p>Vamos rodar nosso novo comando favorito:</p><pre><code class="language-bash">npm publish</code></pre><p>Está pronto:</p><pre><code>+ @bamblehorse/tiny@2.0.0</code></pre><h3 id="coisas-legais">Coisas legais</h3><p>A <a href="https://packagephobia.now.sh/result?p=%40bamblehorse%2Ftiny" rel="noopener">Package Phobia</a> dá um ótimo resumo do seu pacote do npm. Você também pode verificar cada arquivo em sites como o <a href="https://unpkg.com/@bamblehorse/tiny@2.0.0/" rel="noopener">Unpkg</a>.</p><h3 id="agradecimento">Agradecimento</h3><p>Foi uma jornada maravilhosa que acabamos de fazer juntos. Espero que você tenha aproveitado tanto quanto eu. Se puder, deixe uma estrela para o pacote que nós acabamos de criar aqui:</p><h4 id="-github-com-bamblehorse-tiny-"><strong>★ <a href="https://github.com/Bamblehorse/tiny" rel="noopener">Github.com/Bamblehorse/tiny</a> ★</strong></h4><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/0_qmkE3zw9beF6fP_0.png" class="kg-image" alt="0_qmkE3zw9beF6fP_0" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/0_qmkE3zw9beF6fP_0.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/0_qmkE3zw9beF6fP_0.png 800w" sizes="(min-width: 720px) 720px" width="800" height="533" loading="lazy"><figcaption>"Um elefante parcialmente submerso na água" – autor: <a href="https://unsplash.com/@jakobowens1?utm_source=medium&amp;utm_medium=referral">Jakob Owens</a>, fonte: <a href="https://unsplash.com?utm_source=medium&amp;utm_medium=referral">Unsplash</a></figcaption></figure><p>Siga o autor no <a href="https://medium.com/@Bamblehorse" rel="noopener">Medium</a> ou no próprio <a href="https://github.com/Bamblehorse" rel="noopener">GitHub</a>.</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como obter dados do GraphQL no Next.js usando o Apollo GraphQL ]]>
                </title>
                <description>
                    <![CDATA[ O Next.js tem tido um crescimento constante como uma ferramenta obrigatória para desenvolvedores criarem aplicações em React. Parte do que faz ele bom são as suas APIs de obtenção de dados (em inglês, data fetching) que solicitam dados para cada página. Como, porém, podemos usar essa API para fazer queries ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/</link>
                <guid isPermaLink="false">65f8fe03d8ef27040526c98e</guid>
                
                    <category>
                        <![CDATA[ NextJS ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ David Esdras Ferreira da Silva ]]>
                </dc:creator>
                <pubDate>Wed, 05 Jun 2024 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/apollo.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-fetch-graphql-data-in-next-js-with-apollo-graphql/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/how-to-fetch-graphql-data-in-next-js-with-apollo-graphql/</a>
      </p><p>O Next.js tem tido um crescimento constante como uma ferramenta obrigatória para desenvolvedores criarem aplicações em React. Parte do que faz ele bom são as suas APIs de obtenção de dados (em inglês, <em>data fetching</em>) que solicitam dados para cada página. Como, porém, podemos usar essa API para fazer <em>queries</em> do GraphQL para nossa aplicação?</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#o-que-o-graphql">O que é o GraphQL?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#o-que-o-apollo-graphql">O que é o Apollo GraphQL?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#solicitando-dados-no-next-js">Solicitando dados no Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#o-que-vamos-criar">O que vamos criar?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#passo-0-criando-a-aplica-o-do-next-js">Passo 0: Criando uma aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#passo-1-adicionando-o-apollo-graphql-em-uma-aplica-o-do-next-js">Passo 1: Adicionando o Apollo GraphQL em uma aplicação do Next.js</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#passo-2-adicionando-dados-a-uma-p-gina-do-next-js-com-getstaticprops">Passo 2: Adicionando dados em uma página do Next.js com getStaticProps</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#passo-3-recuperando-dados-com-uma-query-do-graphql-no-next-js-usando-o-apollo-client">Passo 3: Recuperando dados com uma query do GraphQL em Next.js usando o Apollo Client</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-obter-dados-do-graphql-no-next-js-usando-o-apollo-graphql/#passo-4-adicionado-os-dados-de-lan-amento-da-spacex-na-p-gina">Passo 4: Adicionando dados de lançamento da SpaceX na página</a></li></ul><h2 id="o-que-o-graphql">O que é o GraphQL?</h2><p>O <a href="https://graphql.org/">GraphQL</a> é uma <em>query language</em> e <em>runtime</em> que fornece uma maneira de interagir com uma API, diferente daquilo que você esperaria de uma API REST tradicional.</p><p>Quando dados são solicitados, ao invés de fazer uma requisição <a href="https://developer.mozilla.org/pt-BR/docs/Web/HTTP/Methods/GET">GET</a> para uma URL para pegar esse dado, um <em>endpoint </em>do GraphQL recebe uma "<em>query</em>" (consulta). Essa <em>query</em> indica quais dados queremos recuperar, seja um conjunto de dados completo ou apenas uma parte deles.</p><p>Seus dados poder se parecer com isto:</p><pre><code>Movie { "title": "Sunshine", "releaseYear": "2007", "actors": [...], "writers": [...] }</code></pre><p>Pode ser que você queira apenas pegar o título e o ano em que o filme foi lançado. Para isso, você poderia enviar uma query assim:</p><p><code>Movie { title releaseYear }</code>‌</p><p>Isso recuperaria apenas os dados de que você precisa.</p><p>A parte legal é que você também pode criar relações complexas entre dados. Com uma única <em>query</em>, você poderia ainda pedir dados de diferentes partes do banco de dados, o que tradicionalmente levaria a múltiplas solicitações para a API REST.</p><h2 id="o-que-o-apollo-graphql">O que é o Apollo GraphQL?</h2><p>No seu núcleo, o Apollo GraphQL é uma implementação do GraphQL que auxilia a trazer os dados como um grafo.</p><p>O Apollo também oferece e mantém um <em>client</em> de GraphQL, que é o que vamos usar. Ele permite a interação programática com uma API do GraphQL.</p><p>Usando o <em>client</em> do Apollo GraphQL, seremos capazes de fazer solicitações para uma API do GraphQL de modo similar ao que você esperaria de um <em>client</em> para APIs REST.</p><h2 id="solicitando-dados-no-next-js">Solicitando dados no Next.js</h2><p>Quando estamos solicitando dados no Next.js, há algumas formas de se recuperar esses dados.</p><p>Primeiramente, você poderia fazer o <em>client</em> executar a solicitação quando a página carregar. O problema disso é que você está colocando o fardo no <em>client </em>de achar tempo para fazer essas solicitações.</p><p>APIs do Next.js, como <code>getStaticProps</code> e <code>getServerSideProps</code>, permitem que você colete dados em diferentes momentos do ciclo de vida, nos dando a oportunidade de <a href="https://www.youtube.com/watch?v=6ElI2ZJ4Uro">fazer uma aplicação complemente estática</a> (vídeo em inglês) ou que ela seja renderizada do lado do servidor. Essas funções servem os dados que já foram renderizados na página diretamente no navegador.</p><p>Usando um desses métodos, somos capazes de solicitar dados juntamente com nossas páginas e de injetar esses dados como <em>props </em>diretamente na nossa aplicação.</p><h2 id="o-que-vamos-criar">O que vamos criar?</h2><p>Vamos criar uma aplicação do Next.js que mostra os últimos lançamentos da SpaceX.</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/05/spacex-launches-demo.jpg" class="kg-image" alt="spacex-launches-demo" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/spacex-launches-demo.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/spacex-launches-demo.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/spacex-launches-demo.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/spacex-launches-demo.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="1050" loading="lazy"><figcaption>Demonstração dos lançamentos da SpaceX</figcaption></figure><p>Utilizaremos a API mantida pela <a href="https://spacex.land/">SpaceX Land</a> para fazer uma query do GraphQL que pega os últimos 10 voos. Usando <a href="https://nextjs.org/docs/basic-features/data-fetching#getstaticprops-static-generation">getStaticProps</a>, vamos fazer a solicitação na <em>build</em>, o que significa que nossa página será renderizada estaticamente com nossos dados.</p><h2 id="passo-0-criando-a-aplica-o-do-next-js">Passo 0: Criando a aplicação do Next.js</h2><p>Usando <em>Create Next App</em>, podemos rapidamente começar uma nova aplicação do Next.js, que usaremos para navegar no código imediatamente.</p><p>No terminal, execute o comando:</p><pre><code>npx create-next-app my-spacex-launches
</code></pre><blockquote><em>Nota: você não precisa usar <code>my-spacex-app</code>, sinta-se livre para substituir por qualquer nome que você deseje dar para o projeto.</em></blockquote><p>Depois de rodar o script, o Next.js vai configurar um novo projeto e instalar as dependências.</p><p>Uma vez terminado, você pode começar o servidor de desenvolvimento:</p><pre><code>cd my-spacex-launches
npm run dev
</code></pre><p>Esse comando iniciará um novo servidor em <a href="http://localhost:3000">http://localhost:3000</a>, onde você pode visitar a sua nova 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/05/new-nextjs-app-1.jpg" class="kg-image" alt="new-nextjs-app-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/new-nextjs-app-1.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/new-nextjs-app-1.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/new-nextjs-app-1.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/new-nextjs-app-1.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="815" loading="lazy"><figcaption>Aplicação do Next.js</figcaption></figure><h2 id="passo-1-adicionando-o-apollo-graphql-em-uma-aplica-o-do-next-js">Passo 1: Adicionando o Apollo GraphQL em uma aplicação do Next.js</h2><p>Para começar a fazer uma <em>query</em> do GraphQL, vamos precisar de um <em>client </em>do GraphQL. Vamos utilizar o <em>client</em> Apollo GraphQL para fazer nossas <em>queries </em>para o servidor do GraphQL da SpaceX.</p><p>Novamente, no terminal, execute o seguinte comando para instalar as nossas novas dependências:</p><p>‌ &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <code>npm install @apollo/client graphql </code></p><p>Esse comando vai adicionar o Apollo Client e também o GraphQL, que precisaremos para formar uma <em>query</em> do GraphQL.</p><p>Uma vez que a instalação completar, estaremos prontos para começar a usar o Apollo Client.</p><p><a href="https://github.com/colbyfayock/my-spacex-launches/commit/0fcc3a0141e7bfb795c3c91c355fdfc459a17332">Acompanhe com o <em>commit</em>!</a></p><h2 id="passo-2-adicionando-dados-a-uma-p-gina-do-next-js-com-getstaticprops">Passo 2: Adicionando dados a uma página do Next.js com getStaticProps</h2><p>Antes de solicitarmos dados com o Apollo, vamos configurar nossa página para sermos capazes de requisitar os dados e, então, passar esses dados como <em>props</em> para nossa página na <em>build</em>.</p><p>Vamos definir uma nova função no fim da página, embaixo do nosso componente <code>Home</code>, chamada <code>getStaticProps</code>:</p><pre><code>export async function getStaticProps() {
  // O código vai aqui
}</code></pre><p>Quando o Next.js fizer a <em>build </em>da<em> </em>nossa aplicação, ele saberá onde encontrar essa função. Então, quando a exportamos, estamos informando o Next.js que queremos rodar o código daquela função.</p><p>Dentro da nossa função <code>getStaticProps</code>, vamos, em última instância, retornar as <em>props</em> para a página. Para testar isso, vamos adicionar o seguinte na nossa função:</p><pre><code>export async function getStaticProps() {
  return {
    props: {
      launches: []
    }
  }
}</code></pre><p>Aqui, estamos passando uma nova <em>prop </em>chamada <code>launches</code> e estamos definindo a <em>prop</em> como um array vazio.</p><p>Agora, de volta para o nosso componente <code>Home</code>, vamos adicionar um novo argumento desestruturado que servirá como nossa <em>prop </em>e também vamos utilizar o <code>console.log</code> para testá-la:</p><pre><code>export default function Home({ launches }) {
  console.log('launches', launches);
}</code></pre><p>Se recarregarmos a página, podemos observar que agora estamos imprimindo nossa nova prop <code>launches</code>, que inclui um array vazio da maneira como definimos.</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/05/nextjs-console-log-launches-array.jpg" class="kg-image" alt="nextjs-console-log-launches-array" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/nextjs-console-log-launches-array.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/nextjs-console-log-launches-array.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/nextjs-console-log-launches-array.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/nextjs-console-log-launches-array.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="410" loading="lazy"><figcaption>Registrando a <em>prop</em> <code>launches</code></figcaption></figure><p>O interessante disso é que, uma vez que a função <code>getStaticProps</code> que estamos definindo é assíncrona, podemos fazer qualquer solicitação que quisermos (incluindo uma <em>query </em>do GraphQL) e retorná-la como <em>props</em> para a nossa página, que é o que veremos mais adiante.</p><p><a href="https://github.com/colbyfayock/my-spacex-launches/commit/868a4f6b31200cd2407b4aa2fe37a243fc235932">Acompanhe com o <em>commit</em>!</a></p><h2 id="passo-3-recuperando-dados-com-uma-query-do-graphql-no-next-js-usando-o-apollo-client">Passo 3: Recuperando dados com uma query do GraphQL no Next.js usando o Apollo Client</h2><p>Agora que nossa aplicação está preparada para adicionar na nossa página e que temos o Apollo instalado, podemos finalmente fazer uma solicitação para pegar nossos dados da SpaceX.</p><p>Aqui, vamos usar o Apollo Client, que é o que permite nos conectarmos com o servidor do GraphQL da SpaceX. Faremos nossa solicitação para a API usando o método <code>getStaticProps</code> do Next.js, nos permitindo criar <em>props</em> dinamicamente para nossa página quando ela é construída.</p><p>Primeiramente, vamos importar nossas dependências do Apollo no projeto. No topo da página adicione:</p><pre><code>import { ApolloClient, InMemoryCache, gql } from '@apollo/client';</code></pre><p>Isso incluirá o <em>client</em> do Apollo propriamente dito, <code>InMemoryCache</code>, que permite ao Apollo otimizar por meio de leitura de um cache, e <code>gql</code>, que utilizaremos para formar nossa <em>query </em>do GraphQL.</p><p>Agora, vamos utilizar o Apollo Client. Para isso, precisamos configurar uma nova instância dele:</p><p>Dentro da função <code>getStaticProps</code>, adicione:</p><pre><code>const client = new ApolloClient({
  uri: 'https://api.spacex.land/graphql/',
  cache: new InMemoryCache()
});</code></pre><p>Isso cria uma instância do Apollo Client usando o <em>endpoint </em>da API do SpaceX pelo qual faremos a <em>query</em>.</p><p>Com o nosso <em>client</em>, conseguimos finalmente fazer uma <em>query</em>. Adicione o seguinte código abaixo do <em>client</em>:</p><pre><code>const { data } = await client.query({
  query: gql`
    query GetLaunches {
      launchesPast(limit: 10) {
        id
        mission_name
        launch_date_local
        launch_site {
          site_name_long
        }
        links {
          article_link
          video_link
          mission_patch
        }
        rocket {
          rocket_name
        }
      }
    }
  `
});</code></pre><p>Isso faz algumas coisas:</p><ul><li>Cria uma <em>query</em> dentro das tag <code>gql</code></li><li>Cria uma <em>query request</em> usando <code>client.query</code></li><li>Usa <code>await</code> para garantir que ele finalize a requisição antes de continuar</li><li>Por fim, desestrutura <code>data</code> dos resultados, que é onde as informações que precisamos estão armazenadas.</li></ul><p>Dentro da <em>query </em>do GraphQL, estamos informando para a SpaceX que queremos pegar <code>launchesPast</code>, que são os últimos lançamentos da SpaceX, e que queremos os últimos 10 (limite). Dentro disso, definimos os dados que gostaríamos de recuperar.</p><p>Se adicionarmos um novo console log depois disso, podemos observar a aparência de <code>data</code>.</p><p>No entanto, uma vez que você recarregar a página, você notará que você não está vendo nada no console do navegador.</p><p><code>getStaticProps</code> roda durante o processo de <em>build</em>, o que significa que ele roda no <em>node</em>. Portanto, podemos olhar o nosso terminal e veremos os logs: </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/05/logging-static-props-terminal.jpg" class="kg-image" alt="logging-static-props-terminal" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/logging-static-props-terminal.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/logging-static-props-terminal.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/logging-static-props-terminal.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/logging-static-props-terminal.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="559" loading="lazy"><figcaption>Registro dos dados no terminal</figcaption></figure><p>Depois de ver isso, sabemos que o objeto <code>data</code> tem uma propriedade chamada <code>launchesPast</code>, que inclui um array de detalhes de lançamento.</p><p>Agora, podemos atualizar o retorno para usar <code>launchesPast</code>:</p><pre><code>return {
  props: {
    launches: data.launchesPast
  }
}</code></pre><p>Se adicionarmos nosso <code>console.log</code> de volta no topo da página para ver a aparência da <em>prop</em> <code>launches</code>, podemos observar que nossos dados de lançamento agora estão disponíveis como uma <em>prop</em> na nossa página:</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/05/logging-static-props-web-console.jpg" class="kg-image" alt="logging-static-props-web-console" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/logging-static-props-web-console.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/logging-static-props-web-console.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/logging-static-props-web-console.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/logging-static-props-web-console.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="456" loading="lazy"><figcaption>Registro da <em>prop </em>no console da web</figcaption></figure><p><a href="https://github.com/colbyfayock/my-spacex-launches/commit/f273bcde3d2baccd54e4c65930ab499dbe4862ed">Acompanhe com o <em>commit</em>!</a></p><h2 id="passo-4-adicionado-os-dados-de-lan-amento-da-spacex-na-p-gina">Passo 4: Adicionado os dados de lançamento da SpaceX na página</h2><p>Agora, vamos para a parte legal!</p><p>Temos nossos dados de lançamento, que conseguimos recuperar usando o Apollo Client, para solicitar do servidor do GraphQL da SpaceX. Fizemos uma requisição dentro de <code>getStaticProps</code>, de maneira que conseguimos deixar nossos dados disponíveis como a <em>prop</em> <code>launches</code>, que contém os dados de lançamento.</p><p>Navegando na página, vamos começar tirando proveito do que já existe. Por exemplo, podemos começar atualizando a tag <code>h1</code> e o parágrafo abaixo dele para algo que descreva nossa página um pouco:</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/05/updated-page-title.jpg" class="kg-image" alt="updated-page-title" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/updated-page-title.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/updated-page-title.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/updated-page-title.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/updated-page-title.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="565" loading="lazy"><figcaption>Título atualizado da página</figcaption></figure><p>Depois, vamos utilizar os <em>cards</em> de link que já existem para incluir todos os nossos dados de lançamento.</p><p>Para fazer isso, vamos, primeiramente, adicionar um <a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Global_Objects/Array/map">map</a> dentro do grid da nossa página, onde o componente que retornamos é um dos <em>cards</em>, com os dados de lançamento preenchidos:</p><pre><code>&lt;div className={styles.grid}&gt;
  {launches.map(launch =&gt; {
    return (
      &lt;a key={launch.id} href={launch.links.video_link} className={styles.card}&gt;
        &lt;h3&gt;{ launch.mission_name }&lt;/h3&gt;
        &lt;p&gt;&lt;strong&gt;Launch Date:&lt;/strong&gt; { new Date(launch.launch_date_local).toLocaleDateString("en-US") }&lt;/p&gt;
      &lt;/a&gt;
    );
  })}</code></pre><p>Podemos também nos livrar do resto dos <em>cards </em>padrão do Next.js, incluindo <em>Documentation</em> e <em>Learn</em>.</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/05/list-of-spacex-launches.jpg" class="kg-image" alt="list-of-spacex-launches" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/list-of-spacex-launches.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/list-of-spacex-launches.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/list-of-spacex-launches.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/list-of-spacex-launches.jpg 2000w" sizes="(min-width: 1200px) 1200px" width="2000" height="768" loading="lazy"><figcaption>Página com os lançamentos da SpaceX</figcaption></figure><p>Nossa página, agora, inclui os últimos 10 lançamentos da SpaceX e a data do lançamento!</p><p>Podemos até mesmo clicar em qualquer um desses <em>cards</em> e, já que vinculamos o link para o vídeo, conseguimos agora ir diretamente para o vídeo ao clicar.</p><p><a href="https://github.com/colbyfayock/my-spacex-launches/commit/e35ed076253e3648fa5d8cd62e993e4e9e436396">Acompanhe com o <em>commit</em>!</a></p><h2 id="pr-ximos-passos">Próximos passos</h2><p>A partir de agora, podemos incluir qualquer dado adicional de dentro do nosso array <code>launches</code> na nossa página. A API até mesmo inclui imagens de emblemas da missão, que podemos usar para mostrar imagens bonitas para cada lançamento.</p><p>Você também pode adicionar qualquer dado na <em>query</em> do GraphQL. Cada lançamento tem muitas informações disponíveis, incluindo a tripulação do lançamento e mais detalhes sobre o foguete.</p><p><a href="https://api.spacex.land/graphql/">https://api.spacex.land/graphql</a></p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/jamstack-handbook-banner.jpg" class="kg-image" alt="jamstack-handbook-banner" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/jamstack-handbook-banner.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/jamstack-handbook-banner.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/jamstack-handbook-banner.jpg 1600w" sizes="(min-width: 720px) 720px" width="1600" height="267" loading="lazy"></figure><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2024/05/social-footer-card.jpg" class="kg-image" alt="social-footer-card" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2024/05/social-footer-card.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2024/05/social-footer-card.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2024/05/social-footer-card.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2024/05/social-footer-card.jpg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="400" loading="lazy"></figure><ul><li><a href="https://twitter.com/colbyfayock">🐦 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/">📫 Assine a newsletter do autor</a></li><li><a href="https://github.com/sponsors/colbyfayock">💝 Patrocine o autor</a></li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
