<?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: Leonardo de Sá</title>
    <description>The latest articles on DEV Community by Leonardo de Sá (@leonardodesa).</description>
    <link>https://dev.to/leonardodesa</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%2Fuser%2Fprofile_image%2F679506%2F5fbb3291-1b3a-446d-b29f-bcdd478929e8.jpeg</url>
      <title>DEV Community: Leonardo de Sá</title>
      <link>https://dev.to/leonardodesa</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/leonardodesa"/>
    <language>en</language>
    <item>
      <title>Entendendo o Node.js e seu funcionamento</title>
      <dc:creator>Leonardo de Sá</dc:creator>
      <pubDate>Fri, 17 Sep 2021 23:18:44 +0000</pubDate>
      <link>https://dev.to/leonardodesa/entendendo-o-node-js-e-seu-funcionamento-1p9e</link>
      <guid>https://dev.to/leonardodesa/entendendo-o-node-js-e-seu-funcionamento-1p9e</guid>
      <description>&lt;h1&gt;
  
  
  Introdução
&lt;/h1&gt;

&lt;p&gt;Neste artigo, você irá entender &lt;strong&gt;o que é o Node.JS&lt;/strong&gt;, e a sua principal funcionalidade que é indispensável para qualquer desenvolvedor compreender o funcionamento da linguagem, chamada de &lt;strong&gt;Event Loop&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  O que é o Node.js
&lt;/h1&gt;

&lt;p&gt;Node.js, ou simplesmente Node, é um software de código aberto baseado no interpretador V8 do Google e que &lt;strong&gt;permite a execução do código javascript do lado do servidor&lt;/strong&gt; de forma simples, rápida e performática.&lt;/p&gt;

&lt;h1&gt;
  
  
  Interpretador do Node
&lt;/h1&gt;

&lt;p&gt;O Interpretador é um &lt;strong&gt;software especializado que interpreta e executa javascript&lt;/strong&gt;. O Node utiliza o Interpretador V8, que tem como proposta acelerar o desempenho de uma aplicação compilando o código Javascript para o formato que a máquina irá entender antes de executá-lo.&lt;/p&gt;

&lt;h1&gt;
  
  
  Call Stack
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;É uma pilha de eventos&lt;/strong&gt;, esses eventos podem ser uma função disparada pelo código. Por isso o event-loop fica monitorando para que, toda vez que uma função for disparada, ele deverá executá-la somente uma coisa por vez.&lt;/p&gt;

&lt;p&gt;Vamos ver um exemplo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxiywwa5zgbghfpkxt2k.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnxiywwa5zgbghfpkxt2k.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Aqui temos um exemplo bem simples para entendermos como funciona a stack. Basicamente a função &lt;strong&gt;&lt;code&gt;generateCarDescription&lt;/code&gt;&lt;/strong&gt; é chamada recebendo o nome do carro e sua versão, e retorna uma sentença com os parâmetros concatenados. A função &lt;strong&gt;&lt;code&gt;generateCarDescription&lt;/code&gt;&lt;/strong&gt; depende da função &lt;strong&gt;&lt;code&gt;generateNameAndVersion&lt;/code&gt;&lt;/strong&gt;, que é responsável por unir as informações de nome e versão.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme7byfq1flt535vpm4c3.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fme7byfq1flt535vpm4c3.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Quando a função &lt;strong&gt;&lt;code&gt;generateCarDescription&lt;/code&gt;&lt;/strong&gt; é invocada, ela depende da função &lt;strong&gt;&lt;code&gt;generateNameAndVersion&lt;/code&gt;&lt;/strong&gt; para atribuir o valor do nome e versão do carro na variável &lt;strong&gt;&lt;code&gt;nameAndVersion&lt;/code&gt;&lt;/strong&gt; e, quando ela for chamada, ela será adicionada na stack como no exemplo abaixo:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfsaq36vgr15mijwmxju.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fgfsaq36vgr15mijwmxju.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Após a execução da funcão &lt;strong&gt;&lt;code&gt;generateCarDescription&lt;/code&gt;&lt;/strong&gt;, logo em seguida a variável &lt;strong&gt;&lt;code&gt;nameAndVersion&lt;/code&gt;&lt;/strong&gt; irá receber o retorno da função &lt;strong&gt;&lt;code&gt;generateNameAndVersion&lt;/code&gt;&lt;/strong&gt; que foi imediatamente adicionada na stack, até que sua execução finalize e o retorno seja feito. Após o retorno, a stack ficará assim:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk43bpfytx9egpq80htrs.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fk43bpfytx9egpq80htrs.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A última etapa será retornar a variável &lt;strong&gt;&lt;code&gt;nameAndVersion&lt;/code&gt;&lt;/strong&gt;, que contém o nome e versão do veículo. Isso não irá alterar em nada na stack. Quando a função &lt;code&gt;generateCarDescription&lt;/code&gt; terminar, as demais linhas serão executadas. No nosso exemplo será o &lt;strong&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/strong&gt; imprimindo a variável &lt;strong&gt;&lt;code&gt;infoCar&lt;/code&gt;&lt;/strong&gt;. E por fim, será adicionado o &lt;strong&gt;&lt;code&gt;console.log()&lt;/code&gt;&lt;/strong&gt; quando tudo acima já estiver sido executado.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv2bw8bozdxyt0xvrqok.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fbv2bw8bozdxyt0xvrqok.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Como a &lt;strong&gt;stack só executa uma função por vez&lt;/strong&gt;, de acordo com o tamanho da função e o que será processado, isso irá ocupar mais tempo na stack, fazendo com que as próximas chamadas esperem mais tempo para serem executadas.&lt;/p&gt;

