<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: CollabCode</title>
    <description>The latest articles on DEV Community by CollabCode (@collabcode).</description>
    <link>https://dev.to/collabcode</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Forganization%2Fprofile_image%2F1133%2F285f84d9-2f9e-410a-91fe-7291451ac34b.png</url>
      <title>DEV Community: CollabCode</title>
      <link>https://dev.to/collabcode</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/collabcode"/>
    <language>en</language>
    <item>
      <title>Métodos HTTP da visão de FrontEnd</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Thu, 07 Apr 2022 12:47:01 +0000</pubDate>
      <link>https://dev.to/collabcode/metodos-http-da-visao-de-frontend-56h4</link>
      <guid>https://dev.to/collabcode/metodos-http-da-visao-de-frontend-56h4</guid>
      <description>&lt;p&gt;Nesse post vou apresentar os métodos HTTP do ponto de vista de pessoas que trabalham com &lt;em&gt;FrontEnd&lt;/em&gt; utilizando o &lt;strong&gt;Fetch API&lt;/strong&gt; do &lt;strong&gt;JavaScript&lt;/strong&gt; para consumir uma &lt;em&gt;API&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  ➡️ Introdução
&lt;/h2&gt;

&lt;p&gt;Imagine que você precisa criar uma apliacação com 4 funcionalidades, de criar, ler, atualizar e deletar os dados de um usuário. Essas 4 funcionalidades também são conhecidas como &lt;em&gt;CRUD&lt;/em&gt; (&lt;em&gt;Create&lt;/em&gt;, &lt;em&gt;Read&lt;/em&gt;, &lt;em&gt;Update&lt;/em&gt; e &lt;em&gt;Delete&lt;/em&gt;).&lt;/p&gt;

&lt;p&gt;Esse é um exemplo de como é a estrutura do nosso usuário na aplicação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marco@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marcobrunodev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streamer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Felizmente você tem uma &lt;em&gt;API&lt;/em&gt; (&lt;em&gt;Application Programming Interface&lt;/em&gt;) e poderá enviar os dados do usuário para a rota (recurso) a seguir: &lt;code&gt;/user&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Outra coisa feliz é que você tem 5 métodos HTTP que estão disponíveis nessa rota &lt;code&gt;/user&lt;/code&gt;, sendo eles:&lt;/p&gt;

&lt;p&gt;1️⃣ &lt;em&gt;Get&lt;/em&gt; (Consumir/Pegar)&lt;br&gt;
2️⃣ &lt;em&gt;Post&lt;/em&gt; (Publicar/enviar)&lt;br&gt;
3️⃣ &lt;em&gt;Put&lt;/em&gt; (Colocar/guardar)&lt;br&gt;
4️⃣ &lt;em&gt;Patch&lt;/em&gt; (Correção/remendo)&lt;br&gt;
5️⃣ &lt;em&gt;Delete&lt;/em&gt; (Deletar/remover)&lt;/p&gt;

&lt;p&gt;Pra que servem esses métodos? 🤨&lt;/p&gt;


&lt;h2&gt;
  
  
  1️⃣ &lt;em&gt;Get&lt;/em&gt; (Consumir/Pegar)
&lt;/h2&gt;

&lt;p&gt;No momento que você consumir a &lt;em&gt;API&lt;/em&gt; na rota &lt;code&gt;/user&lt;/code&gt; utilizando o método &lt;em&gt;Get&lt;/em&gt; ela retornará para você a lista de usuários cadastrados na plataforma, portanto esse método é utilizando para leitura dos dados.&lt;/p&gt;

&lt;p&gt;A seguir um exemplo de como consumir a &lt;em&gt;API&lt;/em&gt; utilizando o &lt;strong&gt;Fetch API&lt;/strong&gt; com &lt;strong&gt;JavaScript&lt;/strong&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user`&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você precisar apenas dos dados de um usuário, é necessário passar um UUID (Universally unique identifier) na rota &lt;code&gt;/user/{uuid}&lt;/code&gt;, mas o método utilizado continua sendo o &lt;em&gt;Get&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;A seguir um exemplo de como você pode usar o &lt;em&gt;Fetch API&lt;/em&gt; do &lt;em&gt;JavaScript&lt;/em&gt; para consumir uma &lt;em&gt;API&lt;/em&gt; passando o &lt;em&gt;UUID&lt;/em&gt; na rota:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos ver que o &lt;em&gt;Get&lt;/em&gt; é utilizado para leitura dos dados em diferentes situações!&lt;/p&gt;




&lt;h2&gt;
  
  
  2️⃣ &lt;em&gt;Post&lt;/em&gt; (Publicar/enviar)
&lt;/h2&gt;

&lt;p&gt;O método &lt;em&gt;Post&lt;/em&gt; utilizamos quando precisamos salvar um novo usuário na aplicação, portanto é necessário passar todos os dados do usuário no &lt;em&gt;body&lt;/em&gt; (corpo) da requisição para a rota &lt;code&gt;/user&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Esse é um exemplo de código de como salvar um dado em uma &lt;em&gt;API&lt;/em&gt; utilizando a &lt;em&gt;Fetch API&lt;/em&gt; com o método &lt;em&gt;Post&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marco@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marcobrunodev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streamer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;POST&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json; charset=UFT-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Toda vez que precisar salvar algo utilizando uma &lt;em&gt;API&lt;/em&gt; o correto é utilizar o método &lt;em&gt;Post&lt;/em&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  3️⃣ &lt;em&gt;Put&lt;/em&gt; (Colocar/guardar)
&lt;/h2&gt;

&lt;p&gt;Se precisamos atualizar os dados de um usuário utilizamos o método &lt;em&gt;Put&lt;/em&gt; e precisamos enviar todos os dados dele no body da requisição e o *️⃣ &lt;em&gt;UUID&lt;/em&gt; (&lt;em&gt;Universally unique identifier&lt;/em&gt;) é algo que não pode faltar.&lt;/p&gt;

&lt;p&gt;A seguir um exemplo de como usar o método &lt;em&gt;Put&lt;/em&gt; passando o &lt;em&gt;UUID&lt;/em&gt; no &lt;em&gt;body&lt;/em&gt; da requisição com &lt;em&gt;Fetch API&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new_email_marco@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marcobrunodev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streamer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user`&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json; charset=UFT-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo que você esteja atualizando apenas 1 campo de 3 campos que o usuário possui, ainda sim é necessário enviar todos os campos no &lt;em&gt;body&lt;/em&gt; da requisição, gostando ou não esse é um padrão adotado quando estamos usando o método &lt;em&gt;Put&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;Agora um exemplo de como fica o código quando você está passando o &lt;em&gt;UUID&lt;/em&gt; na rota da requisição utilizando o método &lt;em&gt;Put&lt;/em&gt; com &lt;em&gt;Fetch API&lt;/em&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new_email_marco@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;nickname&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;marcobrunodev&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;streamer&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PUT&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json; charset=UFT-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Podemos concluir que utilizamos o método &lt;em&gt;Put&lt;/em&gt; para atualizar dados de um recurso que no nosso exemplo foi o do usuário de aplicação.&lt;/p&gt;




&lt;h2&gt;
  
  
  4️⃣ &lt;em&gt;Patch&lt;/em&gt; (Correção/remendo)
&lt;/h2&gt;

&lt;p&gt;Esse método também utilizamos para atualizar o usuário, portanto segue as mesmas regras do método &lt;em&gt;Put&lt;/em&gt;, a diferença é que não precisamos passar todos os campos no &lt;em&gt;body&lt;/em&gt; da requisição.&lt;/p&gt;

&lt;p&gt;Usando o &lt;em&gt;Patch&lt;/em&gt; podemos informar apenas o campo que estamos atualizando e o &lt;em&gt;UUID&lt;/em&gt; para informar qual usuário tem que ser atualizado, como podemos ver no exemplo a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;email&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;new_email_marco@gmail.com&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user/`&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;PATCH&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;body&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stringify&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
  &lt;span class="na"&gt;headers&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Content-Type&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;application/json; charset=UFT-8&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você estava triste com o método &lt;em&gt;Put&lt;/em&gt; agora ficou feliz com o método &lt;em&gt;Patch&lt;/em&gt;. A pergunta de você se deve fazer é: Porque existe o &lt;em&gt;Put&lt;/em&gt; se o &lt;em&gt;Patch&lt;/em&gt; parece mais simples de usar?&lt;/p&gt;

&lt;p&gt;Detalhe essa perguntar não vou responder, deixe nos comentários a sua resposta!&lt;/p&gt;




&lt;h2&gt;
  
  
  5️⃣ &lt;em&gt;Delete&lt;/em&gt; (Deletar/remover)
&lt;/h2&gt;

&lt;p&gt;Quando precisamos remover um usuário da aplicação utilizamos o metódo &lt;em&gt;Delete&lt;/em&gt; e precisamos informar o &lt;em&gt;UUID&lt;/em&gt; na rota: &lt;code&gt;/user/{uuid}&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;uuid&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;dhyu87jk25pd9ol27d9nbvpl97yhdghwedm0&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;

&lt;span class="nx"&gt;fetch&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;`https://marcobruno.dev/user/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;uuid&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,{&lt;/span&gt;
  &lt;span class="na"&gt;method&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;DELETE&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;then&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;User&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;user&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="k"&gt;catch&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Error&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;error&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  *️⃣ UUID (Universally unique identifier - Identificador universalmente único)
&lt;/h2&gt;

&lt;p&gt;O padrão é ser uma string alfanumérica de 36 caracteres que pode ser usada para identificar informações.&lt;/p&gt;




&lt;h3&gt;
  
  
  ‼️IMPORTANTE‼️
&lt;/h3&gt;

&lt;p&gt;Existem mais outros 4 métodos &lt;em&gt;HTTP&lt;/em&gt; que utilizamos menos no nosso dia a dia, mas que vale você estudar também 😍&lt;/p&gt;

&lt;p&gt;➡️ &lt;em&gt;Head&lt;/em&gt;&lt;br&gt;
➡️ &lt;em&gt;Connect&lt;/em&gt;&lt;br&gt;
➡️ &lt;em&gt;Options&lt;/em&gt;&lt;br&gt;
➡️ &lt;em&gt;Trace&lt;/em&gt;&lt;/p&gt;




&lt;h3&gt;
  
  
  Links para saber mais!
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/HTTP/Methods"&gt;Métodos HTTP - MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gabsferreira.com/os-metodos-http-e-a-diferenca-entre-eles/"&gt;Os métodos HTTP: quais são e pra que servem - Gabs Ferreira&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>http</category>
      <category>frontend</category>
      <category>javascript</category>
      <category>fetch</category>
    </item>
    <item>
      <title>Aprendizado Kotlin - Alguns recursos da linguagem</title>
      <dc:creator>Antonio Lazaro</dc:creator>
      <pubDate>Thu, 09 Jul 2020 19:42:19 +0000</pubDate>
      <link>https://dev.to/collabcode/aprendizado-kotlin-alguns-recursos-da-linguagem-i10</link>
      <guid>https://dev.to/collabcode/aprendizado-kotlin-alguns-recursos-da-linguagem-i10</guid>
      <description>&lt;p&gt;Originalmente publicado no blog do &lt;a href="https://antoniolazaro.dev/kotlin/2020/04/20/estudo-kotlin-indice-serie.html"&gt;autor&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Durante o &lt;a href="https://app.pluralsight.com/library/courses/kotlin-getting-started/table-of-contents"&gt;curso de Kevin Jones "Getting Started with Kotlin" da Plural Sight&lt;/a&gt; tive oportunidade de conhecer alguns conceitos de Kotlin que achei bastante interessante e resolver compartilhar.&lt;/p&gt;

&lt;p&gt;No próprio site da linguagem, existem &lt;a href="https://kotlinlang.org/docs/tutorials/"&gt;vários tutoriais&lt;/a&gt; e &lt;a href="https://kotlinlang.org/docs/books.html"&gt;recomendações de livros&lt;/a&gt;, alem do próprio &lt;a href="https://kotlinlang.org/docs/tutorials/getting-started.html"&gt;Getting Started do site que fala de diversas características e recursos da linguagem e ferramentas associadas&lt;/a&gt;. Achei também o &lt;a href="https://kotlinlang.org/docs/reference/"&gt;guia de referência da linguagem muito rico e completo&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para quem se interessa pela estrutura da linguagem, existe disponível também a &lt;a href="https://kotlinlang.org/docs/reference/grammar.html"&gt;gramática da linguagem&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Recursos da linguagens observadores e experimentados
&lt;/h2&gt;

&lt;p&gt;Nessa seção, pretendo falar de alguns recursos que pude experimentar durante o curso, e pratiquei em um projeto piloto que está disponível em um repositório no meu github onde pretendo colocar os demos do que ando testando com Kotlin. Esse repositório é o &lt;a href="https://github.com/antoniolazaro/kotlin-lab"&gt;kotlin-lab&lt;/a&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  Declaração de variáveis e propriedades: val x var - Suporte a imutabilidade de objetos nativamente
&lt;/h3&gt;

&lt;p&gt;Em kotlin para declarar uma variável é possível a seguinte estrutura&lt;/p&gt;

&lt;p&gt; [propertyType] = &lt;/p&gt;

&lt;p&gt;A estrutura acima é explicada da seguinte forma:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;val = Variável é imutável. Uma vez atribuído um valor, a referência não pode mais mudar. Se houver essa tentativa de atribuição, o compilador acusa erro.&lt;/li&gt;
&lt;li&gt;var = Variável mutável. Comum como qualquer variável.&lt;/li&gt;
&lt;li&gt;propertyName = nome da variável ou propriedade.&lt;/li&gt;
&lt;li&gt;propertyType = atributo opcional. Caso não seja declarado, será colocado por inferência pela atribuição da primeira referência. Uma vez atribuido, esse tipo não pode receber outro tipo. A linguagem Kotlin não é dinamicamente tipada como JavaScript.&lt;/li&gt;
&lt;li&gt;propertyValue = Valor atribuído da variável.
&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;teste&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;teste&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Teste"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="n"&gt;teste&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Teste 2"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//erro de compilação por fazer uma reatribuição&lt;/span&gt;
&lt;span class="n"&gt;teste&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//erro de compilação por atribuir outro tipo&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;inteiro&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;//erro de compilação. Não é possível fazer inferência sem atribuição e sem definir o tipo&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  Uso de constantes
&lt;/h4&gt;

&lt;p&gt;Para declaração de constantes existe a palavra reserva &lt;strong&gt;&lt;em&gt;const&lt;/em&gt;&lt;/strong&gt;. Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;const&lt;/span&gt; &lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;x&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Tipos primitivos
&lt;/h3&gt;

&lt;p&gt;Os tipos primitivos de Kotlin são objetos.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Tipos primitivos inteiros e suas faixas de valores:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;a href="/static/img/kotlin/primite-integer.png" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/kotlin/primite-integer.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;&lt;strong&gt;Tipos primitivos booleanos e de ponto fluante e suas faixas de valores.:&lt;/strong&gt;&lt;/em&gt;&lt;br&gt;
&lt;a href="/static/img/kotlin/float-point-others.png" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/kotlin/float-point-others.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;
  
  
  Strings
&lt;/h3&gt;

&lt;p&gt;Strings são literais definidos entre &lt;em&gt;""&lt;/em&gt;. Em Kotlin ela é uma sequencia imutável de códigos UTF-16.&lt;/p&gt;
&lt;h4&gt;
  
  
  String templates
&lt;/h4&gt;

&lt;p&gt;Em Kotlin, é possível trabalhar com String Templates, como no JavScript, onde variáveis podem ser acessadas através do caracter &lt;em&gt;\$&lt;/em&gt;, evitando assim a necessidade de concatenação de Strings. Caso seja necessário usar o caracter &lt;em&gt;\$&lt;/em&gt;, deve ser feito o uso do escape: &lt;em&gt;\\$&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Exemplo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Anne"&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;yearOfBirth&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;1985&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;yearNow&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2018&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;message&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"$name is ${yearNow - yearOfBirth} years old"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Condicionais (if/else)
&lt;/h3&gt;

&lt;p&gt;A condição fica entre parenteses &lt;em&gt;()&lt;/em&gt; e o corpo da condição deve ser envolvido por chaves &lt;em&gt;{}&lt;/em&gt;. A condição deve ter retorno booleano.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;age&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;42&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You're too young to watch this movie"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;13&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You can watch this movie with a parent"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You can watch this movie"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Como em outras linguagens de programação, o uso da condicional sem as chaves envolve o risco de alguma condição não ser devidamente executada, por isso, é extremamente recomendado se trabalhar com essa sinalização explicitamente.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;age&lt;/span&gt; &lt;span class="p"&gt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You're too young to watch this movie"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"You should go home"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Erro de lógica, esse trecho de código sempre será executado, independente da condicional.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;O if/else é também uma expressão, o que pode funcionar como um operador ternário em Java. Quando se usa essa condição, é obrigatório definir um regra para o bloco &lt;em&gt;else&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;condition&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;trueBody&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="n"&gt;falseBody&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Comparações
&lt;/h3&gt;

&lt;p&gt;Estrutura de comparação são feitas sempre com &lt;em&gt;==&lt;/em&gt; ou &lt;em&gt;!=&lt;/em&gt;. Quando invocados esses símbolos, eles automaticamente invocam o equals da classe em questão.&lt;/p&gt;

&lt;p&gt;Comparações são chamadas de equalidade estrutural e o compilador traduz a == b, conforme exemplo abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="o"&gt;?.&lt;/span&gt;&lt;span class="nf"&gt;equals&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;?:&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;===&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Para comparação de referência, deve ser utilizado os operadores &lt;em&gt;===&lt;/em&gt; ou &lt;em&gt;!==&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  When
&lt;/h3&gt;

&lt;p&gt;Esse operador seria equivalente ao Switch do Java, só que é um switch/case muito mais robusto.&lt;/p&gt;

