<?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[ Matheus Ribeiro - 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[ Matheus Ribeiro - freeCodeCamp.org ]]>
            </title>
            <link>https://www.freecodecamp.org/portuguese/news/</link>
        </image>
        <generator>Eleventy</generator>
        <lastBuildDate>Sat, 09 May 2026 13:42:13 +0000</lastBuildDate>
        <atom:link href="https://www.freecodecamp.org/portuguese/news/author/matheus-ribeiro/rss.xml" rel="self" type="application/rss+xml" />
        <ttl>60</ttl>
        
            <item>
                <title>
                    <![CDATA[ Como criar uma aplicação da web moderna usando WordPress e React ]]>
                </title>
                <description>
                    <![CDATA[ Escrito por: Bret Cameron Combine o poder de um front-end com React com o CMS mais popular da internet Quer as vantagens de uma aplicação de página única (do inglês, single-page application, ou SPA) moderna feita em React, mas precisa de um back-end que pareça familiar? Neste artigo, veremos como ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/</link>
                <guid isPermaLink="false">646a6e66ae2709063d5da777</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matheus Ribeiro ]]>
                </dc:creator>
                <pubDate>Sun, 18 Jun 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_sKZ0nC0gyc5tiqlVBfu_uQ.png" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/wordpress-react-how-to-create-a-modern-web-app-using-wordpress-ef6cc6be0cd0/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">How to Create a Modern Web App Using WordPress and React</a>
      </p><p>Escrito por: Bret Cameron</p><h4 id="combine-o-poder-de-um-front-end-com-react-com-o-cms-mais-popular-da-internet">Combine o poder de um front-end com React com o CMS mais popular da internet</h4><p>Quer as vantagens de uma aplicação de página única (do inglês, <em>single-page application</em>, ou SPA) moderna feita em React, mas precisa de um back-end que pareça familiar? Neste artigo, veremos como configurar a API REST do WordPress, incluindo tipos e campos de publicações personalizados, e como buscar esses dados dentro do React.</p><p>Recentemente, eu estava trabalhando em uma aplicação em React para um cliente e ele me fez uma pergunta: "podemos usá-la <em><strong>com o WordPress</strong>?</em>"</p><p>Desde o final de 2015, a resposta a essa pergunta é "sim". No entanto, as etapas necessárias para se criar um site dissociado e funcional podem não ser óbvias, especialmente para aqueles que não estão familiarizados com o WordPress <em>nem</em> com o React.</p><p>Na minha jornada para criar aplicações funcionais, encontrei um punhado de obstáculos complexos e, neste artigo, explicarei como evitá-los. Também vou compartilhar várias dicas e truques que aprendi pelo caminho!</p><h3 id="conte-do">Conteúdo</h3><h4 id="parte-1-informa-es-b-sicas"><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#parte-1-informa-es-b-sicas-1">Parte 1: informações básicas</a></h4><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#o-que-um-cms-headless">O que é um CMS <em>headless</em>?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#o-que-preciso-saber-para-acompanhar-o-tutorial">O que preciso saber para acompanhar o tutorial?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#principais-siglas">Principais siglas</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#onde-posso-ver-os-dados-em-json-do-wordpress">Onde posso ver os dados em JSON do WordPress?</a></li></ul><h4 id="parte-2-wordpress"><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#parte-2-wordpress-1">Parte 2: WordPress</a></h4><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#como-adicionar-um-tipo-de-publica-o-personalizado">Como adicionar um tipo de publicação personalizado</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#como-alterar-o-t-tulo-de-espa-o-reservado">Como alterar o título de espaço reservado</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#como-adicionar-um-campo-personalizado-ao-seu-tipo-de-postagem-personalizado">Como adicionar um campo personalizado ao seu tipo de postagem personalizado</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#como-disponibilizar-campos-personalizados-como-json">Como disponibilizar campos personalizados como JSON</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#como-restringir-dados-json-vis-veis">Como restringir dados em JSON visíveis</a></li></ul><h4 id="parte-3-react"><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#parte-3-react-1">Parte 3: React</a></h4><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#promises-em-javascript"><em>Promises</em> em JavaScript</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#o-m-todo-fetch">O método <em>fetch</em></a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#manipula-o-de-promises">Manipulação de <em>promises</em></a></li></ul><h4 id="um-exemplo-funcional-em-react"><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#um-exemplo-funcional-em-react-1">Um exemplo funcional em React</a></h4><h4 id="conclus-o"><a href="https://www.freecodecamp.org/portuguese/news/como-criar-uma-aplicacao-da-web-moderna-usando-wordpress-e-react/#conclus-o-1">Conclusão</a></h4><p></p><h3 id="parte-1-informa-es-b-sicas-1">Parte 1: informações básicas</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_V5SV3AAoVrt9qjiWsTabbg.png" class="kg-image" alt="1_V5SV3AAoVrt9qjiWsTabbg" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/1_V5SV3AAoVrt9qjiWsTabbg.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_V5SV3AAoVrt9qjiWsTabbg.png 800w" sizes="(min-width: 720px) 720px" width="800" height="225" loading="lazy"></figure><h4 id="o-que-um-cms-headless">O que é um CMS <em>headless</em>?</h4><p>No passado, usar um CMS como o WordPress significava que você tinha que construir seu front-end usando PHP.</p><p>Agora, com o CMS <em>headless </em>(em português, algo como "sem cabeça"), você pode construir seu <em>front-end</em> com as tecnologias que desejar. Isso se deve à separação do <em>front-end</em> e do <em>back-end</em> por meio de uma API. Se você quiser criar uma SPA usando React, Angular ou Vue, controlando o conteúdo por meio de um CMS como o WordPress, você pode!</p><h4 id="o-que-preciso-saber-para-acompanhar-o-tutorial">O que preciso saber para acompanhar o tutorial?</h4><p>Você vai tirar o máximo de proveito desse artigo se tiver:</p><ul><li>algum conhecimento de como funciona um CMS como o WordPress, um pouco de PHP e uma ideia sobre como configurar um projeto básico do WordPress no seu computador;</li><li>um entendimento de JavaScript, incluindo recursos do ES6+ e sintaxe de classes em React.</li></ul><h4 id="principais-siglas">Principais siglas</h4><p>A programação é cheia de jargões, mas eles agilizam muito a discussão sobre alguns dos conceitos neste artigo. Eis um resumo rápido dos termos que vamos usar:</p><ul><li><strong>CMS – sistema de gestão de conteúdo (<em>Content Management System</em>, em inglês).</strong> &nbsp;Alguns exemplos são WordPress, Drupal, Joomla e Magneto.</li><li><strong>SPA – aplicação de página única (<em>Single-Page Application</em>, em inglês).</strong> &nbsp;Em vez de recarregar cada página na sua totalidade, uma aplicação SPA carrega o conteúdo dinamicamente. O código fundamental (HTML, CSS e JavaScript) do site é carregado apenas uma vez. Alguns exemplos são React, Vue e Angular.</li><li><strong>API – interface de programação de aplicações (<em>Application Programming Interface</em>, em inglês).</strong> &nbsp;Em termos simples, uma série de definições que um serviço fornece para permitir que você receba e use seus dados. &nbsp;O <a href="https://developers.google.com/maps/documentation/javascript/tutorial">Google Maps tem uma</a>. O <a href="https://github.com/Medium/medium-api-docs">Medium tem uma</a>. Agora, <a href="https://developer.wordpress.org/rest-api/">todo site do WordPress vem com uma API embutida</a>.</li><li><strong>REST – transferência de estado representacional (<em>Representational State Transfer</em>, em inglês).</strong> &nbsp;Um estilo de arquitetura da web baseado nos métodos de solicitação do HTTP: <code>GET</code> , <code>PUT</code> , <code>POST</code> e <code>DELETE</code>. A API embutida do WordPress é uma API REST ou "RESTful".</li><li><strong>HTTP – protocolo de transferência de hipertexto (<em>HyperText Transfer Protocol</em>, em inglês).</strong> &nbsp;O conjunto de regras utilizadas para transferir dados através da web. Ele é especificado no início dos URLs como <code>http</code> ou <code>https</code> (a versão segura).</li><li><strong>JSON – notação de objeto JavaScript (<em>JavaScript Object Notation</em>, em inglês)</strong> &nbsp;Apesar de ser derivado do JavaScript, ele é um formato para armazenamento e transferência de dados que é independente da linguagem.</li></ul><p>Neste artigo, estamos usando o WordPress como nosso CMS. Isso significa programar nosso <em>back-end</em> em PHP e usar a API REST do WordPress para entregar dados JSON ao nosso <em>front-end</em>.</p><h4 id="onde-posso-ver-os-dados-em-json-do-wordpress">Onde posso ver os dados em JSON do WordPress?</h4><p>Antes de pôr as mãos na massa, uma nota rápida sobre <em>onde</em> você pode encontrar os dados em JSON em seu site do WordPress. Hoje em dia, todo site feito com WordPress tem dados em JSON disponíveis (a menos que o administrador do site tenha desativado ou restringido o acesso a eles). Você pode ver o JSON principal de um site do WordPress anexando &nbsp;<code>/wp-json</code> &nbsp;ao nome de domínio raiz.</p><p>Então, por exemplo, você pode dar uma olhada no JSON do site WordPress.org visitando &nbsp;<a href="https://wordpress.org/wp-json">https://wordpress.org/wp-json</a>. Como alternativa, se você estiver executando um site do WordPress localmente, você pode ver seu JSON acessando <code>localhost/nome-do-seu-site/wp-json</code>.</p><p>Para acessar os dados das suas publicações, escreva &nbsp;<code>localhost/nome-do-seu-site/wp-json/wp/v2/posts</code>. Para um formato de publicação personalizado, troque para o novo formato (por exemplo, <code>movies</code> – filmes) em vez de <code>posts</code>. O que agora parece ser um bloco de texto ilegível é exatamente o que nos permitirá usar o WordPress como um CMS <em>headless</em>!</p><h3 id="parte-2-wordpress-1">Parte 2: WordPress</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_jUVbqOjhcy-68oCBkIlm2Q.png" class="kg-image" alt="1_jUVbqOjhcy-68oCBkIlm2Q" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/1_jUVbqOjhcy-68oCBkIlm2Q.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_jUVbqOjhcy-68oCBkIlm2Q.png 800w" sizes="(min-width: 720px) 720px" width="800" height="225" loading="lazy"></figure><p>Para configurar sua API REST, a maior parte do que você vai fazer acontecerá no seu arquivo <code>functions.php</code>. Partirei do pressuposto de que você sabe configurar um projeto com WordPress e acessá-lo usando <code>localhost</code>, mas, se precisar de ajuda com isso, eu recomendo <a href="https://www.taniarascia.com/developing-a-wordpress-theme-from-scratch/#installing-wordpress">este artigo</a> (em inglês, mas é o que eu usei para começar a programar com o WordPress).</p><p>Para a maioria dos projetos, você vai querer usar um tipo de publicação personalizado. Então, comecemos configurando um.</p><h4 id="como-adicionar-um-tipo-de-publica-o-personalizado">Como adicionar um tipo de publicação personalizado</h4><p>Digamos que nosso site seja sobre filmes e queremos um tipo de publicação chamado 'movies' (em português, filmes). Primeiro, queremos garantir que nosso tipo de publicação 'movies' seja carregado o mais rápido possível. Então, vamos anexá-lo ao hook <code>init</code> utilizando <code>add_action</code>:</p><pre><code>add_action( 'init', 'movies_post_type' );
</code></pre><p>Estou usando <code>movies_post_type()</code>, mas você pode chamar sua função do que quiser.</p><p>Em seguida, vamos registrar 'movies' como um tipo de publicação, usando a função <code>register_post_type()</code>.</p><p>O próximo trecho de código pode parecer intimidador, mas é relativamente simples: nossa função requer muitos argumentos embutidos para controlar a funcionalidade do seu novo tipo de publicação. A maioria deles é autoexplicativo. Vamos armazenar esses argumentos no array <code>$args</code>.</p><p>Um dos argumentos, <code>labels</code>, pode receber diversos argumentos diferentes em si. Assim, o separamos em um outro array, <code>$labels</code>, o que nos dá:</p><pre><code class="language-php">&lt;?php // Registrar o tipo de publicação personalizada: filmes