&lt;h1&gt;
  
  
  I/O - Operação bloqueante e não bloqueante
&lt;/h1&gt;

&lt;p&gt;I/O se refere, principalmente, à interação com o disco do sistema e a integração com a &lt;a href="https://libuv.org/" rel="noopener noreferrer"&gt;libuv&lt;/a&gt;.&lt;br&gt;
&lt;strong&gt;Operação bloqueante é a execução do código no processo do Node precisa esperar&lt;/strong&gt; até que uma operação seja concluída. Isso acontece porque o event loop é incapaz de continuar executando alguma tarefa, enquanto uma operação bloqueante está sendo executada.&lt;br&gt;
&lt;strong&gt;Todos os métodos I/O na biblioteca padrão do Node tem uma versão assíncrona, que, por definição, são não-bloqueantes&lt;/strong&gt;, e aceitam funções de callback. Alguns métodos também têm suas versões bloqueantes, que possuem o sufixo &lt;strong&gt;Sync&lt;/strong&gt; no nome. Para maiores Informações sobre I/O, acesse: &lt;a href="https://nodejs.org/pt-br/docs/guides/blocking-vs-non-blocking/" rel="noopener noreferrer"&gt;I/O&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Single-Thread
&lt;/h1&gt;

&lt;p&gt;O Node é uma plataforma orientada a eventos, que utiliza o conceito de thread única para gerenciar a stack. Quem é &lt;strong&gt;single thread é o v8 do Google&lt;/strong&gt;, responsável por rodar o código do Node, a stack faz parte do v8, ou seja, ela é single thread, que executa uma função de cada vez.&lt;/p&gt;

&lt;h1&gt;
  
  
  Multi-Threading
&lt;/h1&gt;

&lt;p&gt;Para trabalhar com operações paralelas, e obter um ganho de desempenho, o Node e sua stack por si só são incapazes de resolver múltiplas operações ao mesmo tempo, por isso, ele conta com uma lib chamada de &lt;a href="https://libuv.org/" rel="noopener noreferrer"&gt;libuv&lt;/a&gt;, &lt;strong&gt;que é capaz de gerenciar processos em background de I/O assíncrono não bloqueantes&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Exemplo de uma função assíncrona sendo executada:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flied917dt47n8cvnqdka.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Flied917dt47n8cvnqdka.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nesse exemplo, a função &lt;strong&gt;&lt;code&gt;setTimeout()&lt;/code&gt;&lt;/strong&gt; é executada na stack e jogada para uma thread, enquanto ela vai sendo processada e administrada pela libuv. A stack continua executando as próximas funções e, quando terminar o processamento, a função de callback será adicionada na Task Queue para ser processada quando a stack estiver vazia.&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfox2rznpsmkp7xp6bpe.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqfox2rznpsmkp7xp6bpe.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h1&gt;
  
  
  Task queue
&lt;/h1&gt;

&lt;p&gt;Algumas funções são enviadas para serem executadas em outra thread, permitindo que a stack siga para as próximas funções e não bloqueie nossa aplicação.&lt;br&gt;
Essas funções que são enviadas para outra thread precisam ter um callback, que é uma função que será executada quando a função principal for finalizada.&lt;br&gt;
Os callbacks aguardam a sua vez para serem executados na stack. Enquanto esperam, eles ficam em um lugar chamado de task queue. &lt;strong&gt;Sempre que a thread principal finalizar uma tarefa, o que significa que a stack estará vazia, uma nova tarefa é movida da task queue para a stack, onde será executada&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Aqui temos um exemplo para facilitar:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7p1f2dflk1st5fywlrnz.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7p1f2dflk1st5fywlrnz.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;O Event Loop é responsável por buscar essas tarefas de background, e executá-las na stack&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Micro e macro tasks
&lt;/h1&gt;

&lt;p&gt;&lt;strong&gt;O Event Loop é formado por macro tasks e micro tasks&lt;/strong&gt;. As macro tasks que serão enfileiradas no background, e que quando forem processadas, terão um callback dentro da task queue que será chamado quando a stack estiver vazia. dentro de cada ciclo, o &lt;strong&gt;event loop irá executar primeiramente as micro tasks&lt;/strong&gt; disponíveis. As micro tasks vão sendo processadas, até que a fila de microtask esteja esgotada, assim que todas as chamadas de micro tasks forem feitas, então no próximo ciclo, o callback da macro task que está na task queue será executado. Ou seja, &lt;strong&gt;dentro de um mesmo ciclo, as micro tasks, serão executadas antes das macro tasks&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Macro tasks
&lt;/h1&gt;