&lt;p&gt;Alguns exemplos de uso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x == 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x == 2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// Note the block&lt;/span&gt;
&lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x is neither 1 nor 2"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Combinando diversos valores para mesma condição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x == 0 or x == 1"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"otherwise"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Pode ser usada expressões como condição:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;parseInt&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"s encodes x"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"s does not encode x"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;E tem suporte a negação através do caracter &lt;em&gt;!&lt;/em&gt; e a range (intervalos), bem como coleções.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;when&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x is in the range"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;validNumbers&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x is valid"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;!&lt;/span&gt;&lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"x is outside the range"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"none of the above"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Estruturas de repetição
&lt;/h3&gt;

&lt;h4&gt;
  
  
  for
&lt;/h4&gt;

&lt;p&gt;For faz iteração através de qualquer coisa que provenha um iterator. Similar ao que temos de foreach do Java.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;collection&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// exemplo 1&lt;/span&gt;
&lt;span class="c1"&gt;//ou&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ints&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;// exemplo 2&lt;/span&gt;
&lt;span class="c1"&gt;// ...&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;indices&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//iterando um array ou uma lista indexada&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//interando um range de números&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt; &lt;span class="n"&gt;downTo&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//iterando uma contagem regressiva, definindo o salto&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="n"&gt;until&lt;/span&gt; &lt;span class="mi"&gt;10&lt;/span&gt; &lt;span class="n"&gt;step&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Prints 0, 2, 4, 6, 8&lt;/span&gt;

&lt;span class="c1"&gt;// Iterate over the entries as objects that contain the key and the value as properties&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;entry&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"${entry.key}: ${entry.value}"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="c1"&gt;// Iterate over the entries as separate key and value objects&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"$key: $value"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Iterate over the keys&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// Iterate over the values&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h4&gt;
  
  
  while/do-while
&lt;/h4&gt;

&lt;p&gt;Não tem muita mudança em relação a outras linguagens.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="n"&gt;x--&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;y&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;retrieveData&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;y&lt;/span&gt; &lt;span class="p"&gt;!=&lt;/span&gt; &lt;span class="k"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// y is visible here!&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h3&gt;
  
  
  Collections
&lt;/h3&gt;

&lt;p&gt;A classe Array é equivalente ao array[] do Java. Esse tipo de lista tem um tamanho fixo. As principais estruturas de dados do Java existem em Kotlin. Além do Array, temos o List, Set (dados não se repetem baseado na regra do equals) e Map (chave/valor). O map equivale ao dicionário (dict) do Python.&lt;/p&gt;

&lt;p&gt;Exemplo de como criar collections em Kotlin:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Anne"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Karen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Peter"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// List&amp;lt;String&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;map&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Map&amp;lt;String, Int&amp;gt;&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;set&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;setOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// Set&amp;lt;String&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;A sintaxe acima cria listas imutáveis. Não pode ser modificado nem o tamanho, nem seus elementos. Para criação de listas mutáveis, existem outros métodos:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;strings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mutableListOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Anne"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Karen"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"Peter"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;map&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mutableMapOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;set&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;mutableSetOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"a"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"b"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"c"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Para criar coleções vazias, é necessário definir o tipo ou colocar a tipificação no método de criação. Como na sintaxe abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;noInts&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;List&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;noStrings&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;emptyMap&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;mapOf&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nc"&gt;Int&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;()&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Hierarquia de interfaces em Kotlin segue conforme figura abaixo:&lt;br&gt;
&lt;a href="/static/img/kotlin/collections-kotlin.png" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/kotlin/collections-kotlin.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;De maneira resumida:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Collection é usada quando podemos trabalhar tanto com List quanto com Set.
= MutableCollection é Collection com operações de escrita add/remove.&lt;/li&gt;
&lt;li&gt;List é usado preservando a ordem e podendo ser acessado por índice. Os índices iniciam em zero e o último elemento é list.size-1. A lista suporta elementos null, inclusive que podem se repetir. Duas listas são consideradas iguais se elas tem o mesmo tamanho e os elementos são iguais e estão na mesma posição. Implementação default é ArrayList.&lt;/li&gt;
&lt;li&gt;MutableList: É uma lista com operação de escritas add/remove (existem outros métodos)&lt;/li&gt;
&lt;li&gt;List x Array: Eles são muito similares entretanto, um array tem seu tamanho definido na sua inicialização e nunca mudará. Uma lista ela não tem um tamanho pré-definido, e pode mudar de tamanho a partir de operações de escrita.&lt;/li&gt;
&lt;li&gt;Set: Armazena elementos únicos (exclusivos). A ordem normalmente não é um critério relevante. Pode armazenar, um e apenas um valor null. Duas coleções desse tipo são iguais se tem o mesmo tamanho e possuem os mesmos elementos. Implementação default é LinkedHashSet que preserva ordem de inseração, porém existe HashSet que a ordem não é relevante e consequentemente é mais performática que a estrutura default;&lt;/li&gt;
&lt;li&gt;MutableSet: Set com operações de escrita.&lt;/li&gt;
&lt;li&gt;Map: Estrutura com chave/valor. Lembra um cache ou uma tabela de banco de dados. As chaves são unicas e os valores podem ser repetidos se as chaves forem diferentes. Dois maps são iguais se possuem se suas chaves/valores são iguais. A implementação default é LinkedHashMap que preserva a ordem de inserção. Como alternativa tem o HashMap que não guardar a ordem de inseração e se baseaia no código hash, como no HashSet.&lt;/li&gt;
&lt;li&gt;MutableMap: É um map com operação de escrita.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Um recurso bastante interessante em Kotlin é que você pode utilizar operadores &lt;em&gt;+&lt;/em&gt; e &lt;em&gt;-&lt;/em&gt; para coleções.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"one"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"two"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"three"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"four"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;plusList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;+&lt;/span&gt; &lt;span class="s"&gt;"five"&lt;/span&gt;
&lt;span class="kd"&gt;val&lt;/span&gt; &lt;span class="py"&gt;minusList&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;numbers&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt; &lt;span class="nf"&gt;listOf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"three"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;"four"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;plusList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;minusList&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



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

&lt;p&gt;Nesse estudo, comparei com Java as estruturas básicas de programação com Kotlin. Nos próximos, pretendo trazer outros recursos que a linguagem oferece.&lt;/p&gt;