function movies_post_type() {

	$labels = array(
		'name'                  =&gt; _x( 'Movies', 'Post Type General Name', 'text_domain' ),
		'singular_name'         =&gt; _x( 'Movie', 'Post Type Singular Name', 'text_domain' ),
		'menu_name'             =&gt; __( 'Movies', 'text_domain' ),
		'name_admin_bar'        =&gt; __( 'Movie', 'text_domain' ),
		'archives'              =&gt; __( 'Item Archives', 'text_domain' ),
		'attributes'            =&gt; __( 'Item Attributes', 'text_domain' ),
		'parent_item_colon'     =&gt; __( 'Parent Item:', 'text_domain' ),
		'all_items'             =&gt; __( 'All Items', 'text_domain' ),
		'add_new_item'          =&gt; __( 'Add New 3D Printer', 'text_domain' ),
		'add_new'               =&gt; __( 'Add New', 'text_domain' ),
		'new_item'              =&gt; __( 'New Movie', 'text_domain' ),
		'edit_item'             =&gt; __( 'Edit Movie', 'text_domain' ),
		'update_item'           =&gt; __( 'Update Movie', 'text_domain' ),
		'view_item'             =&gt; __( 'View Item', 'text_domain' ),
		'view_items'            =&gt; __( 'View Items', 'text_domain' ),
		'search_items'          =&gt; __( 'Search Item', 'text_domain' ),
		'not_found'             =&gt; __( 'Not found', 'text_domain' ),
		'not_found_in_trash'    =&gt; __( 'Not found in Trash', 'text_domain' ),
		'featured_image'        =&gt; __( 'Featured Image', 'text_domain' ),
		'set_featured_image'    =&gt; __( 'Set featured image', 'text_domain' ),
		'remove_featured_image' =&gt; __( 'Remove featured image', 'text_domain' ),
		'use_featured_image'    =&gt; __( 'Use as featured image', 'text_domain' ),
		'insert_into_item'      =&gt; __( 'Insert into item', 'text_domain' ),
		'uploaded_to_this_item' =&gt; __( 'Uploaded to this item', 'text_domain' ),
		'items_list'            =&gt; __( 'Items list', 'text_domain' ),
		'items_list_navigation' =&gt; __( 'Items list navigation', 'text_domain' ),
		'filter_items_list'     =&gt; __( 'Filter items list', 'text_domain' ),
	);

	$args = array(
		'label'                 =&gt; __( 'Movie', 'text_domain' ),
		'description'           =&gt; __( 'Our featured films.', 'text_domain' ),
		'labels'                =&gt; $labels,
		'supports'              =&gt; array( 'title', 'editor', 'thumbnail'),
		'taxonomies'            =&gt; array( '' ),
		'hierarchical'          =&gt; false,
		'public'                =&gt; true,
		'show_in_rest'          =&gt; true,
		'show_ui'               =&gt; true,
		'show_in_menu'          =&gt; true,
		'menu_position'         =&gt; 5,
		'show_in_admin_bar'     =&gt; true,
		'show_in_nav_menus'     =&gt; true,
		'can_export'            =&gt; true,
		'has_archive'           =&gt; true,
		'exclude_from_search'   =&gt; false,
		'publicly_queryable'    =&gt; true,
		'capability_type'       =&gt; 'page',
	);

  register_post_type( 'movies', $args );
  
}

add_action( 'init', 'movies_post_type', 0 );
</code></pre><p>Dois dos argumentos mais importantes são <code>"supports"</code> e <code>"taxonomies"</code>, porque eles controlam quais dos campos de publicação nativos serão acessíveis no nosso novo tipo de publicação.</p><p>No código acima, optamos por apenas três <code>"supports"</code>:</p><ul><li><code>"title"</code>– o título de cada publicação.</li><li><code>"editor"</code>– o editor de texto principal, que usaremos para nossa descrição.</li><li><code>"thumbnail"</code>– a imagem em destaque da publicação.</li></ul><p>Para ver a lista completa do que está disponível, clique <a href="https://developer.wordpress.org/reference/functions/post_type_supports/">aqui para ver quais são os 'supports'</a> e <a href="https://wordpress.org/documentation/article/taxonomies/#taxonomies-terms">aqui para ver as 'taxonomies'</a> (textos em inglês).</p><p>O site Generate WordPress também tem &nbsp;<a href="https://generatewp.com/post-type/">uma ferramenta útil que ajuda a criar tipos de publicação personalizados</a>, o que pode tornar o processo muito mais rápido.</p><h4 id="como-alterar-o-t-tulo-de-espa-o-reservado">Como alterar o título de espaço reservado</h4><p>Se o <em>placeholder</em> (em português, espaço reservado) do título "enter title here" (em português, insira o título aqui) não se encaixar no seu tipo de postagem personalizado, você poderá editá-lo com uma função separada:</p><pre><code class="language-php">&lt;?php // Troque o  placeholder do título por um título customizado

function change_title_text( $title ){
  $screen = get_current_screen();
  if ( 'movies' == $screen-&gt;post_type ) {
    $title = 'Enter title here';
  }
  return $title;
}

add_filter( 'enter_title_here', 'change_title_text' );
</code></pre><h4 id="como-adicionar-um-campo-personalizado-ao-seu-tipo-de-postagem-personalizado">Como adicionar um campo personalizado ao seu tipo de postagem personalizado</h4><p>Se você quiser um campo que não vem pré-definido pelo WordPress, o que pode fazer? Por exemplo, digamos que queremos um campo especial chamado "genre" (em português, gênero). Nesse caso, você precisará usar &nbsp;<code>add_meta_boxes()</code>.</p><p>Para isso, precisamos anexar uma nova função ao <em>hook </em><code>add_meta_boxes</code> do WordPress:</p><pre><code>add_action( 'add_meta_boxes', 'genre_meta_box' );
</code></pre><p>Dentro de nossa nova função, precisamos chamar a função <code>add_meta_box()</code> &nbsp;do WordPress, assim:</p><pre><code class="language-php">function genre_meta_box() {  
    add_meta_box(    
        'global-notice',    
        __( 'Genre', 'sitepoint' ),    
        'genre_meta_box_callback',    
        'movies',    
        'side',    
        'low'  
    );
}
</code></pre><p>Você pode ler mais sobre os argumentos dessa função <a href="https://developer.wordpress.org/reference/functions/add_meta_box/">aqui</a>. Para nossos propósitos, a parte mais crítica é a função de <em>callback</em>, que nomeamos <code>genre_meta_box_callback</code>. Ela define o conteúdo real na caixa meta. Precisamos apenas de uma entrada de texto simples, então podemos usar:</p><pre><code class="language-php">function genre_meta_box_callback() {
  global $post;
  $custom = get_post_custom($post-&gt;ID);
  $genre = $custom["genre"][0];
  ?&gt;
  &lt;input style="width:100%" name="genre" value="&lt;?php 
  echo $genre; ?&gt;" /&gt;
  &lt;?php
};</code></pre><p>Por fim, nosso campo personalizado não vai salvar seu valor a menos que seja conveniente. Para esse efeito, podemos definir uma nova função &nbsp;<code>save_genre()</code> &nbsp;e anexá-la ao <em>hook </em><code>save_post</code> do WordPress:</p><pre><code class="language-php">function save_genre(){  
    global $post;  
    update_post_meta($post-&gt;ID, "printer_category",   
    $_POST["printer_category"]);
};
add_action( 'save_post', 'save_genre' );
</code></pre><p>Juntando tudo, o código usado para criar o campo personalizado deve ficar assim:</p><pre><code>&lt;?php // Add Custom Field Type: Genre

function genre_meta_box() {
  add_meta_box(
    'global-notice',
    __( 'Genre', 'sitepoint' ),
    'genre_meta_box_callback',
    'movies',
    'side',
    'low'
  );
}

function genre_meta_box_callback() {
  global $post;
  $custom = get_post_custom($post-&gt;ID);
  $genre = $custom["genre"][0];
  ?&gt;
  &lt;input style="width:100%" name="genre" value="&lt;?php 
  echo $genre; ?&gt;" /&gt;
  &lt;?php
}

function save_genre(){
  global $post;
  update_post_meta($post-&gt;ID, "genre", 
  $_POST["genre"]);
}

add_action( 'add_meta_boxes', 'genre_meta_box' );
add_action( 'save_post', 'save_genre' );</code></pre><h4 id="como-disponibilizar-campos-personalizados-como-json">Como disponibilizar campos personalizados como JSON</h4><p>Nossas postagens personalizadas ficam disponibilizadas automaticamente como JSON. Para o nosso tipo de publicação "movies", os nossos dados em JSON podem ser encontrados em &nbsp;<code>localhost/nomedoseusite/wp-json/wp/v2/movies</code>.</p><p>No entanto, nossos campos personalizados não fazem parte disso automaticamente e, portanto, precisamos adicionar uma função para garantir que eles também sejam acessíveis por meio da API REST.</p><p>Primeiro, precisamos anexar uma nova função ao <em>hook </em><code>rest_api_init</code> :</p><pre><code>add_action ('rest_api_init', 'registrar_genero_como_campo_rest');
</code></pre><p>Então, podemos usar a função incorporada <code>register_rest_field()</code>, assim:</p><pre><code>function register_genre_as_rest_field() {
  register_rest_field(
    'movies',
    'genre',
    array(
      'get_callback' =&gt; 'get_genre_meta_field',
      'update_callback' =&gt; null,
      'schema' =&gt; null,
    )
  );
};</code></pre><p>Essa função recebe um array com os <em>callbacks</em> <code>get</code> e <code>update</code>. Porém, em um caso mais simples como esse, só precisamos especificar um <code>'get_callback'</code>:</p><pre><code>function get_genre_meta_field( $object, $field_name, $value ) {
	return get_post_meta($object['id'])[$field_name][0];
};</code></pre><p>Como um todo, este é o código necessário para registrar um campo personalizado.</p><pre><code>&lt;?php // Registrar um tipo de campo personalizado como um campo REST

function register_genre_as_rest_field() {
  register_rest_field(
    'movies',
    'genre',
    array(
      'get_callback' =&gt; 'get_genre_meta_field',
      'update_callback' =&gt; null,
      'schema' =&gt; null,
    )
  );
};

function get_genre_meta_field( $object, $field_name, $value ) {
  return get_post_meta($object['id'])[$field_name][0];
};

add_action( 'rest_api_init', 'register_genre_as_rest_field' );</code></pre><h4 id="como-disponibilizar-urls-de-imagens-em-destaque-como-json">Como disponibilizar URLs de imagens em destaque como JSON</h4><p>A API REST do WordPress não inclui URLs para as suas imagens em destaque nativamente. Para facilitar o acesso, você pode usar o seguinte código:</p><pre><code>&lt;?php // Add 'featured_image_url' to REST data

  function post_featured_image_json( $data, $post, $context ) {
  $featured_image_id = $data-&gt;data['featured_media'];
  $featured_image_url = wp_get_attachment_image_src( $featured_image_id, 'original' );

  if( $featured_image_url ) {
    $data-&gt;data['featured_image_url'] = $featured_image_url[0];
  }

  return $data;
}

add_filter( 'rest_prepare_movies', 'post_featured_image_json', 10, 3 );</code></pre><p>O filtro <code>rest_prepare_posts</code> do WordPress é dinâmico, então podemos trocar "posts" por um tipo de publicação personalizada, como <code>rest_prepare_movies</code>.</p><h4 id="como-restringir-dados-json-vis-veis">Como restringir dados JSON visíveis</h4><p>Estamos quase prontos para começar a extrair dados para a aplicação em React, mas ainda dá para fazer mais uma otimização rápida: limitar os dados disponibilizados.</p><p>Alguns dados vêm por padrão e é possível que você nunca precise deles no seu <em>front-end.</em> Se for o caso, podemos removê-los usando um filtro, como este:</p><pre><code>&lt;?php // Filter REST data

function filter_rest_data( $data, $post, $request ) {
  $_data = $data-&gt;data;
  $params = $request-&gt;get_params();
  if ( ! isset( $params['id'] ) ) {
    unset( $_data['date'] );
    unset( $_data['slug'] );
    unset( $_data['date_gmt'] );
    unset( $_data['modified'] );
    unset( $_data['modified_gmt'] );
    unset( $_data['guid'] );
    unset( $_data['type'] );
  };
  $data-&gt;data = $_data;
  return $data;
};