&lt;p&gt;Vou citar alguns exemplos de funções que se comportam como &lt;strong&gt;macro tasks&lt;/strong&gt;: &lt;strong&gt;&lt;code&gt;setTimeout&lt;/code&gt;&lt;/strong&gt;, &lt;strong&gt;&lt;code&gt;I/O&lt;/code&gt;&lt;/strong&gt; e &lt;strong&gt;&lt;code&gt;setInterval&lt;/code&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;h1&gt;
  
  
  Micro tasks
&lt;/h1&gt;

&lt;p&gt;Alguns exemplos conhecidos de &lt;strong&gt;micro tasks&lt;/strong&gt; são as &lt;strong&gt;&lt;code&gt;promises&lt;/code&gt;&lt;/strong&gt; e o &lt;strong&gt;&lt;code&gt;process.nextTick&lt;/code&gt;&lt;/strong&gt;. As micro tasks normalmente são tarefas que devem ser executadas rapidamente após alguma ação, ou realizar algo assíncrono sem a necessidade de inserir uma nova task na task queue.&lt;br&gt;
Vamos tentar entender melhor com alguns exemplos, coloquei algumas anotações para facilitar o entendimento:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuemly3cddxmt7hc4rfnf.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fuemly3cddxmt7hc4rfnf.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ao executar o código acima, teremos o seguinte resultado de priorização:&lt;br&gt;
&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w2ul7vpuds9cf6aws2d.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%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F1w2ul7vpuds9cf6aws2d.png"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Você deve estar se perguntando o porquê não está sendo executado em ordem, vou tentar explicar com as anotações que fiz no código.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[A]&lt;/strong&gt;: &lt;strong&gt;Executado diretamente na stack&lt;/strong&gt;, dessa forma ele é síncrono, então o restante do código irá aguardar o resultado para ser executado.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[B]&lt;/strong&gt;: Enfileirado como uma tarefa futura, &lt;strong&gt;prioridade macro task&lt;/strong&gt;, será executado apenas no próximo loop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[C]&lt;/strong&gt;: Enfileirado como uma tarefa futura, &lt;strong&gt;prioridade micro task&lt;/strong&gt;, será executado imediatamente após todas as tarefas/tasks do loop atual e antes do próximo loop.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;[D]&lt;/strong&gt;: &lt;strong&gt;Executado diretamente na stack&lt;/strong&gt;, dessa forma ele é síncrono, então o restante do código irá aguardar o resultado para ser executado.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

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

&lt;p&gt;&lt;strong&gt;Nesse artigo vimos o que é o Node e como ele funciona “por baixo dos panos”&lt;/strong&gt;, espero que vocês tenham entendido com clareza e que essa visão ajude vocês a escreverem códigos melhores e de uma maneira que tire maior proveito desse funcionamento. Aconselho também a leitura complementar dos links de referências que irão facilitar o entendimento.&lt;/p&gt;

&lt;h1&gt;
  
  
  Links relacionados
&lt;/h1&gt;

&lt;p&gt;&lt;a href="https://nodejs.org/pt-br/docs/guides/blocking-vs-non-blocking/" rel="noopener noreferrer"&gt;https://nodejs.org/pt-br/docs/guides/blocking-vs-non-blocking/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://imasters.com.br/front-end/node-js-o-que-e-esse-event-loop-afinal" rel="noopener noreferrer"&gt;https://imasters.com.br/front-end/node-js-o-que-e-esse-event-loop-afinal&lt;/a&gt;&lt;br&gt;
&lt;a href="https://fabiojanio.com/2020/03/12/introducao-ao-node-js-single-thread-event-loop-e-mercado/" rel="noopener noreferrer"&gt;https://fabiojanio.com/2020/03/12/introducao-ao-node-js-single-thread-event-loop-e-mercado/&lt;/a&gt;&lt;br&gt;
&lt;a href="https://oieduardorabelo.medium.com/javascript-microtasks-e-macrotasks-fac33016de4f" rel="noopener noreferrer"&gt;https://oieduardorabelo.medium.com/javascript-microtasks-e-macrotasks-fac33016de4f&lt;/a&gt;&lt;br&gt;
&lt;a href="https://www.youtube.com/watch?v=8aGhZQkoFbQ" rel="noopener noreferrer"&gt;https://www.youtube.com/watch?v=8aGhZQkoFbQ&lt;/a&gt;&lt;/p&gt;

</description>
      <category>node</category>
      <category>javascript</category>
      <category>programming</category>
      <category>tutorial</category>
    </item>
  </channel>
</rss>