&lt;p&gt;&lt;br&gt;&lt;br&gt;
&lt;a href="//%7B%%20link%20_posts/2020-04-20-estudo-kotlin-indice-serie.md%20%%7D"&gt;Conheça a série sobre Kotlin&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Outras Fontes:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Sobre atributos, variáveis (mutáveis ou não), constantes&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/reference/properties.html"&gt;https://kotlinlang.org/docs/reference/properties.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/tutorials/kotlin-for-py/declaring-variables.html"&gt;https://kotlinlang.org/docs/tutorials/kotlin-for-py/declaring-variables.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Sobre strings:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/tutorials/kotlin-for-py/strings.html"&gt;https://kotlinlang.org/docs/tutorials/kotlin-for-py/strings.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Condicional:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/tutorials/kotlin-for-py/conditionals.html"&gt;https://kotlinlang.org/docs/tutorials/kotlin-for-py/conditionals.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;When:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/reference/control-flow.html#when-expression"&gt;https://kotlinlang.org/docs/reference/control-flow.html#when-expression&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;for:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/reference/control-flow.html#for-loops"&gt;https://kotlinlang.org/docs/reference/control-flow.html#for-loops&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collections:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/reference/collections-overview.html"&gt;https://kotlinlang.org/docs/reference/collections-overview.html&lt;/a&gt;&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/tutorials/kotlin-for-py/collections.html"&gt;https://kotlinlang.org/docs/tutorials/kotlin-for-py/collections.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;whil/do-while:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/reference/control-flow.html#while-loops"&gt;https://kotlinlang.org/docs/reference/control-flow.html#while-loops&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Collections:&lt;br&gt;
&lt;br&gt; -- &lt;a href="https://kotlinlang.org/docs/tutorials/kotlin-for-py/collections.html"&gt;https://kotlinlang.org/docs/tutorials/kotlin-for-py/collections.html&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kotlin</category>
      <category>jvm</category>
    </item>
    <item>
      <title>Aprendizado Kotlin - Configurando ambiente de desenvolvimento Kotlin</title>
      <dc:creator>Antonio Lazaro</dc:creator>
      <pubDate>Thu, 09 Jul 2020 19:27:54 +0000</pubDate>
      <link>https://dev.to/collabcode/aprendizado-kotlin-um-pouco-sobre-kotlin-minhas-percepcoes-do-primeiro-contato-2ple</link>
      <guid>https://dev.to/collabcode/aprendizado-kotlin-um-pouco-sobre-kotlin-minhas-percepcoes-do-primeiro-contato-2ple</guid>
      <description>&lt;p&gt;Originalmente publicado no blog do &lt;a href="https://antoniolazaro.dev/kotlin/2020/04/20/estudo-kotlin-indice-serie.html"&gt;autor&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;A &lt;a href="https://www.pluralsight.com/offer/2020/free-april-month"&gt;Plural Sight&lt;/a&gt; está com uma promoção para o mês de abril onde os cursos da plataforma estão todos abertos devido a situação da COVID-19. Diante disso, me cadastrei na plataforma e fiz o curso &lt;a href="https://app.pluralsight.com/library/courses/8251eea9-5847-4881-bc94-1c3e0dc8b42e/table-of-contents"&gt;"Getting Started With Kotlin"&lt;/a&gt; by &lt;a href="https://app.pluralsight.com/profile/author/kevin-jones"&gt;Kevin Jones&lt;/a&gt; (conta dele no &lt;a href="https://twitter.com/kevinrjones?lang=en"&gt;twitter:&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Meu primeiro contato com Kotlin foi durante a seleção da Jaya onde fiz um projeto usando &lt;a href="https://github.com/antoniolazaro/octo-events"&gt;Kotlin e Gradle com Javalin, Koin e Exposed&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;O curso ele tem duração de 2h, e cobre uma introdução, fala um pouco sobre programação orientada a objetos, funcional, interoperabilidade Java x Kotlin e vice-versa, e fala sobre a ferramenta de testes Spek.&lt;/p&gt;

&lt;h2&gt;
  
  
  Configurando ambiente desenvolvimento Kotlin em ambientes Unix based
&lt;/h2&gt;

&lt;p&gt;Para quem não tem a JVM instalada, particulamente, acho a o &lt;a href="https://sdkman.io/"&gt;SDKMan&lt;/a&gt; a melhor forma de configurar itens do ambiente Java para ambientes Unix based. Usuários de Windows, não sei se tem uma forma de configurar o SDKMan no Windows.&lt;/p&gt;

&lt;p&gt;Segue passo a passo de como testar e configurar ambiente Kotlin em ambiente Unix based:&lt;/p&gt;

&lt;p&gt;1- &lt;a href="https://sdkman.io/install"&gt;Instalar o SDK Man&lt;/a&gt;&lt;br&gt;
&lt;br&gt;2- Usando Sdk Man, &lt;a href="https://sdkman.io/sdks#kotlin"&gt;instalar o Kotlin&lt;/a&gt;&lt;br&gt;
&lt;br&gt;3- Você pode ver que a variável de ambiente KOTLIN_HOME foi setada através do comando&lt;br&gt;
&lt;br&gt;
 &lt;code&gt;echo \$KOTLIN_HOME&lt;/code&gt;&lt;br&gt;
&lt;/p&gt;

&lt;p&gt;4- Testar a instalação do Kotlin através do comando kotlinc. Deve aparecer conforme abaixo.&lt;br&gt;
&lt;a href="/static/img/kotlin/kotlin-demo.png" class="article-body-image-wrapper"&gt;&lt;img src="/static/img/kotlin/kotlin-demo.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  Hello World
&lt;/h2&gt;

&lt;p&gt;A forma mais fácil de testar Kotlin sem necessidade de instalar nenhum software é através do site da própria linguagem &lt;a href="https://try.kotlinlang.org/#/Examples/Hello,%20world!/Simplest%20version/Simplest%20version.kt"&gt;Try Kotlin&lt;/a&gt; que est[a sendo considerado obsoleto e eles recomendam agora o &lt;a href="https://play.kotlinlang.org"&gt;Kotlin Playground&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Arquivos de código-fonte Kotlin eles tem a extensão .kt. O hello World Kotlin pode ser feito da seguinte forma (pode ser executado diretamente no terminal ou salvo como arquivo):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight kotlin"&gt;&lt;code&gt;&lt;span class="k"&gt;fun&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;args&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nc"&gt;Array&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nc"&gt;String&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;){&lt;/span&gt;
&lt;span class="nf"&gt;println&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Hello, World"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Assim como no Java existe a função public static void main, em Kotlin essa função é o main, descrito acima. É como a JVM interpreta que o Kotlin executará um programa.&lt;/p&gt;

&lt;p&gt;Para compilar via linha de comando será necessário digitar o comando abaixo no diretório onde o arquivo foi salvo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kotlinc nome-arquivo-fonte.kt
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;p&gt;Para converter esse código Kotlin em um jar executável da JVM é necessário rodar o comando abaixo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight"&gt;&lt;pre class="highlight plaintext"&gt;&lt;code&gt;kotlinc nome-arquivo-fonte.kt -include-runtime -d nome-binario-executavel.jar
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;



&lt;h2&gt;
  
  
  IDEs
&lt;/h2&gt;

&lt;p&gt;Dificilmente, alguém utilizará para projetos reais a estrutura acima, de executar manualmente, compilar, etc. Normalmente trabalhamos com IDEs em projetos reais. Não testei no Netbeans porque, particulamente não conheço e não uso, porém para as 3 IDEs que tenho na minha máquina (Eclipse,IntelliJ e VSCode) vi que o Kotlin tem plugin e suporte.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;IntelliJ: Instalar plugin Kotlin&lt;/li&gt;
&lt;li&gt;Eclipse: Instalar no Market Place o plugin para Kotlin&lt;/li&gt;
&lt;li&gt;VsCode: Instalar o plugin para Kotlin (baixei o que tinha mais download em minha busca, que foi do editor: mathiasfrohlich)&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Até o momento, estou utilizando IntelliJ como IDE para programar em Kotlin e tenho gostado do resultado. Achei conceitualmente muito parecido com Java, porém mais simples. A interoperabilidade com Java é muito bem feita para os testes incialmente feitos.&lt;/p&gt;

</description>
      <category>kotlin</category>
      <category>jvm</category>
    </item>
    <item>
      <title>Aprendizado Kotlin - Um pouco sobre Kotlin, minhas percepções do primeiro contato</title>
      <dc:creator>Antonio Lazaro</dc:creator>
      <pubDate>Thu, 09 Jul 2020 19:26:28 +0000</pubDate>
      <link>https://dev.to/collabcode/aprendizado-kotlin-um-pouco-sobre-kotlin-minhas-percepcoes-do-primeiro-contato-517g</link>
      <guid>https://dev.to/collabcode/aprendizado-kotlin-um-pouco-sobre-kotlin-minhas-percepcoes-do-primeiro-contato-517g</guid>
      <description>&lt;p&gt;Originalmente publicado no blog do &lt;a href="https://antoniolazaro.dev/kotlin/2020/04/20/estudo-kotlin-indice-serie.html"&gt;autor&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;Em abril iniciei um novo ciclo profissional e agora faço parte do time da &lt;a href="https://jaya.tech/"&gt;Jaya Tech&lt;/a&gt; trabalhando para o &lt;a href="https://www.c6bank.com.br"&gt;C6 Bank&lt;/a&gt;. Enquanto os acessos são criados/liberados, tive a oportunidade de ir me familiarizando mais com a linguagem utilizada no projeto que ficarei alocado. A principo a Stack trabalha com Kotlin e por esse motivo tenho que aprender a linguagem e conhecer suas características.&lt;/p&gt;

&lt;h3&gt;
  
  
  Kotlin
&lt;/h3&gt;

&lt;p&gt;Kotlin atualmente está na &lt;a href="https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-3-70-released/?_ga=2.196070380.1960498962.1587384907-1530203495.1584056577"&gt;versão 1.3.70&lt;/a&gt;. A equipe trabalha na &lt;a href="https://blog.jetbrains.com/kotlin/2020/03/kotlin-1-4-m1-released/?_ga=2.196070380.1960498962.1587384907-1530203495.1584056577"&gt;release 1.4 que está em milestone 1&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Você pode testar recursos do Kotlin no &lt;a href="https://kotlinlang.org/#try-kotlin"&gt;site da própria linguagem&lt;/a&gt; e ela tem uma &lt;a href="https://kotlinlang.org/docs/tutorials/getting-started.html"&gt;documentação rica e muito clara&lt;/a&gt; com diversos tutoriais.&lt;/p&gt;

&lt;p&gt;Uma boa fonte de informação sobre a linguagem, suas evoluções e usos é o &lt;a href="https://blog.jetbrains.com/kotlin/"&gt;blog da linguagem&lt;/a&gt;, bem como a &lt;a href="https://twitter.com/kotlin"&gt;conta do Twitter&lt;/a&gt;. Para conhecer os detalhes da linguagem, ela é open-source e pode ser conhecida internamente através da &lt;a href="https://github.com/JetBrains/kotlin"&gt;conta do GitHub da JetBrains&lt;/a&gt;, empresa responsável pela criação e manutenção do Kotlin. No github da &lt;a href="https://github.com/Kotlin"&gt;linguagem Kotlin&lt;/a&gt;, podem ser conhecidos diversos projetos complementares a linguagem com ferramentas e bibliotecas.&lt;/p&gt;

&lt;h4&gt;
  
  
  História Kotlin
&lt;/h4&gt;

&lt;p&gt;Acredito eu, que a motivação da &lt;a href="https://www.jetbrains.com/"&gt;JetBrains&lt;/a&gt; para criar uma nova linguagem de programação em relação ao Java devia ser uma inquietação em relação a lentidão da evolução da linguagem, bem como seu processo de release. Java nos últimos anos, ganhou status de "Old school" e isso obrigou o JCP a acelerar o processo de desenvolvimento do mesmo. Hoje temos releases semestrais do Java, seguindo a mesma cultura LTS (Long Term Support) que já existem em outros projetos Open Source. O ciclo de evolução ficou mais rápido com mudanças menores. Mas a JetBrains hoje tem um modelo de lançamento de release da linguagem mais livre do processo vinculado ao Java.&lt;/p&gt;

&lt;p&gt;Em 2011, a JetBrains lançou a linguagem que recebeu o nome em homenagem a uma ilha russa de mesmo nome situada próxima a costa de São Pertesburgo onde a equipe do Kotlin reside. Essa ilha fica no lado ocidental da Russia, &lt;a href="https://goo.gl/maps/bhU78E8DyQGSLqh4A"&gt;próxima a Finlândia e a Estônia&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;A linguagem teve fortes influências de &lt;a href="https://www.scala-lang.org/"&gt;Scala&lt;/a&gt; e se pensou muito em interopibilidade com o Java, tanto que é possível misturar código Java com Kotlin e vice-versa.&lt;/p&gt;

&lt;p&gt;Em 2017, no Google IO, a Google anunciou que essa se tornaria a linguagem oficial para o Android.&lt;/p&gt;

&lt;p&gt;A partir de novembro de 2017, na versão 1.2, foi possível lançar uma release onde se programava código Kotlin para JVM e Javascript.&lt;/p&gt;

&lt;p&gt;Na release 1.3, Kotlin trouxe o conceito de coroutines para programação assincrona.&lt;/p&gt;

&lt;p&gt;Kotlin foi pensada para ser menos verbosa que o Java e mais produtiva. Fazendo o dev escrever menos código, consequentemente tendo mais tempo para pensar no negócio do que digitando.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ambiente de desenvolvimento
&lt;/h2&gt;

&lt;p&gt;Por ser feito pela JetBrains, nos meus testes, minha perceção de melhor uso e produtividade no Kotlin é no InteliJ IDE. Porém Kotlin tem plugins para Eclipse e Visual Studio Code e funcionaram bem. Nesse primeiro contato o IntelliJ tem me agradado mais. Mesmo na versão Community Edition.&lt;/p&gt;

&lt;p&gt;É possível também utilizar linha de comando para executar código Kotlin.&lt;/p&gt;

&lt;h2&gt;
  
  
  Características
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Fortemente tipada: Como Java, porém de maneira mais simples devido a inferência de tipo.&lt;/li&gt;
&lt;li&gt;Inferência de tipo: Tipo não precisa ser declarado, ele é inferido na associação com o objeto.&lt;/li&gt;
&lt;li&gt;Concisa: Linguagem pensada para o dev escrever objetivamente seu código.&lt;/li&gt;
&lt;li&gt;Null Safe: Kotlin é pensada para evitar NullPointerException. Para declarar null a uma variável é necessário definir que a aquela variável suporta null explicitamente.&lt;/li&gt;
&lt;li&gt;Propósito geral: Mobile cross-platform, server side, native (windows/linux/mac), web development, - Android, data Science&lt;/li&gt;
&lt;li&gt;Interopelabilidade: Roda em qualquer ambiente JVM, no Browser e no Android. Suporta código Java, então bibliotecas e frameworks Java podem ser usado em ambiente/projetos Kotlin&lt;/li&gt;
&lt;li&gt;Tool-friendly: Suportada nas principais IDEs, inclusive na linha de comando.&lt;/li&gt;
&lt;li&gt;Funcional/Orientad a objetos: Suporta os dois paradigmas&lt;/li&gt;
&lt;li&gt;Extension functions: É possível se extender funcionalidades de uma classe sem usar herança&lt;/li&gt;
&lt;li&gt;Suporte a imutabilidade: Objetos podem ser considerados imutáveis (não podem sofrer nova atribuição) e esse recurso é muito importante quando falamos de programação funcional.&lt;/li&gt;
&lt;li&gt;Linguagem concisa para criação de DSLs (Domain Specification Language)&lt;/li&gt;
&lt;li&gt;Suporta funções como cidadãos de primeira classe e função de ordem superior &lt;a href="https://leandromoh.gitbooks.io/tcc-paradigmas-de-programacao/5_paradigma_funcional/54_funcoes_de_primeira_classe_e_de_ordem_superior.html"&gt;explicação melhor sobre os temas&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Meu primeiro contato foi muito positivo com a linguagem e encontrei em Kotlin, recursos que sempre questionei porque o Java não tinha isso nativamente. Porém, entendo muito o dilema do Java de manter retrocompatibilidade, pensando no Enterprise que sempre foi o foco da linguagem. &lt;/p&gt;

&lt;p&gt;Construir uma linguagem sem essas amarras e dependências, permitiu a JetBrains a criar uma Java Clean e com práticas e decisões mais modernas. Eu não conheço C#, porém dizem que Kotlin tem muitas coisas boas que existem no C# nativamente. Acredito que toda ferramenta/linguagem que nasce depois, tem sempre a oportunidade de ser construída de maneira melhor e mais alinhada ao seu presente, que para linguagens mais antigas, teriam que tomar decisões de futuro para acertar o que temos hoje. Algumas coisas dão certo, outras não. Assim se caminha a humanidade, nada se cria, tudo se transforma, aprimora, evolui.&lt;/p&gt;

&lt;p&gt;A ciência é algo muito bonito. Vamos valorizar.&lt;/p&gt;

&lt;h2&gt;
  
  
  Outras Fontes:
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.treinaweb.com.br/blog/kotlin-a-nova-linguagem-oficial-para-desenvolvimento-android/"&gt;https://www.treinaweb.com.br/blog/kotlin-a-nova-linguagem-oficial-para-desenvolvimento-android/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.androidpro.com.br/blog/kotlin/kotlin/"&gt;https://www.androidpro.com.br/blog/kotlin/kotlin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://blog.matheuscastiglioni.com.br/comecando-com-kotlin/"&gt;https://blog.matheuscastiglioni.com.br/comecando-com-kotlin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://cafeinacodificada.com.br/kotlin/"&gt;https://cafeinacodificada.com.br/kotlin/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://en.wikipedia.org/wiki/Kotlin_(programming_language)"&gt;https://en.wikipedia.org/wiki/Kotlin_(programming_language)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>kotlin</category>
      <category>jvm</category>
    </item>
    <item>
      <title>Publicando pacotes privados do NPM no Nexus repository</title>
      <dc:creator>Mateus Malaquias</dc:creator>
      <pubDate>Tue, 23 Jun 2020 17:58:43 +0000</pubDate>
      <link>https://dev.to/collabcode/publicando-pacotes-privados-do-npm-no-nexus-repository-64l</link>
      <guid>https://dev.to/collabcode/publicando-pacotes-privados-do-npm-no-nexus-repository-64l</guid>
      <description>&lt;p&gt;Atualmente trabalho com JavaScript e Node.js em uma grande operadora daqui do Brasil e muitas de nossas soluções não podem estar públicas na internet por questões de segurança.&lt;/p&gt;

&lt;p&gt;No projeto que trabalho temos o costume de compartilhar módulos JavaScript entre microserviços para aumentar nossa produtividade.&lt;/p&gt;

&lt;p&gt;Isso no levou a desenvolver muitas libs internas, até então estávamos utilizando um gitlab interno como repositório de pacote para essas libs, mas o processo de governança e publicação não ficou muito bom.&lt;/p&gt;

&lt;p&gt;Por isso migramos para o Nexus Repository Manager (também conhecido como Nexus), que é um gerenciador de repositório de código aberto fornecido pelo Sonatype.&lt;/p&gt;

&lt;p&gt;A nossa intenção é continuar usando o NPM e tudo aquilo que a comunidade JavaScript pode nos oferecer de open-source. Combinando com nossas libs privadas do Nexus, além de conseguir utilizar de maneira decente um processo de controle de pacotes.&lt;/p&gt;

&lt;p&gt;Neste artigo vamos ver um resumo de porque escolhemos o Nexus como repositório privado, como configura-ló para funcionar com o NPM e como conseguir consumir os pacotes guardados no Nexus.&lt;/p&gt;

&lt;h2&gt;
  
  
  Por que não estamos usando os produtos do NPM?
&lt;/h2&gt;

&lt;p&gt;Bem, aqui a gente entra um pouco no processo de contratação de serviço da empresa, geralmente não se contrata ou compra serviços que vão atender a somente um time, como temos muitos projetos e muitos times trabalhando a empresa tenta contratar o serviço para o máximo de times possíveis.&lt;/p&gt;

&lt;p&gt;No momento que estou escrevendo esse artigo o NPM a nível enterprise que possuí toda a estrutura de serviços que uma grande corporação precisa está custando ao &lt;strong&gt;mês&lt;/strong&gt; 10 mil dólares.&lt;/p&gt;

&lt;p&gt;Com 10 mil dólares nosso time de DevOps é capaz de subir toda infraestrutura necessária, configurar backups regulares, camadas de segurança e ainda vai sobrar bastante dinheiro porque o Nexus pode atender diversas plataformas de programação.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F8500637b87f3392c96d166bfe967a419%2F0a3bd%2Fnexus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F8500637b87f3392c96d166bfe967a419%2F0a3bd%2Fnexus.png" alt="Nexus diagrama"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você só utiliza JavaScript em seus projetos e pode pagar pelos produtos oferecidos pelo NPM ou não possuiu um time que possa manter uma infraestrutura decente para você, recomendo optar pelo NPM.&lt;/p&gt;

&lt;h2&gt;
  
  
  O mínimo que você precisa saber para prosseguir
&lt;/h2&gt;

&lt;p&gt;O Nexus vai expor para você um repositório “publico” chamado &lt;code&gt;group&lt;/code&gt; que internamente é combinação do nosso repositório privado, ou seja, &lt;code&gt;hosted&lt;/code&gt; e um &lt;code&gt;proxy&lt;/code&gt; para o registro público do NPM.&lt;/p&gt;

&lt;p&gt;O proxy é extremamente importante se seu projeto precisa utilizar libs open source que estão hospedadas no NPM ou em qualquer outro repositório que não seja o teu Nexus.&lt;/p&gt;

&lt;p&gt;Por padrão sempre que a gente consumir um pacote publico o Nexus vai criar um cache para que a gente não precise acessar o NPM a todo momento por exemplo.&lt;/p&gt;

&lt;p&gt;No final de nossa configuração teremos a seguinte somatória &lt;code&gt;group = hosted + proxy&lt;/code&gt; e nosso fluxo de uso será sempre baixar os pacotes do &lt;code&gt;group&lt;/code&gt; e fazer uploads para o &lt;code&gt;hosted&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fac29c7b8bff154b3ab7ea41ab014fdc8%2F3fc71%2Fnexus-repositories.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fac29c7b8bff154b3ab7ea41ab014fdc8%2F3fc71%2Fnexus-repositories.png" alt="Nexus Repositorios"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No fim, vamos arregaçar um pouco as mangas e entender.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um repositório Host
&lt;/h2&gt;

&lt;p&gt;Repositórios hospedados são os repositórios particulares que criamos para armazenar nossos pacotes particulares. O que torna esses repositórios privados é a incapacidade de ler o conteúdo desses repositórios sem um authToken. Veremos isso em um exemplo no final do artigo.&lt;/p&gt;

&lt;p&gt;Para criar um repositório do tipo &lt;code&gt;hosted&lt;/code&gt; vá em &lt;code&gt;Settings =&amp;gt; Repository =&amp;gt; Repositories =&amp;gt; Create Repository&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Depois de clicar em &lt;strong&gt;Create Repository&lt;/strong&gt; o Nexus vai nos exibir uma quantidade enorme de plataformas que gerenciam dependências. Se for sua primeira vez usando Nexus, aproveite a oportunidade para da uma explorada no que a plataforma pode te oferecer.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Ffae6124cc16421c195fa8f02bb06322f%2F3fc71%2Fnexus-npm-all.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Ffae6124cc16421c195fa8f02bb06322f%2F3fc71%2Fnexus-npm-all.png" alt="Nexus Repositorios"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dessa lista vamos focar no &lt;strong&gt;npm&lt;/strong&gt;, o primeiro repositório que vamos será &lt;code&gt;npm(hosted)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na tela de criação o Nexus vai nos solicitar um nome &lt;strong&gt;único&lt;/strong&gt; e em storage vamos guardar os nossos artefatos.&lt;/p&gt;

&lt;p&gt;E é isso, basta clicar no botão &lt;strong&gt;Create Repository&lt;/strong&gt; para finalizar.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F5e9805b65f6b3cdf0dd3f7b7e55e65db%2F3fc71%2Fnexus-npm-private.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F5e9805b65f6b3cdf0dd3f7b7e55e65db%2F3fc71%2Fnexus-npm-private.png" alt="Nexus NPM Private"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando um proxy e grupo do NPM
&lt;/h2&gt;

&lt;p&gt;Volte novamente para &lt;code&gt;Repository =&amp;gt; Repositories =&amp;gt; Create Repository&lt;/code&gt;, para criamos um novo repositório do tipo &lt;code&gt;npm(proxy)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Na tela de configuração nos vamos especificar que queremos nos comunicar com o NPM no campo &lt;strong&gt;Proxy Location&lt;/strong&gt; adicionando a URL &lt;code&gt;https://registry.npmjs.org&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fc12f87dca1268a148a2f79a16dddb5a2%2F3fc71%2Fnexus-npm-proxy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fc12f87dca1268a148a2f79a16dddb5a2%2F3fc71%2Fnexus-npm-proxy.png" alt="Nexus NPM Proxy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Com os repositórios &lt;code&gt;npm(hosted) e npm(proxy)&lt;/code&gt; criados, podemos finalmente criar o &lt;code&gt;npm(group)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;O fluxo de configurações é igual aos anteriores, coloque um nome e informe o mesmo store utilizado em &lt;code&gt;npm(hosted) e npm(proxy)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Além disso precisamos selecionar os usuários ou grupos que podem acessar o repositório &lt;code&gt;npm(group)&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F2880df6b01d449b7a6b207ed5ac2852d%2F3fc71%2Fnexus-npm-group.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F2880df6b01d449b7a6b207ed5ac2852d%2F3fc71%2Fnexus-npm-group.png" alt="Nexus NPM Group"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Enviando pacotes para o Nexus
&lt;/h2&gt;

&lt;p&gt;Agora que estamos prontos com os repositórios criados, podemos configurar nossos projetos.&lt;/p&gt;

&lt;p&gt;Para publicar um artefato no Nexus, precisamos alterar o arquivo &lt;strong&gt;package.json&lt;/strong&gt; adicionando um objeto chamado &lt;strong&gt;publishConfig&lt;/strong&gt; que vai guardar a &lt;strong&gt;URL&lt;/strong&gt; do nosso repositório &lt;strong&gt;privado&lt;/strong&gt;.&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

{
  "name": "@ms-ott/tools",
  "version": "2.0.4",
  "description": "Common and helpers tools to create microservices APIs",
  "main": "src/index.js",
  "publishConfig": {
    "registry": "https://meu.dominio.com/repository/npm-private/"
  },
  "scripts": {
    "lint": "eslint \"{src,apps,libs,test}/**/*.js\" --fix",
    "test": "jest",
    "test:watch": "jest --watch",
    "test:cov": "jest --coverage"
  },
  "devDependencies": {
    "eslint": "^5.16.0",
   "eslint-plugin-import": "^2.16.0",
    "eslint-plugin-prettier": "^3.0.1",
    "jest": "^24.7.1",
    "prettier": "^1.16.4"
  },
  "dependencies": {
    "aws-sdk": "^2.263.1",
    "dotenv": "^5.0.1",
    "dynamoose": "^1.7.3",
    "joi": "^13.4.0",
    "jsonwebtoken": "^8.5.1",
    "node-cache": "^4.2.0",
    "restify-cors-middleware": "^1.1.1",
    "restify-errors": "^8.0.1",
    "uuid": "^3.3.3",
    "request": "^2.83.0",
    "request-ip": "^2.1.3",
    "winston": "^3.2.1"
  }
}


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

&lt;/div&gt;

&lt;p&gt;Com o &lt;strong&gt;package.json&lt;/strong&gt; configurado, agora precisamos fazer um login no npm cli apontando o &lt;strong&gt;registry&lt;/strong&gt; para o nosso domínio:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;npm login —registry=https://meu.dominio.com/repository/npm-private/&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Digite seu usuário e senha do nexus e pronto. 🧞&lt;/p&gt;

&lt;p&gt;Agora basta executar o comando: &lt;code&gt;npm publish&lt;/code&gt; .&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F1df35565a23c8d3b2174f19faa7bc013%2Fe7746%2Fnpm-publish-command.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F1df35565a23c8d3b2174f19faa7bc013%2Fe7746%2Fnpm-publish-command.png" alt="NPM Publish"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se tudo deu certo você vai conseguir verificar sua lib hospedado acessando o repositório privado.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F8088d13e87d13adf8e992b38b05ad219%2F3fc71%2Fverificando-lib-repo-nexus.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F8088d13e87d13adf8e992b38b05ad219%2F3fc71%2Fverificando-lib-repo-nexus.png" alt="Verificando lib no Nexus"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Baixando seus pacotes do Nexus
&lt;/h2&gt;

&lt;p&gt;Agora que publicamos nossa lib no Nexus, vamos consumi-la em outros projetos.&lt;/p&gt;

&lt;p&gt;Precisamos adicionar um arquivo &lt;strong&gt;.npmrc&lt;/strong&gt; no projeto, para evitar que toda pessoa desenvolvedora do time precise fazer um npm login apontando o registry para o Nexus.&lt;/p&gt;

&lt;p&gt;O arquivo &lt;strong&gt;.npmrc&lt;/strong&gt; vai guardar tanto a URL do Nexus como um authToken com permissão de acesso.&lt;/p&gt;

&lt;h4&gt;
  
  
  Como boa prática, recomendo que você possua configurado em seu Nexus um usuário com permissão de somente leitura que possa ser usado para um fluxo de CI/CD e que você possa deixar o arquivo .npmrc versionado.
&lt;/h4&gt;

&lt;p&gt;Para gerar o authToken você pode usar o comando abaixo:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;echo -n 'registryuser:registrypassword' | openssl base64&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Com o authToken em mãos, basta criar o arquivo como no modelo abaixo:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;registry=&lt;a href="https://meu.dominio/repository/npm-group" rel="noopener noreferrer"&gt;https://meu.dominio/repository/npm-group&lt;/a&gt;&lt;br&gt;
always-auth=true&lt;br&gt;
_auth=bWF0ZXVzLm1hbGFxdWlhczoxMjM0NTY=&lt;/p&gt;

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

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Bônus: Usando Jenkins com Nexus&lt;br&gt;
&lt;/h2&gt;

&lt;p&gt;Se você assim como eu, possui um Jenkins privado e deseja que o teu fluxo de publicação seja automatizado. O código abaixo possui o mínimo necessário para publicar nossas libs usando o Jenkins.&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;pipeline {&lt;br&gt;
    agent any&lt;br&gt;
    tools{nodejs "node”}&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;environment {
    REGISTRY_URL = "http://localhost:8081/repository/malaquias-npm-private/“
    REGISTRY_USER_EMAIL = "malaquiasdev@gmail.com”
    NPM_TOKEN = "bnBtdXNlcjpWbnRlaG1fMDU=“
}

stages {
    stage('Git Checkout') {
        steps {
            git 'https://gitlab.com/malaquiasdev/nexus-study.git'
        }
    }

    stage('Publish to Nexus') {
        steps {
            sh ‘ls'
            sh 'echo -e "registry=${REGISTRY_URL}\nemail=${REGISTRY_USER_EMAIL}\nalways-auth=true\n_auth=${NPM_TOKEN}" &amp;amp;gt;&amp;amp;gt; .npmrc’
            sh 'npm publish'
        }
    }
}
&lt;/code&gt;&lt;/pre&gt;

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

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

&lt;p&gt;Nesse artigo pincelei um fluxo básico de como publicar e consumir libs privadas usando o Nexus Repository.&lt;/p&gt;




&lt;h2&gt;
  
  
  Finalizando...
&lt;/h2&gt;

&lt;p&gt;Se você gostou desse post, por favor não deixe de dar um like e compartilhar 😄&lt;/p&gt;

&lt;p&gt;Se quiser saber o que ando fazendo por ai ou tirar alguma dúvida fique a vontade para me procurar nas redes sociais como @ &lt;a href="https://twitter.com/malaquiasdev" rel="noopener noreferrer"&gt;malaquiasdev&lt;/a&gt; .&lt;/p&gt;

&lt;p&gt;Para ler mais post meus acesse &lt;a href="http://malaquias.dev/" rel="noopener noreferrer"&gt;MalaquiasDEV | A Vida, o código e tudo mais&lt;/a&gt; .&lt;/p&gt;

</description>
      <category>npm</category>
      <category>node</category>
      <category>devops</category>
    </item>
    <item>
      <title>O Guia dos Serverless das Galáxias #3 - Entendendo o ciclo de vida de uma função lambda</title>
      <dc:creator>Mateus Malaquias</dc:creator>
      <pubDate>Tue, 05 May 2020 13:16:03 +0000</pubDate>
      <link>https://dev.to/collabcode/o-guia-dos-serverless-das-galaxias-3-entendendo-o-ciclo-de-vida-de-uma-funcao-lambda-3jac</link>
      <guid>https://dev.to/collabcode/o-guia-dos-serverless-das-galaxias-3-entendendo-o-ciclo-de-vida-de-uma-funcao-lambda-3jac</guid>
      <description>&lt;p&gt;Quando a gente cria ou atualiza uma função, na maioria dos casos, esse processo é muito rápido e as nossas funções estão prontas para executar quase que imediatamente. &lt;/p&gt;

&lt;p&gt;No entanto, existem situações em que esses processos podem levar mais tempo.&lt;/p&gt;

&lt;p&gt;Neste post, vamos entender os estados de uma função, as condições de cada estado e como ocorre a transição entre eles.&lt;/p&gt;

&lt;h2&gt;
  
  
  Estados de uma função
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Pendente
&lt;/h3&gt;

&lt;p&gt;É o primeiro estado pelo qual todas as funções passam quando são criadas. A função se mantém nesse estado durante um processo de deploy ou durante a configuração de todos os recursos externos necessários. &lt;/p&gt;

&lt;p&gt;Tenha sempre em mente que só é possível executar uma função quando o seu estado é &lt;strong&gt;Ativo&lt;/strong&gt;, portanto, qualquer invocação nesse momento irá falhar. &lt;/p&gt;

&lt;h3&gt;
  
  
  Ativo
&lt;/h3&gt;

&lt;p&gt;Alcançado após a conclusão de qualquer deploy com sucesso, configuração ou alocação de recursos durante a criação ou atualização de uma função. &lt;/p&gt;

&lt;p&gt;É importante ter em mente que as funções só podem ser invocadas nesse estado. Por isso que durante uma atualização, o estado permanece como ativo. &lt;/p&gt;

&lt;p&gt;Durante um processo de atualização todas as invocações irão ser executadas utilizando os códigos e as configurações anteriores até que o processo seja concluído com sucesso.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falha
&lt;/h3&gt;

&lt;p&gt;É o estado que representa algo que deu errado na configuração ou no provisionamento de recursos externos.&lt;/p&gt;

&lt;h3&gt;
  
  
  Inativo
&lt;/h3&gt;

&lt;p&gt;Inativo, onde acontece o famoso "cold start" é o estado de uma função quando ela fica sem ser executada por um determinado período de tempo ou quando a função precisa escalar rapidamente para atender muitas chamadas concorrentes. &lt;/p&gt;

&lt;p&gt;Esse estado existe para baratear os custos de infraestrutura do serviços, quando a função entra nesse estado todos os recursos externos que foram configurados para ela são removidos. &lt;/p&gt;

&lt;h2&gt;
  
  
  Estados de uma função durante uma atualização
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Em progresso
&lt;/h3&gt;

&lt;p&gt;Significa que uma atualização está acontecendo. Enquanto uma função está nesse sub estado, todas as invocação são realizadas nos códigos e configurações já existentes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Bem sucedido
&lt;/h3&gt;

&lt;p&gt;A atualização foi concluída.&lt;/p&gt;

&lt;h3&gt;
  
  
  Falhou
&lt;/h3&gt;

&lt;p&gt;A atualização da função falhou, todas as alterações são abortadas. Tanto o código como a configuração anterior permanecem no estado ativo e disponíveis.&lt;/p&gt;

&lt;p&gt;Outro ponto importante durante o processo é que as funções só podem ser atualizadas se estiverem no estado &lt;strong&gt;Ativo&lt;/strong&gt; ou &lt;strong&gt;Inativo&lt;/strong&gt;. Os comandos de atualização emitidos nas funções que não estão nesses estados falharão.&lt;/p&gt;

&lt;h2&gt;
  
  
  Ciclos de Vida dos Estados de uma função
&lt;/h2&gt;

&lt;p&gt;Como não conseguimos mover manualmente uma função entre os seus estados, a transição entre os estados acaba dependendo das ações que executamos diretamente sobre as funções.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmxw2tgnsiilkruk2cz2o.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fmxw2tgnsiilkruk2cz2o.png" alt="Fluxograma do ciclo de vida de uma função" width="800" height="435"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para todas as funções, o ciclo de vida do estado primário se parece com o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Ao criar uma função, ela começa no estado &lt;strong&gt;Pendente&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;  Após a configuração de todos os recursos necessários com sucesso, o estado passa a ser &lt;strong&gt;Ativo&lt;/strong&gt;;

&lt;ul&gt;
&lt;li&gt;  Se a configuração de recurso ou função falhar por qualquer motivo, ela passará para o estado de &lt;strong&gt;Falha&lt;/strong&gt;;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;  Se uma função não for executado durante um período de tempo, ela entrará no estado &lt;strong&gt;Inativo&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;  Na primeira chamada após ficar &lt;strong&gt;Inativo&lt;/strong&gt;, uma função entra novamente no estado &lt;strong&gt;Pendente&lt;/strong&gt;;

&lt;ul&gt;
&lt;li&gt;  Êxito define o estado como &lt;strong&gt;Ativo&lt;/strong&gt; novamente;&lt;/li&gt;
&lt;li&gt;  Falha define o estado de volta para &lt;strong&gt;Inativo&lt;/strong&gt;;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;  Uma atualização com sucesso, também define o estado de volta para &lt;strong&gt;Ativo&lt;/strong&gt;;&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  Ciclo de vida de uma função durante o processo de atualização
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9zfupee8pgt7xzx7kgj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fi%2Fv9zfupee8pgt7xzx7kgj.png" alt="Fluxograma do ciclo de vida de uma função durante o processo de atualização" width="800" height="496"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para atualizar funções, o ciclo de vida é o seguinte:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;  Na atualização, o estado de atualização é definido como &lt;strong&gt;Em Progresso&lt;/strong&gt;;

&lt;ul&gt;
&lt;li&gt;  Êxito define o estado como &lt;strong&gt;Bem Sucedido&lt;/strong&gt;;&lt;/li&gt;
&lt;li&gt;  Uma falha define como &lt;strong&gt;Falha&lt;/strong&gt; mesmo;&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;
&lt;li&gt;  Uma função &lt;strong&gt;inativa&lt;/strong&gt; voltará ao estado ativo com uma atualização &lt;strong&gt;bem sucedida&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;Na AWS (provedor de cloud que tenho mais contato) todas as funções mostrarão apenas um estado &lt;strong&gt;Ativo&lt;/strong&gt; no painel web. Você não verá uma transição de estado para &lt;strong&gt;Pendente&lt;/strong&gt; por exemplo. Mas dá para consultar o estado atual da função usando os SDKs da AWS e a CLI da AWS mais recentes (versão 1.16.291 ou superior).&lt;/p&gt;




&lt;h2&gt;
  
  
  Finalizando…
&lt;/h2&gt;

&lt;p&gt;Se você gostou desse post não esquece de dar um like e compartilhar 😄&lt;/p&gt;

&lt;p&gt;Se quiser saber o que ando fazendo por ai ou tirar alguma dúvida fique a vontade para me procurar nas redes sociais como @ &lt;a href="https://twitter.com/malaquiasdev"&gt;malaquiasdev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para ler mais post meus acesse &lt;a href="http://malaquias.dev"&gt;MalaquiasDEV | A Vida, o código e tudo mais&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>aws</category>
      <category>serverless</category>
      <category>cloud</category>
      <category>devops</category>
    </item>
    <item>
      <title>Arrow function do JavaScript, feliz e simples?</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Thu, 20 Feb 2020 17:18:04 +0000</pubDate>
      <link>https://dev.to/collabcode/arrow-function-e-feliz-e-simples-4gjo</link>
      <guid>https://dev.to/collabcode/arrow-function-e-feliz-e-simples-4gjo</guid>
      <description>&lt;p&gt;Quando vi a primeira vez a &lt;em&gt;arrow function&lt;/em&gt; não fiquei muito feliz, principamente porque eu achava ela muito mais complicada de ler, quero te mostrar que o Marco do passado estava errado e que você pode ser muito feliz com a &lt;em&gt;arrow function&lt;/em&gt;.&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/3EkS9-P3cIM"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Ah! Estou considerando que você já sabe o que é uma &lt;em&gt;function expression&lt;/em&gt;. Se não sabe, recomendo você dar uma lida sobre ela na MDN (Mozilla Developer Network): &lt;a href="http://bit.ly/function-expression"&gt;Function Expression na MDN&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Como funciona a Arrow function?
&lt;/h1&gt;

&lt;p&gt;A &lt;strong&gt;arrow function&lt;/strong&gt; tem uma forma mais simples de escrita do que a &lt;em&gt;function expression&lt;/em&gt;, por exemplo, se pegarmos a função a seguir que está com &lt;em&gt;function expression&lt;/em&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;E transformar ela em uma &lt;strong&gt;arrow function&lt;/strong&gt;, fica assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O que conseguimos aprender observando os dois códigos, anteriores? Que a &lt;em&gt;arrow function&lt;/em&gt; é por padrão uma função anônima, mas conseguimos definir um nome para ela, usando a &lt;code&gt;const sum&lt;/code&gt; que recebeu a nossa &lt;em&gt;arrow function&lt;/em&gt;. Isso é realmente importante, você não consegue definir um nome para uma &lt;em&gt;arrow function&lt;/em&gt; como fazemos na &lt;em&gt;function expression&lt;/em&gt;, onde informamos o nome da função usando &lt;code&gt;sum&lt;/code&gt; antes dos parênteses.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Não tente isso, não funciona!!! Arrow functions são anônimas&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="cm"&gt;/* Erro que você receberá:
SyntaxError: invalid arrow-function arguments (parentheses around the arrow-function may help)
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h1&gt;
  
  
  Outras variações da Arrow Function
&lt;/h1&gt;

&lt;p&gt;A sintaxe que acabamos de ver da &lt;em&gt;arrow function&lt;/em&gt; (a que funciona 😉), não é a única forma de usar ela, vamos ver outras variações a seguir. &lt;/p&gt;

&lt;h2&gt;
  
  
  Sem return mas retorna
&lt;/h2&gt;

&lt;p&gt;Mesmo sem usar &lt;code&gt;return&lt;/code&gt; dentro de uma &lt;em&gt;arrow function&lt;/em&gt; conseguimos retorna a soma, para isso nós precisaremos retirar as duas chaves e &lt;code&gt;return&lt;/code&gt; da nossa &lt;em&gt;arrow function&lt;/em&gt;, deixando o código assim:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: 4&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;É mais simples! Mas será que é mais legível? Para mim não foi no começo, mas agora que já me acostumei com a &lt;em&gt;arrow function&lt;/em&gt; está realmente simples e feliz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sem parâmetros
&lt;/h2&gt;

&lt;p&gt;Quando você não tem parâmetro na &lt;em&gt;arrow function&lt;/em&gt; os parênteses permanecem:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CollabCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você quer dar um nome para uma &lt;em&gt;arrow function&lt;/em&gt; é só criar a &lt;code&gt;const&lt;/code&gt; como fizemos anteriormente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;comunidade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;CollabCode&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Só um parâmetro
&lt;/h2&gt;

&lt;p&gt;Quando você tem apenas um parâmetro os parênteses se tornam opcionais:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você gosta muito dos parênteses não tem problema pode usar eles também:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;double&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Dois ou mais parâmetros
&lt;/h2&gt;

&lt;p&gt;Quando temos dois ou mais parâmetros em uma &lt;em&gt;arrow function&lt;/em&gt; o uso dos parênteses se tornam obrigatório:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: 40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Arrow function com chaves
&lt;/h2&gt;

&lt;p&gt;Toda vez que você usa as chaves em uma &lt;em&gt;arrow function&lt;/em&gt; ela perde o poder de retornar algo sem a necessidade de escrever &lt;code&gt;return&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: undefined&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Então, caso você tenha que usar as chaves na &lt;em&gt;arrow function&lt;/em&gt; e também retornar algo, é necessário usar &lt;code&gt;return&lt;/code&gt;, como no código a seguir:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;sum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;number1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; 
  &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;number1&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;number2&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt; &lt;span class="c1"&gt;// saída: 40&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Retornando um JSON sem return
&lt;/h2&gt;

&lt;p&gt;Quando você quer retornar um &lt;em&gt;&lt;a href="https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON"&gt;JSON (JavaScript Object Notation)&lt;/a&gt;&lt;/em&gt; mas sem usar &lt;code&gt;return&lt;/code&gt; é necessário você envolver o JSON por parênteses:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;getPessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt;&lt;span class="na"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Gabe&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;eye&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;blue&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;});&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;getPessoa&lt;/span&gt;&lt;span class="p"&gt;());&lt;/span&gt; &lt;span class="c1"&gt;// saída: Object { name: "Gabe", eye: "blue" }&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  IIFE com arrow function
&lt;/h2&gt;

&lt;p&gt;Quando queremos fechar o escopo de um arquivo, em alguns casos usamos uma função anônima que ela mesmo se executa apenas uma vez, chamamos isso de IIFE (Immediately-invoked function expression). Com a &lt;em&gt;function expression&lt;/em&gt; podemos criar a IIFE de duas maneiras:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="c1"&gt;// Seu código que não vazará o arquivo!!!&lt;/span&gt;
&lt;span class="p"&gt;}());&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;A segunda forma de gerar a IIFE é bem similar a primeira o que muda são os parênteses &lt;code&gt;()&lt;/code&gt; no final.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;(){&lt;/span&gt;
&lt;span class="c1"&gt;// Seu código que não vazará o arquivo!!!&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Você também pode fazer isso usando &lt;em&gt;arrow function&lt;/em&gt;, mas só tem uma forma de fazer isso:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// Seu código que não vazará o arquivo!!!&lt;/span&gt;
&lt;span class="p"&gt;})();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A forma a seguir não funciona&lt;/strong&gt;&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;span class="c1"&gt;// Seu código que não vazará o arquivo!!!&lt;/span&gt;
&lt;span class="p"&gt;}());&lt;/span&gt;

&lt;span class="cm"&gt;/* Erro que você recebe:
SyntaxError: missing ) in parenthetical
*/&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  O this é muito mas muito mais simples
&lt;/h2&gt;

&lt;p&gt;O &lt;code&gt;this&lt;/code&gt; da &lt;em&gt;arrow function&lt;/em&gt; é muito mais previsível do que o da &lt;em&gt;function expression&lt;/em&gt;, acredito que essa é a coisa mais feliz dela.&lt;/p&gt;

&lt;p&gt;A seguir tem uma &lt;em&gt;function expression&lt;/em&gt; chamada &lt;code&gt;Person&lt;/code&gt; (Pessoa) e dentro dela temos &lt;code&gt;this.age&lt;/code&gt; (&lt;code&gt;age&lt;/code&gt; é idade) que começa com &lt;code&gt;0&lt;/code&gt;, a cada 1 segundo ela ficará mais velha. Usamos o método &lt;code&gt;setInterval&lt;/code&gt; que nós permite executar uma função a cada 1000 milesegundos (você pode mudar os milesegundos), o primeiro parâmentro da &lt;code&gt;setInterval&lt;/code&gt; é a função que será executada e o segundo parâmetro é o tempo do intervalo.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// O this perde o escopo e referência Window&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando o código acima você receberá uma saída similar no seu console:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Window about:privatebrowsing
Window about:privatebrowsing
Window about:privatebrowsing
Window about:privatebrowsing
Window about:privatebrowsing
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você vem de outras linguagens você achará estranho esse comportamento do &lt;code&gt;this&lt;/code&gt; no JavaScript, antes de existir a &lt;em&gt;arrow function&lt;/em&gt; nós resolvimos esse tipo de problema criando uma variável chamada &lt;code&gt;that&lt;/code&gt; e atribuímos a ela o &lt;code&gt;this&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;that&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;that&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;that&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;that&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; 
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;that&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// O this perde o escopo e referência Window&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando o código com o &lt;code&gt;that&lt;/code&gt; você terá a seguinte saída no terminal:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Object &lt;span class="o"&gt;{&lt;/span&gt; age: 1 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 2 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 3 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 4 &lt;span class="o"&gt;}&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Aqui vem o momento feliz da sua vida, com a &lt;em&gt;arrow function&lt;/em&gt; o comportamento do &lt;code&gt;this&lt;/code&gt; fica mais previsível e o código muito mais simples, ela tem um &lt;code&gt;this&lt;/code&gt; léxico, isso significa que o &lt;code&gt;this&lt;/code&gt; não é alterado de forma dinâmica respeitando o escopo de onde ele foi criado:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

  &lt;span class="nx"&gt;setInterval&lt;/span&gt;&lt;span class="p"&gt;(()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;age&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;},&lt;/span&gt; &lt;span class="mi"&gt;1000&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;person&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;Person&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Execute o código e você terá a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Object &lt;span class="o"&gt;{&lt;/span&gt; age: 1 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 2 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 3 &lt;span class="o"&gt;}&lt;/span&gt;
Object &lt;span class="o"&gt;{&lt;/span&gt; age: 4 &lt;span class="o"&gt;}&lt;/span&gt;
...
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você sentiu falta de algum assunto no post ou discorda de algo que escrevi, não deixe de falar nos comentários, eu gosto muito de feedback, principalmente os negativos que nos fazem evoluir.&lt;/p&gt;

&lt;p&gt;Ah! Caso você queira tirar dúvidas de JavaScript cola aí na comunidade CollabCode no Discord: &lt;a href="http://bit.ly/discord-collabcode"&gt;Link do Discord da CollabCode&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Referências de estudo:
&lt;/h1&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://developer.mozilla.org/pt-BR/docs/Web/JavaScript/Reference/Functions/Arrow_functions"&gt;Arrow function MDN&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.freecodecamp.org/news/when-and-why-you-should-use-es6-arrow-functions-and-when-you-shouldnt-3d851d7f0b26/"&gt;When (and why) you should use ES6 arrow functions — and when you shouldn’t&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Como funciona o var, let e const do JavaScript?</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Thu, 20 Feb 2020 12:31:25 +0000</pubDate>
      <link>https://dev.to/collabcode/como-funciona-o-var-let-e-const-do-javascript-178p</link>
      <guid>https://dev.to/collabcode/como-funciona-o-var-let-e-const-do-javascript-178p</guid>
      <description>&lt;p&gt;A primeira forma que eu aprendi a declarar uma variável foi utilizando a &lt;code&gt;var&lt;/code&gt;,  mas faz algum tempo que temos outras duas formas para declararmos as nossas variáveis com &lt;strong&gt;JavaScript&lt;/strong&gt; que são utilizando as palavras &lt;code&gt;const&lt;/code&gt; e &lt;code&gt;let&lt;/code&gt;. Bora entender no código como funcionam essas três formas de escrever uma variável com JavaScript!&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/EFoEqHIwxqY"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;O problema que temos com a variável &lt;code&gt;var&lt;/code&gt; é que ela tem um pequeno problema de escopo. Vamos entender isso melhor com um exemplo prático:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Minha idade é:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você executar esse código tanto em cima da plataforma NodeJS ou abrindo no seu browser(navegador) favorito. Você terá a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Minha idade é: 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora onde está o problema de escopo que eu comentei? Para entendermos isso, colocaremos estas duas linhas que escrevemos, dentro de uma função chamada &lt;code&gt;imprimeIdade&lt;/code&gt; e depois executaremos ela:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Minha idade é:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mesmo com esse código não temos problema de escopo. Se você executar o código acima no seu browser ou no NodeJS você terá a seguinte saída:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Minha idade é: 30
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora o que deverá acontecer se colocarmos o &lt;code&gt;console.log&lt;/code&gt; fora da nossa função &lt;code&gt;imprimeIdade&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Minha idade é:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você está esperando receber um erro na execução desse código, você está certo. Executando o código você receberá um erro similar a este:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/Users/marcobruno/Desktop/index.js:7
console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Minha idade é:'&lt;/span&gt;, idade&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                              ^
ReferenceError: idade is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mas pera lá, eu disse que o &lt;code&gt;var&lt;/code&gt; tem um problema de escopo. Sim ele tem, mas esse problema de escopo não acontece dentro de uma função. Dentro dela o escopo funciona como o esperado que é a variável só existir dentro das chaves da função. Agora quando criamos uma variável utilizando o &lt;code&gt;var&lt;/code&gt; dentro de um &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;for&lt;/code&gt; ou &lt;code&gt;while&lt;/code&gt; essa variável irá vazar o escopo:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade dentro do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade fora do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Pelo que aprendemos em lógica de programação nós deveriamos receber um erro na linha que utilizamos o &lt;code&gt;console.log&lt;/code&gt; porque a variável idade foi criada dentro do escopo do &lt;code&gt;for&lt;/code&gt;, mas ao invés disso não temos nenhum erro e nosso &lt;code&gt;console.log&lt;/code&gt; executa sem problema nenhum após a execução do nosso loop &lt;code&gt;for&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 30
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 31
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 32
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 33
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 34
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 35
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 36
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 37
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 38
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 39
Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 40
Idade fora &lt;span class="k"&gt;do for&lt;/span&gt;: 41
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se você precisar que a variável idade se comporte como o esperado, você pode trocar o &lt;code&gt;var&lt;/code&gt; por &lt;code&gt;let&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade dentro do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade fora do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Agora com esse código nós recebemos uma mensagem de erro, como é o esperado dado o que estudamos em lógica de programação:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/Users/marcobruno/Desktop/index.js:6
  console.log&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'Idade fora do for:'&lt;/span&gt;, idade&lt;span class="o"&gt;)&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
                                    ^
  ReferenceError: idade is not defined
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Por a &lt;code&gt;let&lt;/code&gt; ter um comportamento mais previsível, nós evitamos ao máximo o uso da var. Portanto podemos concluir que a &lt;code&gt;let&lt;/code&gt; é uma variável que podemos atribuir um novo valor para ela e a mesma não tem o problema de escopo como apresentado em variáveis que são criadas com a &lt;code&gt;var&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;E a &lt;code&gt;const&lt;/code&gt; como ela funciona? Ela também não tem o problema de escopo mas você também não pode atribuir um novo valor para uma variável criada com &lt;code&gt;const&lt;/code&gt;. Bora ver na prática o que acontece quando tentamos alterar o valor de uma variável que foi criada com &lt;code&gt;const&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;function&lt;/span&gt; &lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;=&lt;/span&gt; &lt;span class="mi"&gt;40&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="o"&gt;++&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade dentro do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;  

  &lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade fora do for:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="nx"&gt;imprimeIdade&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;No momento que você tentar executar o código acima receberá o seguinte erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;Idade dentro &lt;span class="k"&gt;do for&lt;/span&gt;: 30
/Users/marcobruno/Desktop/index.js:2
  &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;const idade &lt;span class="o"&gt;=&lt;/span&gt; 30&lt;span class="p"&gt;;&lt;/span&gt; idade &amp;lt;&lt;span class="o"&gt;=&lt;/span&gt; 40&lt;span class="p"&gt;;&lt;/span&gt; idade++&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
                                           ^
TypeError: Assignment to constant variable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;O erro que estamos recebendo diz que não podemos atribuir um novo valor para uma variável que foi criada com a &lt;code&gt;const&lt;/code&gt; o que torna o comportamento dela muito mais previsível, já que o valor atribuído à ela não pode mudar. Por estes motivos procuramos sempre utilizar a &lt;code&gt;const&lt;/code&gt; para criarmos as nossas variáveis e uma vez que recebemos o erro acima verificamos se realmente temos a necessidade de atribuir um novo valor à varíavel. Se isso for verdade, trocamos o const para &lt;code&gt;let&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Vamos ver mais um exemplo com a &lt;code&gt;const&lt;/code&gt;. No código a seguir vamos criar um variável chamada pessoa que receberá como valor um JSON com duas propriedades: nome e idade. Depois vamos tentar mudar o valor que setamos inicialmente:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Henri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Luna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Executando esse código iremos receber o seguinte erro:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;/Users/marcobruno/Desktop/medium/index.js:6
pessoa &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
       ^
TypeError: Assignment to constant variable.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Como vimos anteriormente não podemos atribuir um novo valor para uma &lt;code&gt;const&lt;/code&gt;. Por outro lado conseguimos alterar o valor das propriedades do objeto da seguinte forma:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;pessoa&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Henri&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;20&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;

&lt;span class="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Luna&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idade&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;19&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Nome:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;nome&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="nx"&gt;console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Idade:&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;pessoa&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;idade&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Portanto não podemos passar uma nova atribuição para uma const, mas podemos alterar as propriedades do objeto que definimos na const pessoa.&lt;/p&gt;

&lt;p&gt;Espero que tenha ficado claro como funciona as três formas de variáveis do JavaScript. Se quer estudar ainda mais sobre JavaScript, recomendo você entrar na comunidade CollabCode no Discord: &lt;a href="http://bit.ly/discord-collabcode"&gt;http://bit.ly/discord-collabcode&lt;/a&gt;&lt;/p&gt;

</description>
      <category>javascript</category>
      <category>node</category>
    </item>
    <item>
      <title>Tmux para iniciantes</title>
      <dc:creator>Mateus Malaquias</dc:creator>
      <pubDate>Sun, 26 Jan 2020 13:55:54 +0000</pubDate>
      <link>https://dev.to/collabcode/tmux-para-iniciantes-4kg8</link>
      <guid>https://dev.to/collabcode/tmux-para-iniciantes-4kg8</guid>
      <description>&lt;p&gt;Conheci o tmux na época em que tentei dar uma nova função para o meu IPad, a de ser uma máquina capaz de me permitir codar (é possível fazer isso com um Surface Pro). Para tentar derrubar as limitações impostas na época pelo IOS tentei usar editor de texto, acessar um Raspberry Pie, até que cheguei a brilhante ideia (ironia) de criar um servidor EC2 na AWS e acessar ele via SSH.&lt;/p&gt;

&lt;p&gt;Bem, a ideia do IPad ficou para trás e enterrei bem fundo, porém todo esse período de experimentos me levou a conhecer melhor três ferramentas: terminal, vim e tmux. Adorei o novo costume que desenvolvi e levei para usar também no ambiente de trabalho.&lt;/p&gt;

&lt;p&gt;Você pode até achar feio, verboso, complexo, improdutivo, mas para o meu raciocínio foi algo como “WTF, o que está acontecendo? De onde veio todo esse foco no código e na atividade?&lt;/p&gt;

&lt;p&gt;E foi assim que descobrir um novo caminho para minha mente brilhar!&lt;/p&gt;

&lt;p&gt;Esse texto vai lhe levar em um tour de poucos minutos no uso do tmux e suas possibilidades. Se você tem um tempinho livre, peço então humildemente que me dê a honra de lhe ensinar o pouco que sei sobre o tmux, continue lendo!&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é tmux e quais os seus benefícios?
&lt;/h2&gt;

&lt;p&gt;Os criadores do tmux o descrevem como um multiplicador de terminal, ou seja, dentro de uma janela do terminal, você pode abrir várias janelas com visualizações baseadas em painéis. Onde cada painel tem um terminal executando de maneira independente, isso permite que você tenha vários comandos e aplicativos executando, sem a necessidade de abrir várias janelas.&lt;/p&gt;

&lt;p&gt;Além disso, o tmux mantém essas janelas e painéis em uma sessão. Você pode sair de uma sessão a qualquer momento, chamamos isso de &lt;strong&gt;desanexação&lt;/strong&gt;. Uma característica que considero incrível é que a sessão fica ativa até você matar o servidor do tmux (quando você reinicia o computador, por exemplo ou executa um comando que mata o servidor). Isso é incrivelmente útil porque depois em qualquer momento você pode escolher exatamente aquela sessão e o tmux irá te deixar no mesmo ponto de quando você a deixou, simplesmente &lt;strong&gt;anexando&lt;/strong&gt; a essa sessão.&lt;/p&gt;

&lt;p&gt;Se você já trabalhou com servidores remotos usando ssh, deve conseguir perceber como isso útil! Por exemplo, quando você perder a sua conexão ssh, a sessão do tmux será simplesmente desconectada, mas continuará sendo executada no servidor em segundo plano, incluindo todos os seus processos ativos. Para continuar sua sessão, basta se conectar no servidor novamente e depois naquela mesma sessão que está em execução.&lt;/p&gt;

&lt;p&gt;Todavia não fique pensando que o tmux só é útil apenas quando precisamos trabalhar com uma máquina remota. Pessoalmente, me vejo desconectando das sessões quando estou mudando de contexto de trabalho, basicamente como desenvolvedor backend que trabalha muito com microserviços, mantenho sempre uma sessão para cada microserviço, assim quando preciso migrar entre projetos já estou no ponto ideal.&lt;/p&gt;

&lt;h2&gt;
  
  
  Massa, entendi. Mas por que devo então usar o tmux no lugar do iTerm2 ou Terminator?
&lt;/h2&gt;

&lt;p&gt;Na minha opinião quando se precisa apenas do gerenciamento básico de janelas, o iTerm do Mac ou Terminator do linux são soluções excelentes já que também possuem suporte a janelas e painéis. Mas ainda acredito que você está perdendo:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;sessões: desconectar e anexar sessões me ajuda na alternância de contexto de atividade no trabalho;&lt;/li&gt;
&lt;li&gt;independência de plataforma: posso usar o tmux no meu Macbook, no meu Dell com Linux, em máquinas na nuvem como o AWS EC2, máquinas simples como Raspberry Pie, BeagleBones e etc;&lt;/li&gt;
&lt;li&gt;personalizável: existem várias maneiras de personalizar a aparência e o comportamento de um ambiente tmux;&lt;/li&gt;
&lt;li&gt;credibilidade nas ruas: você pode se sentir um hacker enquanto trabalha :P.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Começando a usar
&lt;/h2&gt;

&lt;p&gt;Este guia prático abordará apenas os recursos básicos que devem ser mais que suficientes para começar e ser produtivo(a) com o tmux. Para começar basta abrir seu terminal e seguir as instruções.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;A instalação do tmux é simples e direta para a maioria das plataformas. Um simples &lt;strong&gt;sudo apt-get install tmux&lt;/strong&gt; (Ubuntu e derivados), &lt;strong&gt;sudo yum install tmux&lt;/strong&gt;(CentOS e derivados) ou &lt;strong&gt;brew install tmux&lt;/strong&gt; (Mac) deve ser suficiente.&lt;/p&gt;

&lt;h3&gt;
  
  
  Sua primeira sessão
&lt;/h3&gt;

&lt;p&gt;Para criar uma sessão, basta digitar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tmux


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

&lt;/div&gt;

&lt;p&gt;Esse comando vai abrir uma nova sessão, criará uma nova janela e iniciará um shell nessa janela.&lt;/p&gt;

&lt;p&gt;Quando estiver no Tmux, você verá uma linha de status na parte inferior da tela que mostra informações sobre a sessão atual.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F4c5ef78d02c1ce6a81ea137a2d2a6be1%2F588c1%2Fsessao-nova.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F4c5ef78d02c1ce6a81ea137a2d2a6be1%2F588c1%2Fsessao-nova.webp" alt="Uma nova sessão no tmux"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A barra de status é uma parte importante do tmux. Além das janelas abertas, também mostra algumas informações do sistema, como data e hora. Totalmente personalizável, já vi algumas coisas realmente chiques por aí (próximos eventos da agenda, status da bateria, para citar alguns).&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma sessão nomeada
&lt;/h3&gt;

&lt;p&gt;Por padrão, as sessões do tmux são nomeadas numericamente. Mas, como falei anteriormente, gosto de trabalhar com sessões que possuem contexto de atividade e utilizar números nesse caso pode deixar as coisas confusas, por isso gosto criar sempre uma sessão nomeada.&lt;/p&gt;

&lt;p&gt;Para criar uma nova sessão nomeada, execute o comando tmux com os seguintes argumentos:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tmux new -s session_name


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

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fbe06969d22d81cdb93dcf54e88a9654f%2F83a31%2Fsessa-nova-nomeada.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fbe06969d22d81cdb93dcf54e88a9654f%2F83a31%2Fsessa-nova-nomeada.webp" alt="Uma nova sessão nomeada"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Criando uma nova sessão sem sair da antiga
&lt;/h3&gt;

&lt;p&gt;Por padrão o tmux sempre espera que você esteja desanexado de uma sessão para se criar outra, por isso precisamos adicionar mais um parâmetro no comando assim:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tmux new -s session_name -d


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

&lt;/div&gt;
&lt;h3&gt;
  
  
  Reconectando a sua antiga sessão
&lt;/h3&gt;

&lt;p&gt;Para se conectar a uma sessão antiga acredito que você precisa encontrar o seu nome ou número. O tmux possui um comando muito útil que nos permite obter uma lista das sessões em execução no momento, digite:&lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tmux ls


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

&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fb94d8abd96ede563d3661a2035ca605b%2Fde6b8%2Fsessao-ativa.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fb94d8abd96ede563d3661a2035ca605b%2Fde6b8%2Fsessao-ativa.webp" alt="Lista de sessões ativas"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Fique atento ao nome ou número na primeira coluna apresentada em seu terminal. No meu exemplo você pode ver que existem duas sessões em execução. A primeiro é chamado artigo e a segunda blog. E que atualmente estou utilizando a sessão blog.&lt;/p&gt;

&lt;p&gt;Para me anexar a sessão artigo basta executar o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

tmux a -t session_name


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

&lt;/div&gt;

&lt;p&gt;O problema é que por padrão esse comando só funciona se você estiver fora de qualquer sessão tmux, mas com o poder da personalização conseguimos burlar essa limitação (final do artigo).&lt;/p&gt;

&lt;h3&gt;
  
  
  Dividindo a tela em painéis
&lt;/h3&gt;

&lt;p&gt;Agora que criamos nossa primeira sessão, podemos ter uma ideia dos painéis. Quando você cria uma nova sessão, o tmux inicia por padrão com uma janela e um único painel dentro, mas queremos dividir nossa tela.&lt;/p&gt;

&lt;p&gt;Todos os comandos no tmux são acionados por uma chave de prefixo seguida por uma chave de comando (bastante semelhante ao emacs). Por padrão, a chave de prefixo do tmux é &lt;strong&gt;C-b&lt;/strong&gt; (Ctrl+b).&lt;/p&gt;

&lt;p&gt;Essa notação pode parecer um pouco estranha se você não estiver acostumado, mas C- significa "pressione e segure a tecla Ctrl", portanto C-b significa pressionar as teclas &lt;strong&gt;Ctrl e b&lt;/strong&gt; ao mesmo tempo.&lt;/p&gt;

&lt;p&gt;Para dividir a tela com dois painéis horizontais use o comando:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

C-b + %


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

&lt;/div&gt;

&lt;p&gt;Lembrando o que acabei de lhe contar sobre a sequência de prefixo e tecla de comando do tmux, com o comando acima vamos dividir seu painel único em dois painéis, um esquerdo e outro direito, pressionando &lt;strong&gt;Ctrl e b&lt;/strong&gt; ao mesmo tempo, solte os dois e digite a tecla %.&lt;/p&gt;

&lt;p&gt;Voilà! Você acabou de invocar um atalho do tmux e dividir seu painel em dois.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fde4e4f3e8a715a815acae719fd9ae23e%2Fa49df%2Fpaineis-horizontal-dois.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2Fde4e4f3e8a715a815acae719fd9ae23e%2Fa49df%2Fpaineis-horizontal-dois.webp" alt="Dois paineis horizontais"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Também existe uma divisão de painéis superior e inferior. Para dividir use o atalho C-b ".&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F304cf66a179d8a733e0379b7f811065b%2F00324%2Fpaineis-superior-inferior.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fmalaquias.dev%2Fstatic%2F304cf66a179d8a733e0379b7f811065b%2F00324%2Fpaineis-superior-inferior.webp" alt="Paineis superior e inferior"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Navegando entre os painéis
&lt;/h3&gt;

&lt;p&gt;No momento, estamos presos no painel recém-criado. Mas vamos supor que queremos voltar para o painel da direita (o maior). Fácil: para alternar de um painel para o outro usamos o atalho &lt;strong&gt;C-b &lt;/strong&gt;, onde &lt;strong&gt;&lt;/strong&gt; é a tecla de seta apontando para o painel para o qual você deseja alternar.&lt;/p&gt;

&lt;p&gt;No nosso caso, queremos mudar para o painel à direita, então pressionamos &lt;strong&gt;Ctrl e b&lt;/strong&gt; seguido da tecla de seta direita.&lt;/p&gt;

&lt;p&gt;Agora você pode seguir em frente e dividir cada um dos seus novos painéis ainda mais. Sinta-se à vontade para experimentar e dividir seus painéis como um maníaco(a) para ter uma ideia do poder que isso nós dar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Desanexando de uma sessão
&lt;/h3&gt;

&lt;p&gt;Você pode se desconectar da sessão do Tmux e retornar ao seu shell normal digitando:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;C-b d&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Fechando um painel&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;Fechar um painel é tão simples quanto fechar uma sessão regular do terminal. Digite exit ou pressione &lt;strong&gt;Ctrl + d&lt;/strong&gt; e ele desapareceu.&lt;/p&gt;

&lt;h2&gt;
  
  
  Customizando seu tmux com gpakosz/.tmux
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://github.com/gpakosz" rel="noopener noreferrer"&gt;Gregory Pakosz&lt;/a&gt; criou uma das customizações mais utilizadas hoje em dia pelas pessoas que procuram um modelo já pronto. Durante todo esse tempo que estou utilizando o tmux já experimentei fazer ao meu gosto e outros modelos já prontos.&lt;/p&gt;

&lt;p&gt;Mas o do &lt;a href="https://github.com/gpakosz" rel="noopener noreferrer"&gt;Gregory Pakosz&lt;/a&gt; foi o que me adaptei melhor, ele é muito simples de usar e de aprender os atalhos, além de ter diversos ícones que podemos usar para montar o nosso status bar.&lt;/p&gt;

&lt;h3&gt;
  
  
  Instalação
&lt;/h3&gt;

&lt;p&gt;Para instalar, execute o seguinte no seu terminal (lembre-se de backup do seu ~ / .tmux.conf):&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

&lt;p&gt;$ cd&lt;/p&gt;

&lt;p&gt;$ git clone &lt;a href="https://github.com/gpakosz/.tmux.git" rel="noopener noreferrer"&gt;https://github.com/gpakosz/.tmux.git&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;$ ln -s -f .tmux/.tmux.conf&lt;/p&gt;

&lt;p&gt;$ cp .tmux/.tmux.conf.local .&lt;/p&gt;

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

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  &lt;br&gt;
  Atalhos&lt;br&gt;
&lt;/h3&gt;

&lt;p&gt;Dicionário:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;&lt;/strong&gt; significa que você tem que pressionar &lt;strong&gt;Ctrl + a&lt;/strong&gt; ou &lt;strong&gt;Ctrl + b&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; c&lt;/strong&gt; significa que você tem que pressionar &lt;strong&gt;Ctrl + a&lt;/strong&gt; ou &lt;strong&gt;Ctrl + b&lt;/strong&gt; seguido de &lt;strong&gt;c&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; C-c&lt;/strong&gt; &lt;strong&gt;means you have to hit Ctrl + a&lt;/strong&gt; ou &lt;strong&gt;Ctrl + b&lt;/strong&gt; seguido de &lt;strong&gt;Ctrl + c&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Comandos básicos:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt; r&lt;/strong&gt; recarrega as configurações&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;C-l&lt;/strong&gt; limpa a tela e o histórico do tmux&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; C-c&lt;/strong&gt; cria uma nova sessão&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; C-f&lt;/strong&gt; permite alternar entre sessões usando o nome ou número&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; \$&lt;/strong&gt; permite renomear o nome da sessão&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; C-h +  C-l&lt;/strong&gt; permite navegar pelos painéis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; Tab&lt;/strong&gt; leva você para o último painel ativo&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; -&lt;/strong&gt; divide o painel atual verticalmente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; _&lt;/strong&gt; divide o painel atual horizontalmente&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; h,  j,  k&lt;/strong&gt; e &lt;strong&gt; l&lt;/strong&gt; navega pelos painéis como se tivesse usando o Vim&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; H,  J,  K&lt;/strong&gt; e &lt;strong&gt; L&lt;/strong&gt; redimensiona os painéis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; ⇧,  ⇨,  ⇩&lt;/strong&gt; e &lt;strong&gt; ⇦&lt;/strong&gt; navega pelos painéis&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; +&lt;/strong&gt; maximiza o painel atual em uma nova janela&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; m&lt;/strong&gt; ativa ou desativa o uso do mouse&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; Enter&lt;/strong&gt; entra no modo de cópia&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; b&lt;/strong&gt; lista o que se tem copiado de pasta&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; p&lt;/strong&gt; cola o último conteúdo copiado&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt; P&lt;/strong&gt; permite escolher o que será colado em uma lista&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Aprenda mais acessando o projeto no github &lt;a href="https://github.com/gpakosz/.tmux" rel="noopener noreferrer"&gt;gpakosz/.tmux: 🇫🇷 Oh My Tmux! Pretty &amp;amp; versatile tmux configuration made with ❤️ (imho the best tmux configuration that just works)&lt;/a&gt;.&lt;/p&gt;

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

&lt;p&gt;E é isso! Parabéns, você acabou de concluir suas primeiras impressões com tmux e sujou um pouco as mãos! Sim, existem muitas outras coisas que o tmux pode fazer. Mas o que você acabou de aprender deve ser tudo para começar a usar o tmux no futuro.&lt;/p&gt;




&lt;p&gt;Se você gostou desse texto por favor não deixe de curtir e compartilhar, isso 😄&lt;/p&gt;

&lt;p&gt;Se quiser saber o que ando fazendo por aí ou tirar alguma dúvida fique a vontade para me procurar nas redes sociais como &lt;a href="https://twitter.com/malaquiasdev" rel="noopener noreferrer"&gt;@malaquiasdev&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Para ler mais textos meus acesse &lt;a href="https://malaquias.dev" rel="noopener noreferrer"&gt;MalaquiasDEV | A Vida, o código e tudo mais&lt;/a&gt;.&lt;/p&gt;

</description>
      <category>tmux</category>
      <category>terminal</category>
      <category>productivity</category>
      <category>tutorial</category>
    </item>
    <item>
      <title>Pare de chutar e aprenda como funciona o display: block</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Mon, 20 Jan 2020 09:24:32 +0000</pubDate>
      <link>https://dev.to/collabcode/pare-de-chutar-e-aprenda-como-funciona-o-display-block-169m</link>
      <guid>https://dev.to/collabcode/pare-de-chutar-e-aprenda-como-funciona-o-display-block-169m</guid>
      <description>&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/HWfhwokS_qg"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;Neste post nós vamos entender como funciona o &lt;code&gt;display: block&lt;/code&gt;. Para facilitar a explicação, vamos utilizar o código final do &lt;a href="https://dev.to/collabcode/pare-de-chutar-e-aprenda-como-funciona-o-display-inline-35o"&gt;post sobre display: inline&lt;/a&gt; como base. Se você quiser ir fazendo o código junto com o post, você pode copiar o HTML e os CSSs abaixo, ou acessar os códigos pelo &lt;a href="https://github.com/MarcoBrunoBR/pare-de-chutar-e-aprenda-as-propriedades-CSS-de-alinhamento/tree/e2fad0dd1f29d5df1acd27cf842d2bb8a3bcb54a"&gt;GitHub&lt;/a&gt; ou &lt;a href="https://codepen.io/MarcoBrunoBR/pen/bwwQbN"&gt;CodePen&lt;/a&gt;.&lt;/p&gt;

&lt;h4&gt;
  
  
  HTML (index.html)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight html"&gt;&lt;code&gt;&lt;span class="cp"&gt;&amp;lt;!DOCTYPE html&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;html&lt;/span&gt; &lt;span class="na"&gt;lang=&lt;/span&gt;&lt;span class="s"&gt;"pt-br"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;head&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;meta&lt;/span&gt; &lt;span class="na"&gt;charset=&lt;/span&gt;&lt;span class="s"&gt;"UTF-8"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;    &lt;span class="nt"&gt;&amp;lt;title&amp;gt;&lt;/span&gt;
        Exemplo dos valores inline, block e inline-block
        da propriedade display;
    &lt;span class="nt"&gt;&amp;lt;/title&amp;gt;&lt;/span&gt;    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"css/reset.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;link&lt;/span&gt; &lt;span class="na"&gt;rel=&lt;/span&gt;&lt;span class="s"&gt;"stylesheet"&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;"css/displayInlineBlock.css"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/head&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;body&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;ul&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"example"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"example-item example-item_first"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Primeiro&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"example-item example-item_second"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Segundo&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;li&lt;/span&gt; &lt;span class="na"&gt;class=&lt;/span&gt;&lt;span class="s"&gt;"example-item example-item_third"&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;Terceiro&lt;span class="nt"&gt;&amp;lt;/li&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/ul&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/body&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/html&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CSS (reset.css)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;margin&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;padding&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;border&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;body&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;font-family&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;"Open Sans"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nb"&gt;sans-serif&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nt"&gt;ul&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;ol&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="nt"&gt;li&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;list-style&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;none&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h4&gt;
  
  
  CSS (displayInlineBlock.css)
&lt;/h4&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nt"&gt;example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Abrindo no navegador o HTML que acabamos de fazer, ele vai ter o seguinte layout:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--QhOuQeWe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vu1ip6uat167a6bp00ev.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--QhOuQeWe--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/vu1ip6uat167a6bp00ev.png" alt="Layout inicial do nosso código"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Na tentativa de deixar o post um pouco mais dinâmico, vou colocar um desafio para implementarmos utilizando a propriedade &lt;code&gt;display&lt;/code&gt; com o valor &lt;code&gt;block&lt;/code&gt;.&lt;br&gt;
Vamos tentar chegar no seguinte layout até o final do post:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--3lb-D8YN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2nzgq873d7umio0hynoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--3lb-D8YN--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/2nzgq873d7umio0hynoq.png" alt="Objetivo do post, layout que vamos implementar até o final do post"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A primeira coisa que faremos é definir a largura (&lt;code&gt;width&lt;/code&gt;) e altura (&lt;code&gt;height&lt;/code&gt;) para todas as tags &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;. Vamos abrir o nosso CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;) e definir a largura (&lt;code&gt;width&lt;/code&gt;) com &lt;code&gt;33.333%&lt;/code&gt; e a altura (&lt;code&gt;height&lt;/code&gt;) de 150px:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;inline&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Adicionamos&lt;/span&gt; &lt;span class="err"&gt;essa&lt;/span&gt; &lt;span class="err"&gt;linha&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;  &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;E&lt;/span&gt; &lt;span class="err"&gt;essa&lt;/span&gt; &lt;span class="err"&gt;aqui,&lt;/span&gt; &lt;span class="err"&gt;também&lt;/span&gt; &lt;span class="err"&gt;adicionamos&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Salve seu CSS, em seguida atualize seu navegador, o resultado vai ser:&lt;br&gt;
&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Ou_ahBXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ltzwt4mevqa9i3p2vow4.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Ou_ahBXm--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/ltzwt4mevqa9i3p2vow4.png" alt="Não mudou nada, ficou igual estava antes"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estranho, não mudou nada, parece que nem a largura (&lt;code&gt;width&lt;/code&gt;) nem a altura (&lt;code&gt;height&lt;/code&gt;) funcionaram. Por que isso aconteceu? Se sua resposta é não sei ou o CSS não funciona direito, vale a pena você dar uma olhada no &lt;a href="https://dev.to/collabcode/pare-de-chutar-e-aprenda-como-funciona-o-display-inline-35o"&gt;post anterior&lt;/a&gt; a esse. Nele aprendemos como funciona a &lt;code&gt;display: inline&lt;/code&gt;. Lá vimos que todo elemento HTML com &lt;code&gt;display: inline&lt;/code&gt;, não aceita as propriedades &lt;code&gt;width&lt;/code&gt; e &lt;code&gt;height&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Para que o elemento HTML aceite as propriedades &lt;code&gt;width&lt;/code&gt; e &lt;code&gt;height&lt;/code&gt;, precisamos definir o valor do &lt;code&gt;display&lt;/code&gt; como &lt;code&gt;block&lt;/code&gt;. Vamos ver se isso que acabei de falar é verdade. Por favor, abra o nosso CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;) e altere para &lt;code&gt;block&lt;/code&gt; a propriedade &lt;code&gt;display&lt;/code&gt; que está no seletor &lt;code&gt;.example-item&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Trocamos&lt;/span&gt; &lt;span class="err"&gt;inline&lt;/span&gt; &lt;span class="err"&gt;por&lt;/span&gt; &lt;span class="err"&gt;block&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Vai lá no seu navegador e atualize a página, você verá que eu não estou mentindo para você. Espero que você esteja com o resultado igual a imagem que está logo abaixo, isso não acontece, não tem problema, me manda uma mensagem que eu te ajudo, ou entre no Discord da CollabCode no link a seguir: &lt;a href="http://bit.ly/discord-collabcode"&gt;Discord da CollabCode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--Gsjf_PTp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kf458tuql5a1m8czdyzt.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--Gsjf_PTp--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/kf458tuql5a1m8czdyzt.png" alt="Agora a largura e altura estão funcionando"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Boa. Agora conseguimos definir a largura (&lt;code&gt;width&lt;/code&gt;) e altura (&lt;code&gt;height&lt;/code&gt;) para os nossos elementos. Ou seja, todos os elementos definidos com &lt;code&gt;display: block&lt;/code&gt;, aceitam as propriedades &lt;code&gt;width&lt;/code&gt; e &lt;code&gt;height&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Lembra que definimos uma largura de &lt;code&gt;33.333%&lt;/code&gt; para as três &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;?&lt;br&gt;
Teoricamente as &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; deveriam ficar uma do lado da outra. Isso não acontece porque todo elemento definido como &lt;code&gt;block&lt;/code&gt; ocupa a linha inteira, ou seja, não deixa outro elemento ocupar a mesma linha que ele. Por esse motivo os elementos HTML (&lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;) ficaram um abaixo do outro.&lt;/p&gt;

&lt;p&gt;Falta pouco para implementarmos o código do nosso desafio. Agora só precisamos mover a nossa segunda &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para direita e centralizar a terceira &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;. A forma mais simples de implementar isso é utilizando a propriedade &lt;code&gt;margin&lt;/code&gt; (respiro externo) do CSS.&lt;/p&gt;

&lt;p&gt;Só para começarmos a aprender como funciona a &lt;code&gt;margin&lt;/code&gt;, vamos colocar &lt;code&gt;40px&lt;/code&gt; de margem do lado esquerdo da nossa segunda &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;. Para fazer isso precisamos adicionar a propriedade &lt;code&gt;margin-left: 40px&lt;/code&gt;, no seletor &lt;code&gt;.example-item_second&lt;/code&gt; que está no arquivo CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;40px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Adicionamos&lt;/span&gt; &lt;span class="err"&gt;40px&lt;/span&gt; &lt;span class="err"&gt;do&lt;/span&gt; &lt;span class="err"&gt;lado&lt;/span&gt; &lt;span class="err"&gt;esquerdo&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Atualizando a nossa página no browser o resultado vai ficar assim:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--WuGy0Ckx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5e9wakuiyv0x7qxi8ll0.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--WuGy0Ckx--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/5e9wakuiyv0x7qxi8ll0.png" alt="Conseguimos mover a segunda li um pouco para direita"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Estamos caminhando para deixar o segundo elemento deslocado para o lado direito da página, conforme foi proposto no nosso desafio. Para conseguirmos implementar essa parte do desafio, qual é o valor que devemos colocar na propriedade &lt;code&gt;margin-left&lt;/code&gt;? Dica: lembre-se que a &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tem &lt;code&gt;33.333%&lt;/code&gt; de largura.&lt;/p&gt;

&lt;p&gt;É isso. Só fazermos a conta, &lt;code&gt;100% - 33.333%&lt;/code&gt;, teremos como resultado &lt;code&gt;66.667%&lt;/code&gt;. Para deixarmos o layout mais próximo do desafio, basta que a segunda &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; tenha no margin-left o valor de &lt;code&gt;66.667%&lt;/code&gt;. Bora fazer isso no nosso CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;).&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;66.667%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Alteramos&lt;/span&gt; &lt;span class="err"&gt;o&lt;/span&gt; &lt;span class="err"&gt;40px&lt;/span&gt; &lt;span class="err"&gt;para&lt;/span&gt; &lt;span class="err"&gt;66.667%&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Se precisarmos mudar a largura (&lt;code&gt;width&lt;/code&gt;) de todas as &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para &lt;code&gt;20%&lt;/code&gt;, o que vai acontecer com o nosso layout? O segundo elemento vai ficar no lado direito, bem encostadinho?&lt;/p&gt;

&lt;p&gt;Infelizmente toda vez que mudarmos a largura (&lt;code&gt;width&lt;/code&gt;) da &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; vamos ter que refazer a conta e mudarmos o valor da propriedade &lt;code&gt;margin-left&lt;/code&gt;. Esta forma que acabamos de implementar funciona mas a manutenção não é muito feliz.&lt;/p&gt;

&lt;p&gt;Felizmente temos um valor da propriedade &lt;code&gt;margin-left&lt;/code&gt; que faz o cálculo para gente de forma automática, é só definirmos o &lt;code&gt;margin-left&lt;/code&gt; como &lt;code&gt;auto&lt;/code&gt;. Vai lá abra seu CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;) e troque o  &lt;code&gt;66.667%&lt;/code&gt; por &lt;code&gt;auto&lt;/code&gt;:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;    
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Só&lt;/span&gt; &lt;span class="err"&gt;trocamos&lt;/span&gt; &lt;span class="err"&gt;66.667%&lt;/span&gt; &lt;span class="err"&gt;por&lt;/span&gt; &lt;span class="err"&gt;auto&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Assim que você atualizar o navegador vai ver que o layout não mudou nada do código anterior:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--edYhl-uy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l0oqjggparwxc5zz1ozp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--edYhl-uy--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/l0oqjggparwxc5zz1ozp.png" alt="O resultado visual é o mesmo com porcentagem, mas com auto a manutenção é mais feliz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Mas, volte no seu código (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;) e altere a largura (&lt;code&gt;width&lt;/code&gt;) dos seu &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para &lt;code&gt;20%&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Se você ir até o navegador e atualizar a página vai ver o seguinte resultado:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--L1twk-O2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/11u71fqkh8bq3shj69ie.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--L1twk-O2--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/11u71fqkh8bq3shj69ie.png" alt="Mesmo mudando a largura das li temos o mesmo comportamento de posicionamento"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Bacana né. Utilizando o &lt;code&gt;margin-left: auto;&lt;/code&gt; não precisamos mais ficar fazendo a conta para definir o valor de &lt;code&gt;margin-left&lt;/code&gt;. Desta forma a manutenção do código fica muito mais feliz.&lt;/p&gt;