add_filter( 'rest_prepare_movies', 'filter_rest_data', 10, 3 );</code></pre><p>Você pode achar os nomes dos tipos de dados acessando a parte <code>/wp-json/wp/v2/filmes</code> do seu site.</p><p>Com isso feito, assim que tiver adicionado alguns filmes usando o <em>back-end</em> do WordPress, teremos todo o necessário para começar a trazer dados para o React!</p><h3 id="parte-3-react-1">Parte 3: React</h3><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_qKj1pMwgVFGtOID_wD1N-g.png" class="kg-image" alt="1_qKj1pMwgVFGtOID_wD1N-g" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/06/1_qKj1pMwgVFGtOID_wD1N-g.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/06/1_qKj1pMwgVFGtOID_wD1N-g.png 800w" sizes="(min-width: 720px) 720px" width="800" height="225" loading="lazy"></figure><p>Para buscar dados externos em JavaScript, você precisa usar <em>promises</em>. Isso provavelmente influenciará a melhor maneira de estruturar seus componentes no React, e, no meu caso (converter um projeto React pré-existente), eu tive que reescrever boa parte do código.</p><h4 id="promises-em-javascript"><em>Promises </em>em JavaScript</h4><p>As <em>promises</em> em JavaScript são usadas para manipular ações assíncronas: coisas que acontecem fora do passo a passo tradicional, ou seja, a ordem de execução "síncrona" (após o <em>hoisting</em>).</p><p>O bom é que JavaScript assíncrono é muito mais fácil hoje em dia. Antes da ES6, dependíamos de funções de <em>callback</em>. Se múltiplas <em>callbacks</em> fossem necessárias (e muitas vezes eram), o aninhamento levaria a um código que era muito difícil de ler, escalonar e depurar – um fenômeno às vezes chamado de "<em>callback hell</em>" ou "pirâmide da perdição"!</p><p>As <em>promises</em> foram introduzidas na ES6 (ou ES2015) para resolver esse problema, e a ES8 (ou ES2018) viu a introdução do <code>async ... await</code>, duas palavras-chave que simplificam ainda mais a funcionalidade assíncrona. Porém, para os nossos propósitos, o método mais importante que usa as <em>promises</em> é o <code>fetch()</code>.</p><h4 id="o-m-todo-fetch">O método <em>fetch</em></h4><p>Esse método está disponível desde o Chrome 40 e é uma alternativa ao <code>XMLHttpRequest()</code>, sendo mais fácil de usar.</p><p><code>fetch()</code> retorna uma <em>promise</em> e, portanto, é compatível com "<em>then</em>", ou seja, podemos usar o método <code>then()</code> para processar o resultado.</p><p>Você pode adicionar <em>fetch </em>a um método dentro de seu componente de classe do React, desta maneira:</p><pre><code class="language-js">fetchPostData() {  
    fetch(`http://localhost/yoursitename/wp-json/wp/v2/movies?per_page=100`)  
    .then(response =&gt; response.json())  
    .then(myJSON =&gt; {  
        // A lógica vai aqui
    });
}
</code></pre><p>No código acima, duas coisas são importantes:</p><ul><li>Primeiro, estamos chamando um URL com o filtro &nbsp;<code>?per_page=100</code> anexado ao final. Por padrão, o WordPress mostra apenas 10 itens por página. Muitas vezes, me vejo querendo aumentar esse limite.</li><li>Segundo, antes de processar os dados, usamos o método <code>.json()</code>. Esse método é utilizado principalmente em relação ao <code>fetch()</code>, onde ele retorna os dados como <em>promise</em> e analisa o corpo do texto como JSON.</li></ul><p>Na maioria dos casos, queremos que essa função seja executada assim que o componente React for montado. Podemos especificar isso usando o método <code>componentDidMount()</code> :</p><pre><code class="language-js">componentDidMount() {  
    this.fetchPostData();
}
</code></pre><h4 id="manipula-o-de-promises">Manipulação de <em>promises</em></h4><p>Depois de devolver uma <em>promise</em>, você deve ter o cuidado de lidar com ela no contexto correto.</p><p>Na primeira vez que tentei usar <em>promises</em>, levei um tempo tentando passar os dados para variáveis fora do escopo da <em>promise</em>. Aí vão algumas regras básicas:</p><ul><li>Em React, a melhor forma de usar <em>promises</em> é através do <em>state</em> (em português, estado). Você pode usar <code>this.setState()</code> para passar dados da <em>promise</em> para o <em>state</em> do seu componente.</li><li>É melhor processar, classificar e reorganizar seus dados em uma série de métodos <code>then()</code> após o <code>fetch()</code> inicial. Depois que todo o processamento estiver completo, a melhor prática é adicionar os dados ao <em>state</em> dentro do seu método <code>then()</code> final.</li><li>Se quiser chamar qualquer outra função adicional para processar a sua <em>promise</em> (inclusive dentro do <code>render()</code>), é boa prática prevenir que a função rode até que a promise seja resolvida.</li><li>Então, por exemplo, se estiver passando sua <em>promise </em>para <code>this.state.data</code>, você pode incluir uma condicional dentro do corpo de qualquer função que dependa dela, como no exemplo abaixo. Isso pode evitar comportamentos indesejados irritantes!</li></ul><pre><code class="language-js">myPromiseMethod() {  
    if (this.state.data) {    
        // processe a promise aqui   
    } else {    
        // o que fazer antes do fetch ser concluído  
    }
}
</code></pre><h3 id="um-exemplo-funcional-em-react-1">Um exemplo funcional em React</h3><p>Digamos que queremos trazer <code>name</code>, <code>description</code>, <code>featured_image</code> e <code>gender</code> (em português, nome, descrição, imagem em destaque e gênero, respectivamente) do tipo de publicação customizado do WordPress que definimos na parte 1.</p><p>No exemplo a seguir, vamos buscar esses quatro elementos para cada filme e renderizá-los.</p><p>Como tantas vezes acontece em tutoriais de React, o bloco de código a seguir pode parecer intimidador, mas espero que fique bem mais simples conforme o dividimos em partes.</p><pre><code>import React, { Component } from 'react';

export default class Movies extends Component {
  
  constructor(props) {
    super(props);
    this.state = { data: {} };
  
    this.fetchPostData = this.fetchPostData.bind(this);
    this.renderMovies = this.renderMovies.bind(this);
    this.populatePageAfterFetch = this.populatePageAfterFetch.bind(this);
    
  }

  componentDidMount() {
    this.fetchPostData();
  }

  fetchPostData() {
    fetch(`http://localhost/yoursitename/wp-json/wp/v2/movies?per_page=100`)
      .then(response =&gt; response.json())
      .then(myJSON =&gt; {
        let objLength = Object.keys(myJSON).length;
        let newState = this.state;
      
        for (let i = 0; i &lt; objLength; i++) {
          let objKey = Object.values(myJSON)[i].title.rendered;
          let currentMovie = newState.data[objKey];
          
          currentMovie = {};
          currentMovie.name = Object.values(myJSON)[i].title.rendered;
          currentMovie.description = Object.values(myJSON)[i].content.rendered;
          currentMovie.featured_image = Object.values(myJSON)[i]['featured_image_url'];
          currentMovie.genre = Object.values(myJSON)[i]['genre'];          
        }
      
      this.setState(newState);
      });
  }
  
  renderMovies() {
    if (this.state.data) {
      const moviesArray = Object.values(this.state.data)
      return Object.values(moviesArray).map((movie, index) =&gt; this.populatePageAfterFetch(movie, index));
    }
  }

  populatePageAfterFetch(movie, index) {
    if (this.state.data) {

      return (
        &lt;div key={index} index={index}&gt; 
          &lt;h2 className="name"&gt;{movie.name}&lt;/h2&gt; 
          &lt;h3 className="genre"&gt;{movie.genre}&lt;/h3&gt;
          &lt;div className="description" dangerouslySetInnerHTML={{__html: movie.description}} /&gt;
          &lt;img className="featured_image" src={movie.featured_image} alt={movie.name} /&gt;
        &lt;/div&gt;
      )
    }
  }