&lt;p&gt;Para finalizar o nosso desafio, só está faltando centralizar a terceira &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt;. Agora nossas &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; estão com &lt;code&gt;20%&lt;/code&gt; de largura (&lt;code&gt;width&lt;/code&gt;). Ou seja, quanto nós precisamos definir de margem à esquerda e à direita para ela ficar centralizada?&lt;/p&gt;

&lt;p&gt;Basta colocar &lt;code&gt;40%&lt;/code&gt; de margem à esquerda e à direita. Mas, se a largura das &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; forem alteradas novamente? Vamos ter que ficar mudando a propriedade &lt;code&gt;margin-left&lt;/code&gt; e &lt;code&gt;margin-right&lt;/code&gt;. Triste! Novamente temos o problema para mantermos o nosso código.&lt;/p&gt;

&lt;p&gt;Ainda bem que temos uma solução para esse problema. :-)&lt;br&gt;
Da mesma forma que nós definimos &lt;code&gt;margin-left: auto;&lt;/code&gt; para deixar que o navegador calculasse a quantidade de margem necessária para colocar no lado esquerdo do segundo elemento, com o objetivo de deixar ele posicionado no lado direito, podemos pedir para o navegador calcular de forma automática a quantidade de margem do lado esquerdo e direito para que a terceira &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; fique centralizada.&lt;/p&gt;

&lt;p&gt;Precisamos portanto adicionar o &lt;code&gt;margin-left: auto;&lt;/code&gt; e &lt;code&gt;margin-right: auto;&lt;/code&gt; no seletor da terceira &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; (&lt;code&gt;.example-item_third&lt;/code&gt;). Abra o nosso CSS (&lt;strong&gt;displayInlineBlock.css&lt;/strong&gt;) e implemente o &lt;code&gt;margin-left&lt;/code&gt; e &lt;code&gt;margin-right&lt;/code&gt;. Ah! Vamos aproveitar e voltar a largura de &lt;code&gt;33.333%&lt;/code&gt; nas &lt;code&gt;&amp;lt;li&amp;gt;&lt;/code&gt; para o layout ficar igual ao do nosso desafio.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight css"&gt;&lt;code&gt;&lt;span class="nc"&gt;.example&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FFF&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;text-align&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;center&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;display&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;block&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;width&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;33.333%&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Voltamos&lt;/span&gt; &lt;span class="err"&gt;o&lt;/span&gt; &lt;span class="err"&gt;valor&lt;/span&gt; &lt;span class="err"&gt;de&lt;/span&gt; &lt;span class="err"&gt;33.333%&lt;/span&gt;
    &lt;span class="nl"&gt;height&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;150px&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_first&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#FAA116&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_second&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#57C7C3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="nc"&gt;.example-item_third&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="nl"&gt;background-color&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="m"&gt;#3B97D3&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="nl"&gt;margin-right&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Adicionamos&lt;/span&gt; &lt;span class="err"&gt;essa&lt;/span&gt; &lt;span class="err"&gt;linha&lt;/span&gt;
    &lt;span class="nl"&gt;margin-left&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;auto&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;Adicionamos&lt;/span&gt; &lt;span class="err"&gt;essa&lt;/span&gt; &lt;span class="err"&gt;linha&lt;/span&gt; &lt;span class="err"&gt;também&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Beleza. Agora vai até o navegador e atualize a sua página:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ipBHd1uf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rwbgjxg07v5lde4mm8fc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ipBHd1uf--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://thepracticaldev.s3.amazonaws.com/i/rwbgjxg07v5lde4mm8fc.png" alt="Está aí. Implementamos o layout do nosso desafio com um código simples e feliz"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Espero que você tenha gostado do post. É dessa forma que explicava nas turmas de &lt;a href="https://www.caelum.com.br/curso-html-css-javascript"&gt;FrontEnd da Caelum&lt;/a&gt;. Se ficou qualquer dúvida, não concorda com alguma coisa, tem alguma dica para melhorar os próximos posts. Por favor, fale! Eu realmente ouço e sempre estou tentando melhorar. Até o próximo post que vai ser sobre, &lt;code&gt;display: inline-block&lt;/code&gt;!!!&lt;/p&gt;