  render() {
      return (
      &lt;&gt;
        &lt;h1&gt;Movies&lt;/h1&gt;
        &lt;div&gt;{this.renderMovies()}&lt;/div&gt;
      &lt;/&gt;
      )
  }
}</code></pre><h4 id="constructor-props-">constructor(props)</h4><p>Nesse método, chamamos <code>super(props)</code>, definimos o estado inicial (um objeto <code>data</code> vazio) e anexamos três métodos novos:</p><ul><li><code>fetchPostData()</code></li><li><code>renderMovies()</code></li><li><code>populatePageAfterFetch()</code></li></ul><pre><code>constructor(props) {
    super(props);
    this.state = { data: {} };
  
    this.fetchPostData = this.fetchPostData.bind(this);
    this.renderMovies = this.renderMovies.bind(this);
    this.populatePageAfterFetch = this.populatePageAfterFetch.bind(this);
    
  }</code></pre><h4 id="componentdidmount-">componentDidMount()</h4><p>Queremos baixar nossos dados assim que o componente estiver montado, então vamos chamar <code>fetchPostData()</code> aqui.</p><pre><code>componentDidMount() {
    this.fetchPostData();
}</code></pre><h4 id="fetchpostdata-">fetchPostData()</h4><p>Buscamos o JSON do URL, passando <code>.json()</code> no primeiro método <code>.then()</code>.</p><p>No segundo método <code>.then()</code>, extraímos os quatro valores que queremos para cada entrada de filme que recebemos e, em seguida, os adicionamos ao objeto <code>newState</code>.</p><p>Em seguida, usamos <code>this.setState(newState)</code> para adicionar essas informações ao <code>this.state.data</code>.</p><pre><code>fetchPostData() {
    fetch(`http://localhost/yoursitename/wp-json/wp/v2/movies?per_page=100`)
      .then(response =&gt; response.json())
      .then(myJSON =&gt; {
        let objLength = Object.keys(myJSON).length;
        let newState = this.state;
      
        for (let i = 0; i &lt; objLength; i++) {
          let objKey = Object.values(myJSON)[i].title.rendered;
          let currentMovie = newState.data[objKey];
          
          currentMovie = {};
          currentMovie.name = Object.values(myJSON)[i].title.rendered;
          currentMovie.description = Object.values(myJSON)[i].content.rendered;
          currentMovie.featured_image = Object.values(myJSON)[i]['featured_image_url'];
          currentMovie.genre = Object.values(myJSON)[i]['genre'];          
        }
      
      this.setState(newState);
      });
  }</code></pre><h4 id="rendermovies-">renderMovies()</h4><p>O <code>if (this.state.data)</code> condicional significa que a função só será executada depois que os dados forem obtidos.</p><p>Aqui, recebemos um array de todos os nossos filmes buscados de <code>this.state.data</code> e o passamos para a função <code>populatePageAfterFetch()</code>.</p><pre><code>renderMovies() {
    if (this.state.data) {
      const moviesArray = Object.values(this.state.data)
      return Object.values(moviesArray).map((movie, index) =&gt; this.populatePageAfterFetch(movie, index));
    }
  }</code></pre><h4 id="populatepageafterfetch-">populatePageAfterFetch()</h4><p>Nessa função, vamos preparar os dados de cada filme para serem renderizados. Isso deve ser simples para qualquer pessoa que tenha usado o JSX, mas com um obstáculo em potencial.</p><p>O valor de <code>movie.description</code> não é texto simples, mas marcação em HTML. Para ver o valor, podemos usar <code>dangerouslySetInnerHTML={{__html: movie.description}}</code>.</p><pre><code>populatePageAfterFetch(movie, index) {
    if (this.state.data) {

      return (
        &lt;div key={index} index={index}&gt; 
          &lt;h2 className="name"&gt;{movie.name}&lt;/h2&gt; 
          &lt;h3 className="genre"&gt;{movie.genre}&lt;/h3&gt;
          &lt;div className="description" dangerouslySetInnerHTML={{__html: movie.description}} /&gt;
          &lt;img className="featured_image" src={movie.featured_image} alt={movie.name} /&gt;
        &lt;/div&gt;
      )
    }
  }</code></pre><p><strong>Observação:</strong> <em>o motivo disso ser potencialmente "perigoso" é que, se seus dados forem hackeados e injetados com scripts XSS maliciosos, eles também serão analisados. Como estamos usando nosso próprio servidor/CMS neste artigo, não precisamos nos preocupar. Porém, se você quiser higienizar seu HTML, dê uma olhada no <a href="https://github.com/cure53/DOMPurify">DOMPurify</a>.</em></p><h4 id="render-">render()</h4><p>Por fim, controlamos onde os dados renderizados aparecerão chamando o método <code>renderMovies()</code> dentro das tags <code>&lt;div&gt;</code> escolhidas. Acabamos de baixar e exibir dados do nosso site WordPress com sucesso!</p><pre><code>render() {
      return (
      &lt;&gt;
        &lt;h1&gt;Movies&lt;/h1&gt;
        &lt;div&gt;{this.renderMovies()}&lt;/div&gt;
      &lt;/&gt;
      )
  }</code></pre><h3 id="conclus-o-1">Conclusão</h3><p>No geral, espero que este artigo tenha tirado o máximo possível da dor do processo de conectar um <em>front-end</em> em React a um <em>back-end</em> do WordPress.</p><p>Como tantas outras coisas na programação, o que pode parecer intimidador em princípio logo se torna natural com a prática!</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Aprenda React Context em cinco minutos – um tutorial para iniciantes ]]>
                </title>
                <description>
                    <![CDATA[ A API React Context tornou-se a ferramenta de gerenciamento de estado (em inglês, state) favorita de muitos, por vezes substituindo completamente o Redux. Neste rápido tutorial de cinco minutos, você terá uma introdução sobre o que é o Context e como usá-lo! > Nota da tradução: nas traduções de textos ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/aprenda-react-contexto-em-cinco-minutos-um-tutorial-para-iniciantes/</link>
                <guid isPermaLink="false">63f94073c24870050d79e4c1</guid>
                
                    <category>
                        <![CDATA[ React ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matheus Ribeiro ]]>
                </dc:creator>
                <pubDate>Wed, 12 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/5f9c9f7c740569d1a4ca42d5.jpg" medium="image" />
                <content:encoded>
                    <![CDATA[ <p data-test-label="translation-intro">
        <strong>Artigo original:</strong> <a href="https://www.freecodecamp.org/news/react-context-in-5-minutes/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">Learn React Context in 5 Minutes - A Beginner's Tutorial</a>
      </p><h2 id="a-api-react-context-tornou-se-a-ferramenta-de-gerenciamento-de-estado-em-ingl-s-state-favorita-de-muitos-por-vezes-substituindo-completamente-o-redux-neste-r-pido-tutorial-de-cinco-minutos-voc-ter-uma-introdu-o-sobre-o-que-o-context-e-como-us-lo-">A API React Context tornou-se a ferramenta de gerenciamento de estado (em inglês, <em>state</em>) favorita de muitos, por vezes substituindo completamente o Redux. Neste rápido tutorial de cinco minutos, você terá uma introdução sobre o que é o Context e como usá-lo!</h2><blockquote>Nota da tradução: nas traduções de textos a respeito de React e de outras tecnologias, sempre que os textos são relativos a versões anteriores da tecnologia, avisamos que, no momento da tradução, os resultados podem variar. Como o React passou por muitas mudanças em suas versões mais recentes desde que o texto original foi lançado, pode haver partes do código que não ajam como o esperado na época do lançamento do artigo original. &nbsp;</blockquote><p>Considere esta árvore, na qual as caixas inferiores representam diferentes componentes:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/gevur92qwoxvdjnm12dw.png" class="kg-image" alt="gevur92qwoxvdjnm12dw" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/gevur92qwoxvdjnm12dw.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/gevur92qwoxvdjnm12dw.png 706w" width="600" height="400" loading="lazy"></figure><p>Podemos adicionar <em>states</em> (ou, em português, estados) aos componentes inferiores com facilidade, mas, até agora, a única maneira de passar dados para um componente irmão era mover o <em>state</em> para um componente superior e depois mandá-lo de novo para baixo até o irmão por meio de <em>props</em>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/u20r26dtxyr6ek6krzsb.png" class="kg-image" alt="u20r26dtxyr6ek6krzsb" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/u20r26dtxyr6ek6krzsb.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/u20r26dtxyr6ek6krzsb.png 716w" width="600" height="400" loading="lazy"></figure><p>Se, mais tarde, notarmos que o irmão do componente com o <em>state</em> também precisa dos dados, temos que elevar o <em>state</em> novamente e passá-lo de volta para baixo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wtlykrxnx8xi12h4wek4.png" class="kg-image" alt="wtlykrxnx8xi12h4wek4" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/wtlykrxnx8xi12h4wek4.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wtlykrxnx8xi12h4wek4.png 712w" width="600" height="400" loading="lazy"></figure><p>Embora essa solução funcione, os problemas começam quando um componente em um ramo diferente precisar dos dados:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/g3xrvthcw24izllvb58w.png" class="kg-image" alt="g3xrvthcw24izllvb58w" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/g3xrvthcw24izllvb58w.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/g3xrvthcw24izllvb58w.png 717w" width="600" height="400" loading="lazy"></figure><p>Nesse caso, precisamos passar o <em>state</em> do topo da aplicação, passando por todos os componentes intermediários, até aquele que precisa dos dados lá no fundo, mesmo que os níveis intermediários não precisem deles. Este processo tedioso e demorado é conhecido como <em>prop drilling</em>.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ey25z0hvmy31xiiqqwgq.png" class="kg-image" alt="ey25z0hvmy31xiiqqwgq" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/ey25z0hvmy31xiiqqwgq.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ey25z0hvmy31xiiqqwgq.png 718w" width="600" height="400" loading="lazy"></figure><p>É aí que entra a API Context. Ela oferece uma maneira de passar dados pela árvore de componentes por meio de um par provedor-consumidor (em inglês, <em>provider</em>-<em>consumer</em>) sem ter que passar <em>props </em>por cada nível. Pense nisso como os componentes brincando de bobinho com os dados – os componentes intermediários podem nem "saber" que alguma coisa está acontecendo:</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ckfpokb2cz3ffmn8238i.png" class="kg-image" alt="ckfpokb2cz3ffmn8238i" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/ckfpokb2cz3ffmn8238i.png 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/ckfpokb2cz3ffmn8238i.png 714w" width="600" height="400" loading="lazy"></figure><p>Para demonstrar isso, vamos criar esta divertida (e utilíssima) imagem de troca de dia e noite.</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/3evdww.gif" class="kg-image" alt="3evdww" width="600" height="400" loading="lazy"></figure><p>Se quiser ver o código completo, dê uma olhada <a href="https://scrimba.com/c/czkvE4sw">no playground do Scrimba deste artigo</a>.</p><h1 id="criando-o-contexto">Criando o contexto</h1><p>Para começar, criamos um <strong>contexto</strong>. Como queremos que toda a aplicação tenha acesso a ele, vamos ao <code>index.js</code> e envolvemos a aplicação com <code>ThemeContext.Provider</code>.</p><p>Também passamos a <em>prop </em><code>value</code> para o nosso provedor. Ele armazena os dados que queremos salvar. Por enquanto, vamos apenas passar a string <code>'Dia'</code>.</p><pre><code class="language-js">import React from "react";
import ReactDOM from "react-dom";
import ThemeContext from "./themeContext";

import App from "./App";

ReactDOM.render(
  &lt;ThemeContext.Provider value={"Dia"}&gt;
    &lt;App /&gt;
  &lt;/ThemeContext.Provider&gt;,
  document.getElementById("root")
);

</code></pre><h1 id="consumindo-o-contexto-com-contexttype">Consumindo o contexto com contextType</h1><p>No momento, no <code>App.js</code>, estamos apenas retornando o componente <code>&lt;Imagem /&gt;</code>.</p><pre><code class="language-js">import React from "react";
import Imagem from "./Imagem";

class App extends React.Component {
  render() {
    return (
      &lt;div className="app"&gt;
        &lt;Imagem /&gt;
      &lt;/div&gt;
    );
  }
}

export default App;

</code></pre><p>Nosso objetivo é usar o <em>Context</em> para alternar os nomes de classe em <code>Imagem.js</code> de <code>Dia</code> para <code>Noite</code>, dependendo de qual imagem queremos renderizar. Para isso, adicionamos uma propriedade estática ao nosso componente chamada <code>ContextType</code> e, em seguida, usamos a interpolação de string para adicioná-la aos <em>classNames </em>no componente <code>&lt;Imagem /&gt;</code>.</p><p>Agora, os <em>classNames </em>contêm a string da <em>prop </em><code>value</code>. <strong>Observação:</strong> eu movi o <code>ThemeContext</code> para um arquivo próprio para evitar um bug.</p><pre><code class="language-js">import React from "react";
import Botao from "./Botao";
import ThemeContext from "./themeContext";

class Imagem extends React.Component {
  render() {
    const theme = this.context;
    return (
      &lt;div className={`${theme}-image image`}&gt;
        &lt;div className={`${theme}-ball ball`} /&gt;
        &lt;Botao /&gt;
      &lt;/div&gt;
    );
  }
}

Imagem.contextType = ThemeContext;

export default Imagem;

</code></pre><h1 id="context-consumer">Context.Consumer</h1><p>Infelizmente, essa abordagem só funciona com componentes baseados em classes. Se você já aprendeu sobre <a href="https://www.freecodecamp.org/news/react-hooks-in-5-minutes/"><em>hooks </em>em React</a> (texto em inglês), deve saber que podemos fazer praticamente qualquer coisa com componentes funcionais hoje em dia. Portanto, como boa prática, devemos converter nossos componentes em componentes funcionais e daí usar o componente <code>ThemeContext.Consumer</code> para passar informações pela aplicação.</p><p>Fazemos isso envolvendo os elementos em uma instância de <code>&lt;ThemeContext.Consumer&gt;</code> e, dentro dela, (onde os componentes <code>filhos</code> ficam), declarando uma função que retorna esses elementos. Isso usa o padrão <em>"render prop"</em>, onde fornecemos como filho uma função normal que retorna o JSX que será renderizado.</p><pre><code class="language-js">import React from "react";
import Botao from "./Botao";
import ThemeContext from "./themeContext";

function Imagem(props) {
  // Não precisamos mais disso
  // const theme = this.context

  return (
    &lt;ThemeContext.Consumer&gt;
      {theme =&gt; (
        &lt;div className={`${theme}-image image`}&gt;
          &lt;div className={`${theme}-ball ball`} /&gt;
          &lt;Botao /&gt;
        &lt;/div&gt;
      )}
    &lt;/ThemeContext.Consumer&gt;
  );
}

// Não precisamos mais disso
// Imagem.contextType = ThemeContext;

export default Imagem;

</code></pre><p><strong>Observação:</strong> também precisamos envolver o componente <code>&lt;Botao /&gt;</code> no <code>&lt;ThemeContext.Consumer&gt;</code> para adicionar funcionalidade ao botão mais tarde.</p><pre><code class="language-js">import React from "react";
import ThemeContext from "./themeContext";

function Botao(props) {
  return (
    &lt;ThemeContext.Consumer&gt;
      {context =&gt; (
        &lt;button className="botao"&gt;
          Switch
          &lt;span role="img" aria-label="sol"&gt;
            ?
          &lt;/span&gt;
          &lt;span role="img" aria-label="lua"&gt;
            ?
          &lt;/span&gt;
        &lt;/button&gt;
      )}
    &lt;/ThemeContext.Consumer&gt;
  );
}

export default Botao;

</code></pre><h3 id="extraindo-o-provedor-do-contexto">Extraindo o provedor do contexto</h3><p>No momento, estamos passando um valor imutável para o provedor. No entanto, nosso objetivo é usar o botão para alternar entre noite e dia.</p><p>Isso requer mover nosso provedor para um arquivo separado e colocá-lo em seu próprio componente, que, neste caso, é chamado de <code>ThemeContextProvider</code>.</p><pre><code class="language-js">import React, { Component } from "react";
const { Provider, Consumer } = React.createContext();

class ThemeContextProvider extends Component {
  render() {
    return &lt;Provider value={"Dia"}&gt;{this.props.children}&lt;/Provider&gt;;
  }
}

export { ThemeContextProvider, Consumer as ThemeContextConsumer };

</code></pre><p><strong>Observação:</strong> a propriedade <code>value</code>, agora, está sendo gerenciada no novo arquivo <code>ThemeContext.js</code> e, portanto, deve ser removida de <code>index.js</code>.</p><p><strong>Alterando o contexto</strong><br>Para configurar o botão, primeiro adicionamos o <em>state</em> ao <code>ThemeContextProvider</code>:</p><pre><code class="language-js">import React, { Component } from "react";
const { Provider, Consumer } = React.createContext();

// Note: você também pode usar hooks para criar o state e converter num componente funcional.
class ThemeContextProvider extends Component {
  state = {
    theme: "Dia"
  };
  render() {
    return &lt;Provider value={"Dia"}&gt;{this.props.children}&lt;/Provider&gt;;
  }
}

export { ThemeContextProvider, Consumer as ThemeContextConsumer };

</code></pre><p>Em seguida, adicionamos um método para alternar entre dia e noite:</p><pre><code class="language-js">toggleTheme = () =&gt; {
  this.setState(prevState =&gt; {
    return {
      theme: prevState.theme === "Dia" ? "Noite" : "Dia"
    };
  });
};

</code></pre><p>Agora, alteramos nossa propriedade <code>value</code> para <code>this.state.theme</code> para que ela retorne as informações vindas do <em>state</em>.</p><pre><code class="language-js"> render() {
    return &lt;Provider value={this.state.theme}&gt;{this.props.children}&lt;/Provider&gt;;
  }
}

</code></pre><p>Em seguida, alteramos <code>value</code> para um objeto contendo <code>{theme: this.state.theme, toggleTheme: this.toggleTheme}</code> e atualizamos todos os locais onde usamos um único valor para procurar o <code>theme</code> em um objeto. Isso significa que cada <code>theme</code> se torna <code>context</code> e cada referência ao <code>theme</code> como valor se torna <code>context.theme</code>.</p><p>Por fim, dizemos ao botão para escutar o evento <code>onClick</code> e, em seguida, acionar o <code>context.toggleTheme</code> – isso atualiza os consumidores que estão usando o <em>state</em> do provedor. O código para o botão fica assim:</p><pre><code class="language-js">import React from "react";
import { ThemeContextConsumer } from "./themeContext";

function Botao(props) {
  return (
    &lt;ThemeContextConsumer&gt;
      {context =&gt; (
        &lt;button onClick={context.toggleTheme} className="botao"&gt;
          Switch
          &lt;span role="img" aria-label="sol"&gt;
            ?
          &lt;/span&gt;
          &lt;span role="img" aria-label="lua"&gt;
            ?
          &lt;/span&gt;
        &lt;/button&gt;
      )}
    &lt;/ThemeContextConsumer&gt;
  );
}

export default Botao;

</code></pre><p>Nosso botão, agora, alterna a imagem entre a noite e o dia com um só clique!</p><figure class="kg-card kg-image-card"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/3evdww-1.gif" class="kg-image" alt="3evdww-1" width="600" height="400" loading="lazy"></figure><h3 id="ressalvas-sobre-o-context">Ressalvas sobre o <em>Context</em></h3><p>Como todas as coisas boas na programação, existem algumas ressalvas no uso do <em>Context</em>:</p><p><strong>Não use o <em>Context </em>para evitar <em>prop drilling</em> em apenas uma ou duas camadas.</strong> O <em>Context</em> é ótimo para gerenciar os <em>state</em> necessários para grandes porções de uma aplicação. No entanto,<em> prop drilling</em> é mais rápido se você estiver passando informações por algumas poucas camadas.</p><p><strong>Evite usar o <em>Context</em> para salvar um <em>state </em>que deveria ser mantido localmente.</strong> Ou seja, se você precisar salvar as entradas de formulário de um usuário, por exemplo, use o <em>state</em> local em vez do <em>Context</em>.</p><p><strong>Sempre envolva o provedor em torno do pai comum mais baixo possível na árvore, não do componente de nível mais alto na aplicação.</strong> Não precisa exagerar.</p><p><strong>Por fim, se você passar um objeto como <em>prop</em>, monitore o desempenho e refatore conforme necessário.</strong> Isso, provavelmente, não será necessário, a menos que uma queda no desempenho seja perceptível.</p><h3 id="resumo">Resumo</h3><p>Este exemplo é bastante simples e, provavelmente, seria mais fácil colocar o <em>state</em> no <em>App </em>e passá-lo por meio de <em>props</em>. No entanto, espero que isso mostre o poder de usar os consumidores, que podem acessar dados independentemente dos componentes acima deles na árvore.</p><p>Se você quiser uma introdução mais detalhada sobre o assunto, pode entrar na lista de espera para o meu próximo <a href="https://scrimba.com/g/greact?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=context_article">curso avançado de React</a> (em inglês), ou, se ainda for um iniciante, confira meu <a href="https://scrimba.com/g/glearnreact?utm_source=freecodecamp.org&amp;utm_medium=referral&amp;utm_campaign=context_article">curso introdutório gratuito de React.</a></p><p>Boa programação para você! 😀</p> ]]>
                </content:encoded>
            </item>
        
            <item>
                <title>
                    <![CDATA[ Como se tornar um desenvolvedor para a web full-stack ]]>
                </title>
                <description>
                    <![CDATA[ Desenvolvedores para a web full-stack são o canivete suíço do mundo da programação. Ter essa designação significa que você pode produzir soluções de ponta a ponta, um conjunto de habilidades altamente comercializáveis e ágeis. O que, no entanto, é realmente necessário para alcançar esse status? Seja você novo, experiente ou ]]>
                </description>
                <link>https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/</link>
                <guid isPermaLink="false">63ee0d3058018c06027bf2ce</guid>
                
                    <category>
                        <![CDATA[ Desenvolvimento para a Web ]]>
                    </category>
                
                <dc:creator>
                    <![CDATA[ Matheus Ribeiro ]]>
                </dc:creator>
                <pubDate>Mon, 10 Apr 2023 21:00:00 +0000</pubDate>
                <media:content url="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/full-stack-web-developer-3.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-become-a-full-stack-web-developer-in-2020/" target="_blank" rel="noopener noreferrer" data-test-label="original-article-link">https://www.freecodecamp.org/news/how-to-become-a-full-stack-web-developer-in-2020/</a>
      </p><p>Desenvolvedores para a web <em>full-stack</em> são o canivete suíço do mundo da programação. Ter essa designação significa que você pode produzir soluções de ponta a ponta, um conjunto de habilidades altamente comercializáveis e ágeis. O que, no entanto, é realmente necessário para alcançar esse status?</p><p>Seja você novo, experiente ou especializado em uma das pontas da stack, há muito o que digerir aqui. Sinta-se livre para mergulhar fundo desde o início ou para pular direto para o tópico no qual você precisa de mais ajuda.</p><ul><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#primeiro-o-que-realmente-torna-um-desenvolvedor-full-stack">Primeiro, o que realmente torna um desenvolvedor full-stack?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#antes-de-seguir-em-frente-vamos-falar-sobre-foco">Antes de seguir em frente, vamos falar sobre foco</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#ent-o-por-onde-come-amos">Então, por onde começamos?</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#front-end">Front-end</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#back-end">Back-end</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#devops-e-a-nuvem">DevOps e a nuvem</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#design">Design</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#outras-coisas-se-voc-est-apenas-come-ando">Outras coisas se você está apenas começando</a></li><li><a href="https://www.freecodecamp.org/portuguese/news/como-se-tornar-um-desenvolvedor-para-a-web-full-stack/#outras-coisas-se-voc-estiver-procurando-por-mais">Outras coisas se você estiver procurando por mais</a></li></ul><h2 id="primeiro-o-que-realmente-torna-um-desenvolvedor-full-stack">Primeiro, o que realmente torna um desenvolvedor full-stack?</h2><p>É divertido e está na moda dizer que qualquer <a href="https://full-stack.netlify.com/">desenvolvedor de <em>front-end</em> é um desenvolvedor <em>full-stack</em></a> (texto em inglês), mas ser capaz de pôr um site no ar através do <a href="https://www.netlify.com/">Netlify</a> não o torna <em>full-stack</em>.</p><p>Não se sinta desencorajado – é só que, sendo realista, essa experiência por si só não será suficiente para justificar o título em sua próxima entrevista. Apesar de você estar tecnicamente criando e implantando seu trabalho do início ao fim, Netlify, <a href="https://vercel.com/">Zeit</a> e outros provedores dão a você o poder de fazer isso com suas ferramentas mágicas que removem a necessidade de realizar a maioria das operações da <em>stack</em>.</p><p>Não que eu queira desdenhar do que podemos realizar agora como desenvolvedores de <em>front-end</em>. O crescente movimento de compilar e fazer <em>deploy</em> de sites estáticos simplificou esse processo no lado do <em>back-end</em>, com benefícios para todos.</p><p>Além disso, com a flexibilidade das diferentes ferramentas disponíveis, como a possibilidade de executar JavaScript no servidor, nossas habilidades podem ser transferidas para mais casos de uso do que nunca.</p><h3 id="de-onde-viemos">De onde viemos</h3><p>O cenário de desenvolvimento para a web está mudando rapidamente. O <a href="https://wordpress.org/">Wordpress</a> vem sendo o rei do CMS há algum tempo, representando mais de um terço dos sites que usam CMS e ajudando o PHP a ganhar popularidade. Outros, contudo, preferem suas próprias soluções.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wordpress-cms-share.jpg" class="kg-image" alt="wordpress-cms-share" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/wordpress-cms-share.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/wordpress-cms-share.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/wordpress-cms-share.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/wordpress-cms-share.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="1000" loading="lazy"><figcaption><a href="https://trends.builtwith.com/cms">https://trends.builtwith.com/cms</a></figcaption></figure><p>Essas "soluções próprias" representam uma stack da web mais tradicional, como a <a href="https://en.wikipedia.org/wiki/LAMP_(software_bundle)">LAMP</a>. Nesses casos, você tinha servidores da web, geralmente executando algum tipo de sistema de gerenciamento de conteúdo e uma linguagem do lado do servidor (como o PHP), que faria a interface com os bancos de dados e produziria o código que acabaria por ser entregue ao navegador.</p><p>Além disso, você pode ter o JavaScript fazendo alguns recursos interativos e CSS gerenciando a exibição da página. Agora, em alguns casos, basta ter um servidor gerenciado com Wordpress para determinados provedores. Outros sites maiores, porém, exigiriam outra equipe para gerenciar esses serviços e o <em>pipeline </em>de <em>deploy </em>para colocar o código em produção.</p><h3 id="onde-estamos-e-para-onde-vamos">Onde estamos e para onde vamos</h3><p>Embora o <a href="https://trends.builtwith.com/cms/WordPress">Wordpress não vá desaparecer tão cedo</a>, as arquiteturas <a href="https://aws.amazon.com/serverless/">serverless</a> e <a href="https://jamstack.org/">JAMstack</a> estão ganhando força (textos e sites em inglês). Para quem não está familiarizado, a ideia não é literalmente a de que não existem servidores, mas de usar servidores que são gerenciados para você na nuvem.</p><p>Serviços como o <a href="https://aws.amazon.com/lambda/">AWS Lambda</a> permitem criar uma "função" que processa entradas e saídas simples. Anexe-a ao <a href="https://aws.amazon.com/pt/api-gateway/">gateway da API</a> e você terá imediatamente um <em>endpoint</em> com o qual poderá interagir sem precisar gerenciar um servidor.</p><p>Outros, como o <a href="https://aws.amazon.com/s3/">S3</a>, deixam você despejar HTML, CSS, JS, imagens e qualquer outro recurso estático no armazenamento e servir o site diretamente neles. Nada é processado no servidor, você está simplesmente servindo os arquivos estáticos para o <em>client</em>.</p><p>A parte brilhante disso é que o servidor não fica sobrecarregado e normalmente sai bem mais barato. Em muitos casos, você também terá um enorme aumento de desempenho, já que servir um site usando o S3 exigirá menos processamento para enviar a <a href="https://developers.google.com/web/tools/lighthouse/audits/ttfb">primeira resposta ao navegador</a>, o que pode levar a uma melhor experiência do usuário.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/brett-rambo-thumbs-up.gif" class="kg-image" alt="brett-rambo-thumbs-up" width="480" height="300" loading="lazy"><figcaption>Um joinha para uma boa experiência de usuário!</figcaption></figure><p>A ideia não é convencê-lo a usar o JAMstack, mas mostrar que o paradigma do <em>full-stack</em> está mudando e vale a pena prestar atenção nisso. Ainda existe uma noção conservadora da diferença no trabalho, mas isso está mudando.</p><p>Agora, são as equipes de DevOps que gerenciam recursos na nuvem e <em>deploys</em>. Os desenvolvedores de back-end agora criam APIs e código que fazem interface com serviços usando ferramentas como funções lambda. Os desenvolvedores de <em>front-end</em> trabalham principalmente com Javascript na criação de aplicações em <a href="https://reactjs.org/">React</a> ou <a href="https://vuejs.org/">Vue</a>, que acessam os serviços que os desenvolvedores de <em>back-end</em> criaram. Isso pode ou não incluir coisas como CSS, mas é mais um vespeiro discutir sobre em qual título essa tarefa se enquadra "oficialmente" (spoiler: depende da equipe).</p><p>Embora ainda haja uma noção de divisão de tarefas, a linha está ficando turva, tornando mais viável expandir o seu foco.</p><h2 id="antes-de-seguir-em-frente-vamos-falar-sobre-foco">Antes de seguir em frente, vamos falar sobre foco</h2><p>Pode ser bastante tentador querer mergulhar a fundo e tratar de todo o espectro de um desenvolvedor <em>full-stack</em>, mas há algo que precisa ser dito sobre foco. É a base da expressão "<a href="https://en.wikipedia.org/wiki/Jack_of_all_trades,_master_of_none">jack of all trades, master of none</a>" (algo como "pau para toda obra, mestre de nada" em tradução livre), em que você tenta aprender um pouco de cada parte do <em>full-stack</em>, mas nunca domina nada de verdade.</p><p>Isso pode ser perigoso quando você ainda é um iniciante e está começando a desenvolver seus pontos fortes. Portanto, tente avaliar que tipo de aluno você é e concentre-se no que é importante. Se você estiver tendo dificuldades com um currículo muito abrangente, ele não necessariamente vai ajudá-lo a adquirir a experiência necessária para conseguir aquele primeiro emprego ou o emprego dos sonhos que você está buscando.</p><p>Uma abordagem diferente seria, por exemplo, ter um foco em particular, mas desenvolver suas habilidades <em>full-stack</em> ao redor desse ponto forte. Você pode ser um desenvolvedor de <em>front-end</em> que pode fazer <em>deploy</em> de suas próprias aplicações da web e constrói seu conhecimento em cima desse conhecimento fundamental.</p><p>Além disso, ser um desenvolvedor <em>full-stack</em> não é necessariamente ser capaz de dizer que você conhece as linguagens x, y e z. Entender de programação e conceitos de design de software, bem como ser capaz de enfrentar qualquer desafio pela frente, seja qual for a <em>stack</em>, é o que faz um grande desenvolvedor.</p><p>Resumindo, tente descobrir o que é melhor para você e não deixe que grandes ambições atrapalhem o domínio da sua jornada.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/mr-miyagi-approves.gif" class="kg-image" alt="mr-miyagi-approves" width="480" height="260" loading="lazy"><figcaption>O Sr. Miyagi aprova</figcaption></figure><h2 id="ent-o-por-onde-come-amos">Então, por onde começamos?</h2><p>Para fins deste artigo, vamos manter as divisões tradicionais que compõem a <em>stack</em> (<em>front-end</em>, <em>back-end</em> etc.). Embora <a href="https://medium.com/better-programming/2020-001-full-stack-pronounced-dead-355d7f78e733">algumas pessoas digam que isso não existe mais</a> (texto em inglês), realisticamente, existe uma infinidade de empregos para desenvolvedores <em>full-stack</em> e, no dia a dia, eles se referem a essas divisões tradicionais. O "desenvolvedor <em>full-stack</em>" definitivamente veio para ficar.</p><p>No que diz respeito à <em>stack</em>, tenderemos às arquiteturas <em>serverless</em>/JAMstack, porque elas não param de crescer. Se você as aprender, isso só o tornará mais desejável, com diversos empregos surgindo em torno delas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/boomshakalaka.gif" class="kg-image" alt="boomshakalaka" width="530" height="320" loading="lazy"><figcaption>Boomshakalaka!</figcaption></figure><p>Como você notará abaixo, o objetivo não é ser abrangente com todos os tipos de banco de dados e todas as soluções de renderização. Um desenvolvedor forte deve ser capaz de ser flexível com suas ferramentas, se esforçando para entender os conceitos de seu trabalho, em vez de ter a mente fechada e só ser capaz de ser produtivo em um <em>framework</em>.</p><p>Em um momento, você pode estar confortável usando React no seu trabalho atual (e está tudo bem!), mas seu próximo trabalho pode ser pesado no Vue, ou ("surpresa!") seu líder de equipe decide reescrever a aplicação com <a href="https://svelte.dev/">Svelte</a>. Tente entender por que você está usando um <em>framework </em>de interface do usuário em primeiro lugar e como ele está ajudando você a resolver o problema em questão.</p><p>Agora, vamos ao que interessa...</p><h2 id="front-end">Front-end</h2><p>O <em>front-end</em> de um site ou aplicação geralmente é a interface do usuário com a qual a pessoa que usa seu serviço interage. A linguagem de mais destaque aqui é o Javascript, do qual você normalmente dependerá para usar bibliotecas de interface de usuário, como o React ou o Vue, para gerenciar os componentes do seu projeto.</p><p>O uso desses <em>frameworks </em>de IU permite que você crie "componentes", essencialmente blocos de código que acabarão por produzir HTML com a capacidade de criar interações e estados dinâmicos junto com seu código. Isso é muito poderoso e, embora possa haver uma pequena curva de aprendizado no início, fica muito agradável de utilizar depois que você pega o jeito.</p><p>Seja você novo na área ou bem experiente, alguma hora você deve se deparar com o jQuery. Embora tenha seus méritos e tenha servido bem à comunidade, os recursos nativos do Javascript cresceram muito e diminuíram a demanda pela funcionalidade que o jQuery era capaz de fornecer. Agora, em vez disso, os desenvolvedores se utilizam dos <em>frameworks </em>de IU e do Javascript nativo.</p><p>Por isso, é bom entender o que é o jQuery, mas não recomendo dedicar seu tempo a aprendê-lo a essa altura. O lado bom é que, se você conseguir um trabalho que o use, pode escrever Javascript nativo junto com o jQuery. Então, aprender o Javascript puro é a resposta certa.</p><h3 id="ent-o-o-que-devo-aprender">Então, o que devo aprender?</h3><p>Se você realmente está começando agora, dedique seu tempo a aprender o básico do HTML e CSS. Pode não ser tão divertido e atraente como mergulhar direto no Javascript, mas ter <a href="https://www.freecodecamp.org/news/put-down-the-javascript-learn-html-css/">uma boa base sobre os fundamentos</a> (texto do autor em inglês) do que faz a web será a chave para começar com o pé direito.</p><p>Em seguida, aprenda Javascript. Ele continuará sendo o rei no futuro próximo. O Javascript fornecerá a base de qualquer <em>framework </em>ou biblioteca que você utilizar. Assim, entender os detalhes de como a linguagem em si funciona ajudará a impulsioná-lo em sua jornada para aprender o lado do <em>front-end</em> das coisas.</p><p>Isso também vai facilitar a sua vida quando você estiver tentando entender algumas das complexidades dos diferentes padrões e <a href="https://reactjs.org/docs/getting-started.html#javascript-resources">conceitos por trás dos <em>frameworks</em></a> que você usar.</p><p>Falando em <em>frameworks</em>, React e Vue são provavelmente os melhores candidatos, dada a sua popularidade. O React é o mais popular do grupo e vai continuar crescendo. Sua equipe está sempre trabalhando para amadurecer o <em>framework </em>e produzir APIs que ajudarão a criar aplicações para a web modernas e rápidas.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/front-end-framework-usage.jpg" class="kg-image" alt="front-end-framework-usage" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/front-end-framework-usage.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/front-end-framework-usage.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/front-end-framework-usage.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/front-end-framework-usage.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="830" loading="lazy"><figcaption><a href="https://2019.stateofjs.com/front-end-frameworks/#front_end_frameworks_section_overview">Estado dos frameworks JS em 2019</a></figcaption></figure><p>Iniciar um projeto com <a href="https://github.com/facebook/create-react-app">create-react-app</a> ou <a href="https://www.gatsbyjs.org/">Gatsby</a>, inclusive, facilita a configuração de uma aplicação em React para que você esteja imediatamente pronto para mexer no código.</p><p>Embora haja benefícios em citar pré-processadores de CSS e ferramentas como o Sass, há uma porção de soluções agora para CSS, incluindo o <a href="https://cssinjs.org/">CSS-in-JS</a>.</p><p>Embora colocar o CSS dentro do JS tenha seus <a href="https://www.freecodecamp.org/news/you-dont-need-css-in-js-why-i-use-stylesheets/">prós e contras</a> (texto do autor em inglês), não vale necessariamente a pena indicar uma direção específica do que usar, já que depende muito da equipe.</p><p>Compreender o básico e o poder do CSS e como usá-lo em sua forma mais básica vai ajudar você a se preparar para utilizá-lo, independentemente do <em>framework</em>.</p><h3 id="recursos">Recursos</h3><ul><li><a href="https://www.freecodecamp.org/portuguese/learn/2022/responsive-web-design/">Certificação de Design responsivo para a web (novo) do freeCodeCamp</a></li><li><a href="https://www.freecodecamp.org/news/put-down-the-javascript-learn-html-css/">Put Down the Javascript: Learn HTML &amp; CSS first</a> (artigo do autor em inglês)<strong> </strong></li><li><a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Language_overview">MDN Introdução ao Javascript</a> </li><li><a href="https://justjavascript.com/">Curso por e-mail Just Javascript</a> (em inglês) </li><li><a href="https://lab.reaal.me/jsrobot/">Jogo educativo JSRobot</a> (em inglês)</li><li><a href="https://react.dev/learn">Introdução ao React da reactjs.org</a> (em inglês)</li><li><a href="https://www.gatsbyjs.org/tutorial/">Tutoriais da gatsbyjs.org</a> (em inglês)</li></ul><h2 id="back-end">Back-end</h2><p>No mundo do JAMstack, o <em>back-end</em> geralmente se refere às APIs que nossos <em>front-ends</em> usam para criar experiências dinâmicas ao interagir com os <em>endpoints</em> do <em>client</em> (como os das APIs <a href="https://en.wikipedia.org/wiki/Create,_read,_update_and_delete">CRUD</a>). A possibilidade de fazer essas solicitações do lado do <em>client</em> elimina a necessidade de ter que fazer qualquer processamento antes que a página seja servida ao navegador.</p><p>Apesar de não ser bom achar que você só pode programar com uma linguagem, ser capaz de escrever em JavaScript dá uma boa vantagem aqui, já que você pode se introduzir aos fundamentos de trabalhar com o lado do <em>back-end</em> das coisas com uma linguagem familiar (ou vice-versa, com o <em>front-end</em>).</p><p>O <a href="https://nodejs.org/en/">NodeJS</a> é um ambiente de tempo de execução comum, que você encontrará na maioria dos ambientes na nuvem como opção e que dará a você uma experiência semelhante ao que você esperaria em um navegador. A principal diferença é que você não terá acesso a determinadas APIs do navegador nem haverá um objeto <code>Window</code> com suas APIs associadas.</p><p>Dito isto, o Python também é <a href="https://pypl.github.io/PYPL.html">outra linguagem popular</a> que está crescendo, especialmente devido à sua popularidade na comunidade de ciência e engenharia de dados. PHP e Ruby, embora sejam ambos válidos e ofereçam opções no mercado de trabalho, não parecem ser tão populares e nem <a href="https://madnight.github.io/githut/">tendem a crescer</a> tanto quanto Javascript e Python.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/language-popularity.jpg" class="kg-image" alt="language-popularity" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/language-popularity.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/language-popularity.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/language-popularity.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/language-popularity.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="530" loading="lazy"><figcaption><a href="https://madnight.github.io/githut/#/pull_requests/2019/4">Linguagens populares no GitHub</a></figcaption></figure><p>Com a linguagem de sua escolha, sua melhor aposta será aprender a criar serviços na nuvem com os quais suas aplicações possam interagir.</p><p>Criar um lambda simples com que você possa brincar, seja na AWS, na Netlify ou em qualquer outro provedor de serviços na nuvem, proporcionará uma boa experiência sobre o que você pode esperar ao trabalhar na área.</p><p>Mesmo que você não trabalhe diretamente em um lambda no emprego que conseguir, vai poder começar a se familiarizar com conceitos que são fundamentais para se trabalhar com o <em>back-end</em>. Cedo ou tarde, você usará essas funções para se conectar a outros serviços e bancos de dados para criar seus próprios serviços dinâmicos.</p><h3 id="ent-o-o-que-devo-aprender-1">Então, o que devo aprender?</h3><p>Se você já está se empenhando em aprender Javascript do lado do <em>front-end</em> das coisas, continue usando o Javascript para o seu <em>back-end</em>. Rode um lambda usando <a href="https://docs.netlify.com/functions/overview/">as funções do Netlify</a>, onde você só precisa se concentrar no código e o Netlify cuida do resto (como compilar e fazer o <em>deploy</em> da função).</p><p>Com a sua linguagem de escolha e primeira função, tente começar a trabalhar com outros serviços dentro do seu código para adquirir experiência trabalhando com APIs de terceiros.</p><p>Talvez construir um <em>endpoint </em>que possa <a href="https://github.com/colbyfayock/tweet">enviar um tweet</a> usando a <a href="https://developer.twitter.com/en/docs">API do Twitter</a> (mas não abuse dela). Aprenda a criar um banco de dados e configurar sua função para interagir com ele em um padrão CRUD. Isso dará a você um caso de uso mais realista de como uma aplicação típica pode interagir com um <em>back-end</em>.</p><p>Seu objetivo aqui deve ser criar serviços com os quais seu <em>front-end</em> interaja por meio de um <em>endpoint</em> para executar operações para a pessoa que usa sua aplicação. A boa notícia é que, dado o crescimento de tecnologias da nuvem, você terá uma porção de opções, <a href="https://aws.amazon.com/free/">algumas delas gratuitas</a>, para começar a brincar.</p><h3 id="recursos-1">Recursos</h3><ul><li><a href="https://kentcdodds.com/blog/super-simple-start-to-serverless">Super simple start to Netlify functions</a> (em inglês) </li><li><a href="https://www.netlify.com/blog/2018/07/09/building-serverless-crud-apps-with-netlify-functions-faunadb/">Building Serverless CRUD apps with Netlify Functions &amp; FaunaDB</a> (em inglês) </li></ul><h2 id="devops-e-a-nuvem">DevOps e a nuvem</h2><p>O DevOps decorre da necessidade de se criar soluções que suavizam e aceleram o processo de levar o código da sua escrita à sua implementação.</p><p>Esse trabalho pode variar de muitas responsabilidades a umas poucas, seja escrever scripts bash para uma solução personalizada, seja escrever um modelo de <a href="https://aws.amazon.com/cloudformation/">CloudFormation</a> que cria todos os recursos necessários para que uma aplicação seja executada.</p><p>Normalmente, você encontrará isso como parte de uma orquestração maior de fluxos de trabalho de <a href="https://en.wikipedia.org/wiki/CI/CD">CI/CD</a> que automatizam os processos de compilação e <em>deploy</em>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/continuous-integration-continuous-deploy-1.jpg" class="kg-image" alt="continuous-integration-continuous-deploy-1" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/continuous-integration-continuous-deploy-1.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/continuous-integration-continuous-deploy-1.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/continuous-integration-continuous-deploy-1.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/continuous-integration-continuous-deploy-1.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="823" loading="lazy"><figcaption>Pipeline CI / CD</figcaption></figure><p>Isso muda constantemente! Dada a febre do <em>serverless</em>, surgiu o <a href="https://serverless.com/">framework serverless</a> para gerenciar muito disso para você de uma maneira mais fácil, o que levou a AWS a criar sua própria solução, o <a href="https://aws.amazon.com/serverless/sam/">SAM</a>. Ferramentas como o <a href="https://jenkins.io/">Jenkins</a> já existem há algum tempo para parte do CI/CD, mas agora estamos vendo o <a href="https://github.com/features/actions">GitHub</a>, o <a href="https://about.gitlab.com/product/continuous-integration/">GitLab</a> e outros provedores de controle de versão fornecerem suas próprias soluções. Vemos também ferramentas, como o <a href="https://circleci.com/">CircleCI</a>, que se conectam diretamente ao seu projeto.</p><p>Essas soluções, contudo, ainda não são perfeitas – escrever modelos do CloudFormation pode ser assustador. Escrever scripts de automação também não é muito divertido, embora seja supergratificante quando eles funcionam!</p><p>O processo, porém, está melhorando. É aí que produtos como Netlify e Zeit entram. Apesar de estarem mais enraizados no lado da hospedagem estática, onde você compila sua aplicação e a despeja no armazenamento, suas ofertas estão crescendo, como as <a href="https://www.netlify.com/products/functions/">Funções da Netlify</a>, que não passam de AWS Lambdas mais fáceis de configurar e de fazer <em>deploy </em>para um <em>endpoint </em>totalmente funcional (é realmente superfácil).</p><h3 id="ent-o-o-que-devo-aprender-2">Então, o que devo aprender?</h3><p>Se for a primeira vez que você configura esse tipo de coisa, comece com o Netlify. Configure uma aplicação do React ou mesmo apenas um arquivo HTML simples em um repositório do GitHub, conecte-o a uma nova conta do Netlify e veja o <em>deploy </em>acontecer.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/netlify-setup.jpg" class="kg-image" alt="netlify-setup" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/netlify-setup.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/netlify-setup.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/netlify-setup.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/netlify-setup.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="740" loading="lazy"><figcaption>Configuração fácil com <a href="https://www.netlify.com/">Netlify</a></figcaption></figure><p>A partir daí, ou se você já tiver um pouco de experiência, comece a pesquisar sobre o que está acontecendo internamente. O Netlify, provavelmente, está pegando seu código, executando os comandos que você configurou (como <code>yarn build</code>) em um ambiente virtual, despejando os arquivos gerados em algum armazenamento, como o S3, e colocando uma CDN, como o CloudFront, na frente para servir de <em>endpoint</em>.</p><p>Primeiro, tente fazer isso manualmente do seu computador, usando o AWS Console e sua CLI e, em seguida, escreva um script para automatizar todo o processo de integração com o Circle CI em seu projeto no GitHub em vez do Netlify para que o <em>deploy </em>realmente aconteça no AWS.</p><p>Indo mais além, você pode criar serviços para fazer interface com o seu <em>back-end</em>. Você tem um banco de dados que seus serviços usam? Você pode automatizar a criação desse banco de dados usando CloudFormation ou scripts bash.</p><p>Tratar sua infraestrutura como código, com recursos descartáveis e facilmente recriáveis, ajudará você e seus projetos a se tornarem mais flexíveis e a terem uma melhor capacidade de voltar a funcionar em caso de falha.</p><p>Tudo isso vale para qualquer provedor de nuvem ou CI/CD, não apenas para a AWS e o Circle CI. Escolha sua ferramenta de nuvem e fluxo de trabalho favorita e mande ver. A questão é começar a observar as necessidades do seu projeto e descobrir o que realmente está acontecendo nas partes automatizadas da <em>stack</em>. Assim, você vai aprender mais e se tornará mais criativo para lidar com necessidades do seu projeto.</p><h3 id="recursos-2">Recursos</h3><ul><li><a href="https://www.netlify.com/blog/2016/09/29/a-step-by-step-guide-deploying-on-netlify/">A Step-by-Step Guide: Deploying on Netlify</a> (em inglês) </li><li><a href="https://docs.aws.amazon.com/pt_br/AmazonS3/latest/userguide/HostingWebsiteOnS3Setup.html">Tutorial: Configuring a static website on Amazon S3 </a> (em inglês)</li><li><a href="https://www.freecodecamp.org/news/aws-certified-cloud-practitioner-training-2019-free-video-course/">AWS Certified Cloud Practitioner Training 2019 - A Free 4-hour Video Course</a> (em inglês)</li><li>Consulte os recursos de Javascript da sessão de front-end acima</li></ul><h2 id="design">Design</h2><p>Sim, você deve entender o básico de design. Não, você não precisa ser um designer.</p><p>Há muitos aspectos do design que acelerarão suas habilidades como desenvolvedor. Todo mundo sabe que designers visuais e de experiência do usuário fazem mágica, mas ter um entendimento básico pode impedir que sua aplicação se torne uma grande decepção.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/pied-piper-user-interface.jpg" class="kg-image" alt="pied-piper-user-interface" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/pied-piper-user-interface.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/pied-piper-user-interface.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/pied-piper-user-interface.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/pied-piper-user-interface.jpg 2000w" sizes="(min-width: 720px) 720px" width="2000" height="1000" loading="lazy"><figcaption>A aplicação fictícia Pied Piper deu ruim por causa de uma má experiência de usuário</figcaption></figure><p>Todos no processo de desenvolvimento estão trabalhando em direção a uma meta que afeta um usuário final de uma forma ou de outra. Ser capaz de entender quais necessidades seu trabalho está tentando resolver e como isso afeta os usuários ajudará a equipe como um todo a desenvolver uma solução final mais abrangente.</p><p>Considere um desenvolvedor de <em>back-end</em> criando uma API para permitir que alguém gerencie usuários em uma aplicação. Os requisitos da API são bastante enxutos e incluem apenas o nome do usuário. Fornecer isso como um único campo "nome" em vez de "nome" e "sobrenome" pode não ser a solução mais intuitiva para a maioria, mas pode ser um descuido que complica como o desenvolvedor do <em>front-end</em> expõe isso na interface do usuário, o que tornaria difícil para o desenvolvedor exibir ou poderia confundir o usuário final que está consumindo o produto.</p><p>Além de tudo isso, o design pode impactar diretamente a conversão. Se você estiver desenvolvendo na área de comércio eletrônico, fazer um botão que não se parece com um botão pode impedir que as pessoas adicionem um produto ao carrinho. Isso, é claro, impedirá uma compra, o que significa receita perdida. Entender como humanizar a interface do usuário, mesmo em um nível básico, pode literalmente gerar mais dinheiro para o seu projeto ou, pelo menos, ajudar as pessoas a usá-lo com mais facilidade.</p><p>Mais importante do que isso, é importante que seu site seja acessível. Muitas pessoas têm necessidades diferentes, seja porque elas não podem ver cores do mesmo jeito ou porque não podem ouvir os sons que sua aplicação produz. Você precisa reconhecer as necessidades alheias e tentar criar um design de tal modo que sua aplicação seja acessível a todos.</p><h3 id="ent-o-o-que-devo-aprender-3">Então, o que devo aprender?</h3><p>Embora eu não espere que você faça um curso inteiro para isso, tente ser consciente e curioso. Talvez, da próxima vez, não pule aquele <a href="https://www.freecodecamp.org/news/tag/design/">artigo de design</a> que você viu aparecer no <a href="https://twitter.com/freecodecamp">Twitter do freeCodeCamp</a>.</p><p>Ao criar soluções, tente imaginar como seu trabalho será usado. O que os outros desenvolvedores da sua equipe precisarão na sua API? O que as pessoas que usam sua aplicação precisam na sua interface?</p><p>Você também pode tentar se inspirar no que os outros estão fazendo em seu espaço. Que aparência você espera que uma aplicação tenha ao fornecer funcionalidades semelhantes? Isso não é licença para copiar ou roubar, mas é bom entender as necessidades que a solução está resolvendo. Reflita no motivo do botão Adicionar ao Carrinho ser tão grande, por que estão deixando os usuários darem zoom em uma foto de produto ou como você pode tornar o design de uma tabela um pouco mais utilizável.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/dribbble-table-design.jpg" class="kg-image" alt="dribbble-table-design" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/dribbble-table-design.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1000/2023/04/dribbble-table-design.jpg 1000w, https://www.freecodecamp.org/portuguese/news/content/images/size/w1600/2023/04/dribbble-table-design.jpg 1600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/dribbble-table-design.jpg 1800w" sizes="(min-width: 720px) 720px" width="1800" height="1060" loading="lazy"><figcaption><a href="https://dribbble.com/search/shots/popular/product-design?q=table">Design de produto "tabela" no Dribbble</a></figcaption></figure><p>Quanto à acessibilidade, tente aprender o básico. Há cada vez mais recursos disponíveis para ajudá-lo a entender as necessidades das pessoas. Tente entender quais deficiências existem e como elas podem afetar o uso da sua aplicação. Quem sabe, você poderá até encontrar alguns padrões comuns de como lidar com essas questões.</p><p>Na maioria das vezes, não é muito difícil incorporar essas questões. Se você adquirir o hábito de fazer isso desde o início, nem vai pensar sobre o assunto na próxima vez em que você construir uma aplicação.</p><h3 id="recursos-3">Recursos</h3><ul><li><a href="https://thoughtbot.com/upcase/design-for-developers">Design for developers</a> (em inglês) </li><li><a href="https://hackdesign.org">Hack Design</a> (em inglês) </li><li><a href="https://designforhackers.com/">Design for Hackers</a> (em inglês) </li><li><a href="https://webaim.org/intro/">Introduction to Web Accessibility</a> (em inglês) </li></ul><h2 id="outras-coisas-se-voc-est-apenas-come-ando">Outras coisas se você está apenas começando</h2><p>Muito deste artigo pressupõe que você já domine alguns conceitos básicos, como entender o que é o <a href="https://pt.wikipedia.org/wiki/Git">Git</a> e o controle de versão ou simplesmente configurar o editor de código. Se você está mesmo começando só agora, vai ser útil ter pelo menos uma compreensão simples desses conceitos, porque vai ficar cada vez mais desafiador sem eles.</p><p>Também é preciso falar sobre aprender a usar o terminal. Pode ser assustador não usar uma GUI quando se está começando, mas uma vez que você começar a se acostumar, vai descobrir rapidamente que será mais produtivo usando um terminal, e, de qualquer maneira, muitos projetos exigem o uso do terminal.</p><h3 id="ent-o-o-que-devo-aprender-4">Então, o que devo aprender?</h3><p>Primeiro de tudo, configure seu editor de código. O <a href="https://code.visualstudio.com/">Visual Studio Code</a> está em alta agora, mas há outros que o servirão bem, dependendo de suas preferências, como o <a href="https://atom.io/">Atom</a> ou o <a href="https://www.sublimetext.com/">Sublime Text</a>. Você também vai encontrar IDEs baseados na nuvem, como o <a href="https://repl.it/">Repl.it</a>, ou pode começar com uma barreira de entrada mais baixa, brincando no <a href="https://codepen.io/">CodePen</a> ou no <a href="https://jsfiddle.net/">JSFiddle</a>.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/visual-studio-code-so-hot.jpg" class="kg-image" alt="visual-studio-code-so-hot" srcset="https://www.freecodecamp.org/portuguese/news/content/images/size/w600/2023/04/visual-studio-code-so-hot.jpg 600w, https://www.freecodecamp.org/portuguese/news/content/images/2023/04/visual-studio-code-so-hot.jpg 970w" sizes="(min-width: 720px) 720px" width="970" height="570" loading="lazy"><figcaption>O Visual Studio Code tá pegando fogo agora</figcaption></figure><p>De qualquer modo, assim que estiver pronto para programar, você vai precisar entender o que é o controle de versão. O Git é o maior representante disso no momento. O Git é uma ferramenta poderosa que permite rastrear alterações no código e se tornar mais produtivo colaborando com outros desenvolvedores.</p><p>Familiarize-se com alguns dos comandos básicos do Git, como adicionar novas alterações, bem como o que são as <em>branches </em>e como usá-las. O mundo do Git é enorme, você não precisa dominá-lo imediatamente, mas logo vai aprender que há uma quantidade infinita de coisas novas para aprender em sua jornada para dominar o Git.</p><p>Muitas ferramentas que você vai usar, como o <a href="https://www.gitkraken.com/">GitKraken</a>, têm interfaces gráficas disponíveis, mas elas ainda são um pouco limitadas no que podem fazer. Aprender a lidar com os terminais padrão na sua máquina ou baixar outras opções, como o <a href="https://iterm2.com/">iterm2</a> (minha preferência) ou o <a href="https://xtermjs.org/">Xterm.js</a>, valerá mais a pena. Bônus: você vai se sentir como um hacker dos filmes toda vez que usá-los (ou será que sou só eu?).</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/hacking-swordfish.gif" class="kg-image" alt="hacking-swordfish" width="480" height="255" loading="lazy"><figcaption>Hugh Jackman hackeando em Swordfish</figcaption></figure><h3 id="recursos-4">Recursos</h3><ul><li><a href="https://www.codecademy.com/articles/visual-studio-code">Introduction to Visual Studio Code</a> (em inglês) </li><li><a href="https://docs.github.com/pt/get-started/quickstart/hello-world">Tutoriais de Git do Github</a> </li><li> <a href="https://learngitbranching.js.org/?locale=pt_BR">Learn Git Branching!</a></li><li><a href="https://blog.teamtreehouse.com/introduction-to-the-mac-os-x-command-line">Introduction to the command line on Mac</a> (em inglês)</li></ul><h2 id="outras-coisas-se-voc-estiver-procurando-por-mais">Outras coisas se você estiver procurando por mais</h2><p>Existem muitas outras coisas em que você pode se aprofundar. Lembre-se de não dispersar o seu foco e tente não se sobrecarregar. Se, no entanto, estiver se sentindo confiante com a sua situação, há alguns outros conceitos que ajudarão você a enfrentar desafios no mundo real.</p><h3 id="testes-e-as-diferentes-metodologias"><a href="https://en.wikipedia.org/wiki/Software_testing">Testes</a> e as diferentes metodologias</h3><p>Escrever código é uma coisa, mas ser capaz de configurar testes eficazes solidificará o seu código e evitará que bugs apareçam. Você não quer perder seu tempo no futuro ou mesmo perder a renda do seu produto quando o site cair. Aprender a escrever testes e as diferentes abordagens é importante para solidificar seu código.</p><h3 id="ferramentas-do-navegador-como-o-chrome-devtools">Ferramentas do navegador, como o <a href="https://developers.google.com/web/tools/chrome-devtools">Chrome DevTools</a></h3><p>Uma das ferramentas mais poderosas que você pode ter ao depurar sua aplicação, na minha opinião, é ser capaz de fazer isso no navegador.</p><p>Seja observando como o DOM está sendo renderizado, <a href="https://developers.google.com/web/tools/chrome-devtools/inspect-styles/edit-styles">mexendo no CSS</a> (texto em inglês) ou depurando suas solicitações de rede, você aprenderá rapidamente a economizar tempo e identificar mais facilmente de onde o bug está vindo.</p><h3 id="http-e-como-depurar-solicita-es-no-painel-de-rede"><a href="https://developers.google.com/web/fundamentals/performance/http2">HTTP</a> e como depurar solicitações no <a href="https://developers.google.com/web/tools/chrome-devtools/network">painel de rede</a></h3><p>Já que a web é baseada na internet, sua aplicação acabará fazendo solicitações para outros servidores. Quando isso acontece, entender os gargalos de solicitação ou simplesmente como uma solicitação está sendo feita pode ajudá-lo a entender por que sua aplicação parece lenta ou por que o botão Salvar não está funcionando.</p><p>Ter uma compreensão básica de como as solicitações funcionam e de como visualizá-las para depuração ajudará muito na sua jornada.</p><h3 id="software-de-c-digo-aberto-e-gerenciadores-de-pacotes">Software de código aberto e gerenciadores de pacotes</h3><p>Aqui, o assunto não é tanto sobre uma habilidade ou ferramenta para aprender, mas um modo como o software é distribuído. Ao começar a criar soluções com código, você logo perceberá que muitos de nós dependemos de pacotes de código aberto. Na maioria das vezes, é através do <a href="https://www.npmjs.com/">npm</a>, se estiver escrevendo em Javascript, o que nos ajuda a sermos mais produtivos, já que não precisamos reinventar a roda toda vez.</p><p>Passe algum tempo entendendo o conceito de código aberto e até considere retribuir colaborando no seu projeto favorito. Dar uma mão é geralmente muito bem-vindo, além de ajudá-lo a ganhar experiência, e você pode até mesmo ganhar <a href="https://www.gatsbyjs.org/contributing/contributor-swag/">brindes no seu primeiro pull request aprovado</a> (texto em inglês)! Porém, seja respeitoso! Há uma pessoa de verdade do outro lado da solicitação também.</p><h2 id="o-que-mais">O que mais?</h2><p>Esta lista pode não acabar nunca, pois o mundo da programação é imenso. O que mais você acha que é importante na jornada para se tornar um mestre do desenvolvimento? Envie um <a href="https://twitter.com/colbyfayock">tweet ou mensagem direta</a> para o autor se acha que ele deixou passar algo importante!</p><h2 id="voc-est-com-tudo-hora-de-unir-todas-as-pontas">Você está com tudo! Hora de unir todas as pontas</h2><p>Dada toda a experiência que você terá acumulado com o que vimos, você já deve ser capaz de criar uma aplicação inteiro do início ao fim sozinho. Você tem ideia do poder que tem?</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://www.freecodecamp.org/portuguese/news/content/images/2023/04/thanos-glove-1.gif" class="kg-image" alt="thanos-glove-1" width="480" height="199" loading="lazy"><figcaption>Thanos preparando a manopla</figcaption></figure><p>É aqui que a diversão começa. Tente criar uma aplicação do zero – não importa o que seja, basta criar algo. A melhor coisa que você pode fazer para aprender é ganhar experiência fazendo. Não importa se é um dos milhões de tutoriais de listas de tarefas por aí ou se vai se ensinar a programar construindo uma das maiores redes sociais, como o <a href="https://thenextweb.com/2012/04/10/instagrams-ceo-had-no-formal-programming-training-hes-a-marketer-who-learned-to-code-by-night/">criador do Instagram</a> (texto em inglês).</p><p>A partir daqui, você deve ser capaz de criar:</p><ul><li>Um <em>front-end</em> de aplicação da web que é executada no navegador</li><li>Serviços de <em>back-end</em> para os quais sua aplicação da web pode fazer solicitações por meio de <em>endpoints</em></li><li>Escrever um script para se conectar a uma ferramenta de CI/CD para automatizar seu processo de compilação e <em>deploy</em></li><li>Bônus: tomar boas decisões sobre a aparência da sua interface para que as pessoas possam usá-la bem!</li></ul><p>Vá em frente e desenvolva! <a href="https://twitter.com/intent/tweet?text=My%20%23codejourney%20started%20with...%0A%0AHow%20to%20Become%20a%20Full%20Stack%20Web%20Developer%20in%20a%20JAMstack%202020%0A@colbyfayock%20@freecodecamp%0Ahttps%3A%2F%2Fwww.freecodecamp.org%2Fnews%2Fhow-to-become-a-full-stack-web-developer-in-2020">Compartilhe com o autor sua jornada na programação</a> no Twitter usando a hashtag #codejourney. Adoraríamos de saber mais sobre o que você passou, o que construiu ou para onde está indo e o que quer construir.</p><figure class="kg-card kg-image-card"><img src="https://res.cloudinary.com/fay/image/upload/w_2000,h_400,c_fill,q_auto,f_auto/w_1020,c_fit,co_rgb:007079,g_north_west,x_635,y_70,l_text:Source%20Sans%20Pro_64_line_spacing_-10_bold:Colby%20Fayock/w_1020,c_fit,co_rgb:383f43,g_west,x_635,y_6,l_text:Source%20Sans%20Pro_44_line_spacing_0_normal:Follow%20me%20for%20more%20JavaScript%252c%20UX%252c%20and%20other%20interesting%20things!/w_1020,c_fit,co_rgb:007079,g_south_west,x_635,y_70,l_text:Source%20Sans%20Pro_40_line_spacing_-10_semibold:colbyfayock.com/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_68,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_145,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_222,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/w_300,c_fit,co_rgb:7c848a,g_north_west,x_1725,y_295,l_text:Source%20Sans%20Pro_40_line_spacing_-10_normal:colbyfayock/v1/social-footer-card" class="kg-image" alt="Siga-me para mais Javascript, UX e outras coisas interessantes!" 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/">✉️ Inscreva-se na newsletter do autor</a></li></ul> ]]>
                </content:encoded>
            </item>
        
    </channel>
</rss>