&lt;p&gt;Se quiser trocar conhecimento fique a vontade para entrar e um dos canais da comunidade CollabCode:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://bit.ly/discord-collabcode"&gt;Discord da CollabCode&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bit.ly/telegram-collabcode"&gt;Telegram da CollabCOde&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://bit.ly/whats-collabcode"&gt;Whatsapp da CollabCOde&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>css</category>
      <category>frontend</category>
      <category>display</category>
    </item>
    <item>
      <title>Como configurar ESLint e Prettier no Node?</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Tue, 29 Oct 2019 16:29:04 +0000</pubDate>
      <link>https://dev.to/collabcode/como-configurar-eslint-e-prettier-no-node-3kga</link>
      <guid>https://dev.to/collabcode/como-configurar-eslint-e-prettier-no-node-3kga</guid>
      <description>&lt;p&gt;Post in english available at SourceLevel: &lt;a href="https://sourcelevel.io/blog/how-to-setup-eslint-and-prettier-on-node" rel="noopener noreferrer"&gt;https://sourcelevel.io/blog/how-to-setup-eslint-and-prettier-on-node&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se você não sabe o que é o &lt;strong&gt;ESLint&lt;/strong&gt; e &lt;strong&gt;Prettier&lt;/strong&gt; eu recomendo você dar uma olhada no &lt;a href="https://dev.to/collabcode/como-melhorar-a-qualidade-de-codigo-com-eslint-e-prettier-117j"&gt;primeiro post&lt;/a&gt; onde expliquei o que são eles. O objetivo desse post é mais prático.&lt;/p&gt;

&lt;p&gt;Como vamos precisar de um projeto base para mostrar como configurar o ESLint e Prettier na sua aplicação Node, logo após os pré-requisitos montarei um &lt;em&gt;hello world&lt;/em&gt; (olá mundo) de API com &lt;strong&gt;Restify&lt;/strong&gt; que é o framework usado pela Netflix e outras empresas a mesma altura.&lt;/p&gt;

&lt;p&gt;Se você já tem um projeto criado, por favor só dê uma olhada nos pré-requisitos que estão logo a seguir e depois pode pular para a seção: Como configurar o ESLint em uma aplicação Node?&lt;/p&gt;

&lt;h2&gt;
  
  
  Pré-requisitos
&lt;/h2&gt;

&lt;p&gt;Ter um terminal instalado com o bash, zsh ou fish. Se estiver no windows e não tiver com o bash instalado, por favor use o powershell porque ele terá mais compatibilidade com os comandos que vou mostrar a seguir. Caso tiver qualquer erro fique à vontade para pedir ajuda nos comentários.&lt;/p&gt;

&lt;p&gt;Node (10.16.3 ou superior) e npm (6.12.0 ou superior) instalados e por último o Visual Studio Code (VSCode) instalado.&lt;/p&gt;

&lt;h2&gt;
  
  
  Criando projeto base?
&lt;/h2&gt;

&lt;p&gt;Por favor, abra o terminal e crie uma pasta com o nome de &lt;em&gt;api-happy&lt;/em&gt;. A seguir eu uso o comando &lt;code&gt;mkdir&lt;/code&gt; para criar a pasta e à frente do comando coloco o nome da pasta:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;mkdir &lt;/span&gt;api-happy


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

&lt;/div&gt;

&lt;p&gt;Agora precisamos entrar na pasta que acabamos de criar usando o comando &lt;code&gt;cd&lt;/code&gt; e, logo à frente, o nome da pasta que queremos entrar:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;span class="nb"&gt;cd &lt;/span&gt;api-happy


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

&lt;/div&gt;

&lt;p&gt;Show! Agora que estamos dentro da pasta já podemos iniciar o nosso projeto com &lt;strong&gt;node&lt;/strong&gt; usando o &lt;strong&gt;npm&lt;/strong&gt; (Node Package Manager). No terminal usaremos o comando &lt;code&gt;npm init -y&lt;/code&gt;, esse comando criará um arquivo chamado &lt;em&gt;package.json&lt;/em&gt; com algumas informações básicas de projeto como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;name (nome);&lt;/li&gt;
&lt;li&gt;version (versão);&lt;/li&gt;
&lt;li&gt;description (descrição);&lt;/li&gt;
&lt;li&gt;main (arquivo que inicia o projeto);&lt;/li&gt;
&lt;li&gt;scripts (scripts de test e outros);&lt;/li&gt;
&lt;li&gt;keywords (palavras chaves para acharem seu projeto);&lt;/li&gt;
&lt;li&gt;author (autor);&lt;/li&gt;
&lt;li&gt;license (licença).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Agora que já sabemos o que o comando faz, execute ele no terminal, por favor (lembre-se que você tem que estar na pasta do projeto):&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm init &lt;span class="nt"&gt;-y&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Só para certificarmos que deu tudo certo, abra o seu projeto no VSCode e verifique se o arquivo &lt;em&gt;package.json&lt;/em&gt; foi criado com sucesso.&lt;/p&gt;

&lt;p&gt;O próximo passo, ainda dentro da pasta do projeto, é instalarmos uma dependência (&lt;em&gt;restify&lt;/em&gt;) no nosso projeto. Para isso precisamos usar o &lt;code&gt;npm&lt;/code&gt; usando o comando &lt;code&gt;install&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm &lt;span class="nb"&gt;install &lt;/span&gt;restify


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

&lt;/div&gt;

&lt;p&gt;Caso você goste de escrever menos, você pode usar o &lt;code&gt;npm i restify&lt;/code&gt; no lugar do &lt;code&gt;npm install restify&lt;/code&gt;. Se você está acostumado a escrever o &lt;code&gt;--save&lt;/code&gt; à frente do nome do pacote (&lt;code&gt;restify&lt;/code&gt; no nosso caso) para garantir que o pacote vire uma dependência do nosso projeto e o mesmo vá para o &lt;strong&gt;package.json&lt;/strong&gt;, isso não é mais necessário. Falando no &lt;strong&gt;package.json&lt;/strong&gt;, por favor abra ele no seu VSCode e verifique se foi adicionado a chave a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"restify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.4.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Ainda no seu VSCode com o seu projeto aberto e crie um arquivo chamado &lt;em&gt;index.js&lt;/em&gt; e cole dentro dele o código a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;restify&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;restify&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;PORT&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;5000&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;app&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;restify&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;createServer&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nx"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;/&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;req&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; 
  &lt;span class="nx"&gt;res&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;send&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;hello&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;World&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;

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


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

&lt;/div&gt;

&lt;p&gt;Nesse código que acabamos de ver, de forma bem resumida, estamos criando um servidor com o &lt;em&gt;restify&lt;/em&gt; na porta 5000 que saberá responder apenas a rota &lt;code&gt;/&lt;/code&gt; com um simples &lt;code&gt;json&lt;/code&gt; de &lt;code&gt;{hello: "World"}&lt;/code&gt;. A parte mais interessante do código é que não estou seguindo qualquer padrão e de certa forma estamos mesmo a ridicularizar o código, mas estou fazendo isso para te mostrar o poder que teremos após configurarmos o &lt;strong&gt;ESLint&lt;/strong&gt; e &lt;strong&gt;Prettier&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Por último só precisamos pedir para o node subir o nosso servidor com o comando a seguir no terminal:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

node index.js


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

&lt;/div&gt;

&lt;p&gt;Para esse comando funcionar é necessário executá-lo na pasta do projeto.&lt;/p&gt;

&lt;h2 id="config"&gt;Como configurar o ESLint em uma aplicação Node?&lt;/h2&gt;

&lt;p&gt;Agora chegou a hora de deixar o código amador e subirmos de nível, pensando em qualidade de código e automatização de processos. &lt;/p&gt;

&lt;p&gt;Volte ao terminal e derrube o seu servidor apertando as teclas &lt;code&gt;ctrl&lt;/code&gt; e &lt;code&gt;c&lt;/code&gt; juntas. Agora sim, temos o terminal livre para iniciar a configuração do &lt;strong&gt;ESLint&lt;/strong&gt;. Para configurar o ESLint é necessário criar um arquivo de configuração chamado &lt;em&gt;.eslintrc.json&lt;/em&gt; (esse arquivo pode ter outras extensões como: js e yaml). Criar esse arquivo manualmente é um tanto chato, felizmente não precisamos fazê-lo, podemos criá-lo de forma assistida usando o comando a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npx eslint &lt;span class="nt"&gt;--init&lt;/span&gt;


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

&lt;/div&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  O que o npx?
&lt;/h3&gt;

&lt;p&gt;npx instala o pacote para você de forma global e temporária, depois que você o utiliza ele é removido. Dessa forma não ficamos mantendo pacotes globais desatualizados e também mantendo eles ocupando um espaço desnecessário. O npx surgiu na versão 5.2 do npm.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Após a execução do comando, o terminal fará perguntas sobre a configuração do &lt;strong&gt;ESLint&lt;/strong&gt;. Vamos às perguntas. Vou tomar a liberdade de fazer uma tradução das perguntas e respostas que recomendo. Não vou explicar todas as possíveis respostas para cada pergunta, mas caso você tenha qualquer dúvida não deixe de perguntar nos comentários:&lt;/p&gt;

&lt;p&gt;&lt;iframe width="710" height="399" src="https://www.youtube.com/embed/F_fHYicVZi8"&gt;
&lt;/iframe&gt;
&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 1:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;How would you like to use ESLint? (Use arrow keys)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Como gostaria de usar o ESLint? (Use as teclas direcionais)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 1&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;To check syntax, find problems, and enforce code style&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Checar sintaxe, buscar problemas e forçar os padrão de código&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 2:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;What type of modules does your project use?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Que tipo de módulos seu projeto usa?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Respostas 2:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;JavaScript modules (import/export)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;CommonJS (require/exports)&lt;/code&gt; &lt;strong&gt;Selecione essa opção&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;None of these&lt;/code&gt; &lt;em&gt;Nenhum desses&lt;/em&gt;&lt;br&gt;&lt;br&gt;
A resposta que vamos deixar selecionada aqui é o &lt;code&gt;CommnsJS (require/exports)&lt;/code&gt;, mas é muito comum nos projetos backend com JavaScript a galera usar o &lt;a href="https://www.npmjs.com/package/sucrase" rel="noopener noreferrer"&gt;sucrase&lt;/a&gt;, se esse for o seu caso você deve selecionar a opção &lt;code&gt;JavaScript modules (import/export)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 3:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Which framework does your project use?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Qual framework seu projeto usa?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 3:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;None of these&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Nenhum desses&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 4:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Does your project use TypeScript?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Seu projeto usa TypeScript?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 4:&lt;/strong&gt;&lt;br&gt;
Escreva N e em seguida aperte a tecla &lt;code&gt;ENTER&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 5:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Where does your code run? (Press &amp;lt;space&amp;gt; to select, &amp;lt;a&amp;gt; to toggle all, &amp;lt;i&amp;gt; to invert selection)&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Onde seu projeto é executado? (Aperte &amp;lt;space&amp;gt; para selecionar, &amp;lt;a&amp;gt; para selecionar tudo, &amp;lt;i&amp;gt; para inverter a seleção)&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 5:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
Deixe apenas a opção &lt;code&gt;Node&lt;/code&gt; selecionada.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 6:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;How would you like to define a style for your project?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Como você gostaria de definir um padrão de código para o seu projeto?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 6:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Use a popular style guide&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Usar um padrão de código popular&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 7:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Which style guide do you want to follow?&lt;/code&gt;&lt;br&gt;
_Qual padrão de código você quer seguir?_ &lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 7:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Airbnb (https://github.com/airbnb/javascript)&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 8:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;What format do you want your config file to be in?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Qual formato você deseja o seu arquivo de configuração?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 8:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;JSON&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Pergunta 9:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Would you like to install them now with npm?&lt;/code&gt;&lt;br&gt;&lt;br&gt;
&lt;em&gt;Você gostaria de instalá-los agora com npm?&lt;/em&gt;&lt;br&gt;&lt;br&gt;
&lt;strong&gt;Resposta 9:&lt;/strong&gt;&lt;br&gt;&lt;br&gt;
&lt;code&gt;Y&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Pronto! Agora temos o nosso arquivo de configuração do &lt;strong&gt;ESLint&lt;/strong&gt; criado. Os pacotes para que ele funcione de forma feliz foram instalados como dependência para o ambiente de desenvolvimento em nosso projeto. Para certificar que tudo está certo, volte em seu VSCode e verifique se foi criado um arquivo &lt;em&gt;.eslintrc.json&lt;/em&gt; na raiz do seu projeto, depois abra o arquivo &lt;em&gt;package.json&lt;/em&gt;, ambos devem estar similar ao conteúdo a seguir:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;.eslintrc.json&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"commonjs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"es6"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="s2"&gt;"airbnb-base"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"globals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"Atomics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readonly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"SharedArrayBuffer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readonly"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"parserOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
        &lt;/span&gt;&lt;span class="nl"&gt;"ecmaVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;package.json&lt;/strong&gt;&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"api-happy"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"version"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"1.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"description"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"main"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"index.js"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"scripts"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"test"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"echo &lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt;Error: no test specified&lt;/span&gt;&lt;span class="se"&gt;\"&lt;/span&gt;&lt;span class="s2"&gt; &amp;amp;&amp;amp; exit 1"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"keywords"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"author"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"license"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"ISC"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"restify"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^8.4.0"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"devDependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt; 
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^6.5.1"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint-config-airbnb-base"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^14.0.0"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"eslint-plugin-import"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"^2.18.2"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Agora abra o arquivo &lt;em&gt;index.js&lt;/em&gt;. Infelizmente mesmo após toda a configuração que fizemos não temos nenhum tipo de alerta do nosso editor avisando que o nosso código não está seguindo o style guide do AirBnB. Isso acontece porque não instalamos o plugin do ESLint para que ele leia as configurações que acabamos de criar e nos informe os erros do nosso código. Clique no link a seguir e faça a instalação do plugin do ESLint em seu VSCode:&lt;br&gt;
&lt;a href="https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=dbaeumer.vscode-eslint&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Vixi! Agora se você abrir o seu arquivo &lt;em&gt;index.js&lt;/em&gt; vai se deparar com algo não muito agradável, um código cheio de sublinhados vermelhos, como na imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fab4ywi7bqkqs9w0v21pu.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fab4ywi7bqkqs9w0v21pu.png" alt="Erros do ESLint na index.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Se parar o mouse sobre a &lt;code&gt;const&lt;/code&gt; que está na linha 1, aparecerá uma breve descrição do erro que o ESLint achou em seu código, conforme a imagem a seguir:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnfkf1p3irtoe7lhimq0d.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2Fnfkf1p3irtoe7lhimq0d.png" alt="Mostrando primeiro erro que o ESLint achou na index.js"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Esse erro é simples de arrumar, só precisamos adicionar uma linha em branco após o &lt;code&gt;require&lt;/code&gt; do &lt;code&gt;restify&lt;/code&gt;. Lembrar de fazer isso vai ser chato, muito chato, mas não se preocupe! É aqui que entra a magia do &lt;strong&gt;Prettier&lt;/strong&gt;. Agora vamos partir para a configuração do Prettier que terá a responsabilidade de ler todas as configurações que colocarmos para o &lt;strong&gt;ESLint&lt;/strong&gt; e realizar as alterações necessárias uma vez que salvamos os arquivos que estamos editando.&lt;/p&gt;

&lt;p&gt;Por favor, não faça essas correções manualmente, isso só fará você sofrer e em algum momento desligará o ESLint por raiva a ele. Eu já fiz isso...kkk&lt;/p&gt;

&lt;h2&gt;
  
  
  Como configurar o Prettier com o ESLint?
&lt;/h2&gt;

&lt;p&gt;Primeiro precisamos instalar o plugin do &lt;strong&gt;Prettier&lt;/strong&gt; no nosso VSCode, faça isso usando o link a seguir: &lt;a href="https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode" rel="noopener noreferrer"&gt;https://marketplace.visualstudio.com/items?itemName=esbenp.prettier-vscode&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Agora que já temos o Prettier instalado no VSCode podemos instalar o plugin do &lt;strong&gt;ESLint&lt;/strong&gt; para o &lt;strong&gt;Prettier&lt;/strong&gt; se comunicar com o mesmo. Abra seu terminal e, estando dentro da pasta do projeto, execute o comando a seguir. Este comando instalará todos os pacotes necessários para nossa configuração:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

npm i prettier eslint-config-prettier eslint-plugin-prettier


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

&lt;/div&gt;

&lt;p&gt;Não vou entrar no detalhe de cada pacote que instalamos, mas caso tenha dúvidas não deixe de perguntar.&lt;br&gt;
Após a instalação dos pacotes, abra o arquivo &lt;em&gt;.eslintrc.json&lt;/em&gt; no VSCode e adicione no array que esta atribuído a chave &lt;code&gt;extends&lt;/code&gt; a string &lt;code&gt;"prettier"&lt;/code&gt;, conforme código a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"airbnb-base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;A seguir da chave &lt;code&gt;extends&lt;/code&gt; crie a chave &lt;code&gt;plugins&lt;/code&gt; (caso ela não exista), atribua um array para chave com a string, &lt;code&gt;"prettier"&lt;/code&gt;, conforme o código a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"airbnb-base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="err"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;A última coisa que precisamos configurar no arquivo &lt;em&gt;.eslintrc.json&lt;/em&gt; para o prettier e o ESLint funcionar de forma feliz é adicionar &lt;code&gt;rules&lt;/code&gt; conforme o código a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier/prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Esse é o resultado final do &lt;em&gt;.eslintrc.json&lt;/em&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"env"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"commonjs"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"es6"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"node"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"extends"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"airbnb-base"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"plugins"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"prettier"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"globals"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"Atomics"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readonly"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"SharedArrayBuffer"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"readonly"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"parserOptions"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"ecmaVersion"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="mi"&gt;2018&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"rules"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"prettier/prettier"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"error"&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Abra seu arquivo &lt;em&gt;index.js&lt;/em&gt;, faça uma pequena alteração nele e depois disso salve o arquivo. Era para o prettier ter formatado seguindo os padrões e regras (style guide do AirBnB) que definimos no nosso &lt;strong&gt;ESLint&lt;/strong&gt;. Isso não acontece porque precisamos avisar o VSCode que ele deve formatar os nossos arquivos toda vez que salvarmos eles. Para garantir que essa configuração funcionará no VSCode de outro desenvolvedor que venha programar no seu projeto, você tem que criar um arquivo chamado &lt;em&gt;settings.json&lt;/em&gt; que ficará dentro de uma pasta chamada &lt;em&gt;.vscode&lt;/em&gt; e ela tem que ficar na pasta raiz do seu projeto, por favor crie esse arquivo e essa pasta e dentro do arquivo adicione o código a seguir:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"editor.formatOnSave"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;


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

&lt;/div&gt;

&lt;p&gt;Se voltar ao arquivo &lt;em&gt;index.js&lt;/em&gt; e salvá-lo novamente verá que seu arquivo será formatado automaticamente seguindo os padrões configurados. Mas pera lá, você pode reparar que o seu ESLint está reclamando das aspas duplas, e foi o prettier que colou elas como padrão. É se você chegou a conclusão que o AirBnB gosta mais de aspas simples, é isso mesmo. Então por que o prettier não seguiu essa regra? Isso acontece porque o prettier segue todas as regras que o ESLint definiu, mas ele não sobreescreve as próprias regras, se você for até a página do plugin prettier verá que ele prefere usar por padrão as aspas duplas:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F62a5qzytlmgla4cutlhz.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F62a5qzytlmgla4cutlhz.png" alt="Tela das configuração do Prettier"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Para mudarmos isso e pedir para ele seguir a regra de aspas simples, precisamos criar um arquivo na raiz do projeto com o nome de &lt;em&gt;prettier.config.js&lt;/em&gt; e dentro dele terá um código que tem como objetivo sobreescrever o comportamento padrão do &lt;code&gt;prettier.singleQuote&lt;/code&gt; que hoje é &lt;code&gt;false&lt;/code&gt; para &lt;code&gt;true&lt;/code&gt;:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Agora se você voltar ao seu arquivo &lt;em&gt;index.js&lt;/em&gt; e salvá-lo, verá que ele será formatado para ficar com aspas simples.&lt;/p&gt;

&lt;p&gt;Só mais um detalhe. Se abrir o arquivo &lt;em&gt;prettier.config.js&lt;/em&gt; verá que ele tem alguns problemas de compatibilidade com o style guide do AirBnB que pedirmos para o ESLint utilizar. Mais uma vez temos um padrão do prettier que vai contra os padrões do style guide que escolhemos. Recomendo você sobreescrever algumas regras do prettier para nem você nem outros devs terem problemas no futuro. Por favor, volte ao arquivo &lt;em&gt;prettier.config.js&lt;/em&gt; e deixe ele com as seguintes configurações:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;

&lt;span class="nx"&gt;module&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;exports&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="na"&gt;tabWidth&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;semi&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;singleQuote&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="na"&gt;trailingComma&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;es5&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="p"&gt;};&lt;/span&gt;


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

&lt;/div&gt;

&lt;p&gt;Pronto! Isso é o necessário para o prettier funcionar bem com o ESLint uma vez que você está usando o style guide do AirBnB. O importante aqui é você entender que uma vez que você escolher outro style guide é necessário verificar se o prettier não estã entrando em conflito com o seu style guide e caso estiver você precisará mudar as configurações padrões do seu prettier.&lt;/p&gt;

&lt;p&gt;Fico muito feliz em poder trocar conhecimento com você, obrigado por ter lido o post. Se tiver qualquer dúvida não deixe de perguntar. Abraço bons estudos!&lt;/p&gt;

</description>
    </item>
    <item>
      <title>Como melhorar a qualidade de código com ESLint e Prettier?</title>
      <dc:creator>Marco Bruno 🤡</dc:creator>
      <pubDate>Tue, 29 Oct 2019 16:17:06 +0000</pubDate>
      <link>https://dev.to/collabcode/como-melhorar-a-qualidade-de-codigo-com-eslint-e-prettier-117j</link>
      <guid>https://dev.to/collabcode/como-melhorar-a-qualidade-de-codigo-com-eslint-e-prettier-117j</guid>
      <description>&lt;p&gt;Se você é a pessoa que gosta que o seu código esteja todo indentado da mesma forma, gosta de usar as mesmas aspas no seu código entre outros padrões mais complexos com objetivo de ter uma qualidade de código mais feliz, este post é para você. Ele também é para você que não gosta de seguir esses padrões chatos, provavelmente porque lhe dá muito trabalho e você considera isso uma perda de tempo.&lt;/p&gt;

&lt;p&gt;Nesse post mostrarei como automatizar todo esse processo de padrões e qualidade de código enquanto você está programando no seu VSCode.&lt;/p&gt;

&lt;p&gt;Então vamos para leitura entender qual é a magia por trás do ESLint e Prettier. Se você já sabe o que eles são, recomendo você pular para parte prática e ir direto para a seção: Como configurar ESLint e Prettier?&lt;/p&gt;

&lt;h2&gt;
  
  
  O que é ESLint?
&lt;/h2&gt;

&lt;p&gt;É um &lt;strong&gt;lint&lt;/strong&gt; ou &lt;strong&gt;linter&lt;/strong&gt; para &lt;strong&gt;JavaScript&lt;/strong&gt; e &lt;strong&gt;TypeScript&lt;/strong&gt;, sim ele também é usado no mundo TypeScript! A um tempo atrás tinhamos o TSLint mas hoje ele se tornou um plugin do ESlint e a comunidade e mercado de trabalho passaram a utilizar o ESLint para ambas as linguagens.&lt;/p&gt;

&lt;blockquote&gt;
&lt;h3&gt;
  
  
  O que é lint ou linter?
&lt;/h3&gt;

&lt;p&gt;O termo &lt;strong&gt;lint&lt;/strong&gt; ou &lt;strong&gt;linter&lt;/strong&gt; não é algo só do mundo JavaScript, esse termo surgiu faz bastante tempo no &lt;a href="https://en.wikipedia.org/wiki/Lint_(software)"&gt;mundo Unix para a linguagem C&lt;/a&gt;. A responsabilidade dos lints ou linters não mudaram, eles fazem para nós uma análise no nosso código antes mesmo do nosso software ser executado, portanto enquanto você escreve o seu código o linter acusará possíveis erros de programação, bugs, construções suspeitas, além de solicitar alterações para você seguir os padrões de indentações, aspas e qualquer outras regras que você tenha informado previamente para ele.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  O que é Prettier?
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Prettier&lt;/strong&gt; além de ter um logo maravilhoso é um plugin que não pode faltar no seu VSCode. Ele formata seu código de forma automática no momento que você salva seu arquivo, você pode configurar de forma bem simples os padrões que ele deve seguir nessa formatação automática que ele realiza, e na parte prática desse post eu vou mostrar como você pode falar para o prettier seguir as regras de formatação que definiremos no ESLint e dessa forma não vamos duplicar essas regras em dois lugares diferentes.&lt;/p&gt;

&lt;h2 id="eslint"&gt;Como configurar ESLint e Prettier?&lt;/h2&gt;

&lt;p&gt;O &lt;strong&gt;JavaScript&lt;/strong&gt; está cada vez mais poderoso, hoje podemos usá-lo no &lt;strong&gt;FrontEnd&lt;/strong&gt; com frameworks modernos como: &lt;strong&gt;React&lt;/strong&gt;, &lt;strong&gt;Vue&lt;/strong&gt; e &lt;strong&gt;Angular&lt;/strong&gt; (TypeScript). Além do movimento de compiladores de JavaScript para FrontEnd que vem crescendo com a adoção do &lt;strong&gt;Svelte&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Também podemos usar o &lt;strong&gt;JavaScript&lt;/strong&gt; no &lt;strong&gt;Backend&lt;/strong&gt; com o &lt;strong&gt;NodeJS&lt;/strong&gt; e frameworks como: &lt;strong&gt;Express&lt;/strong&gt; e &lt;strong&gt;Restify&lt;/strong&gt;. Temos também os frameworks que já adotaram &lt;strong&gt;TypeScript&lt;/strong&gt; como linguagem padrão como o &lt;strong&gt;NestJS&lt;/strong&gt;. Você pode usar &lt;strong&gt;JavaScript&lt;/strong&gt; até no mundo &lt;strong&gt;Mobile&lt;/strong&gt; com &lt;strong&gt;React Native&lt;/strong&gt;!&lt;/p&gt;

&lt;p&gt;Como o &lt;strong&gt;JavaScript&lt;/strong&gt; está em muitos lugares, mostrarei como você pode configurar o seu ESLint e Prettier em alguns deles. Agora só escolher o mundo que quer trabalhar e clicar em um dos links a seguir para absorver todo conhecimento que você precisa:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://dev.to/collabcode/como-configurar-eslint-e-prettier-no-node-3kga"&gt;Como configurar ESLint e Prettier no Node?&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Como configurar ESLint e Prettier no React? &lt;strong&gt;Escrevendo&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Como configurar ESLint e Prettier no Svelte? &lt;strong&gt;Escrevendo&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>javascript</category>
      <category>node</category>
      <category>react</category>
      <category>svelte</category>
    </item>
  </channel>
</rss>
