<?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: Fábio J L Ferreira</title>
    <description>The latest articles on DEV Community by Fábio J L Ferreira (@fabiojanio).</description>
    <link>https://dev.to/fabiojanio</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%2F704759%2Fd172f196-f819-441b-8819-1b196bade164.jpeg</url>
      <title>DEV Community: Fábio J L Ferreira</title>
      <link>https://dev.to/fabiojanio</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/fabiojanio"/>
    <language>en</language>
    <item>
      <title>Introdução ao Node.js (Single-Thread, Event-Loop e mercado)</title>
      <dc:creator>Fábio J L Ferreira</dc:creator>
      <pubDate>Tue, 28 Nov 2023 02:19:54 +0000</pubDate>
      <link>https://dev.to/fabiojanio/introducao-ao-nodejs-single-thread-event-loop-e-mercado-17pk</link>
      <guid>https://dev.to/fabiojanio/introducao-ao-nodejs-single-thread-event-loop-e-mercado-17pk</guid>
      <description>&lt;p&gt;Este capítulo não tem por finalidade contar a história do Node.js, afinal de contas o site oficial e o guia de inicio rápido fazem isso muito bem. Serei prático e objetivo ao abordar somente os conceitos essenciais, logo indispensáveis a qualquer “desenvolvedor aventureiro”.&lt;/p&gt;




&lt;h2&gt;
  
  
  Livro
&lt;/h2&gt;

&lt;p&gt;Este conteúdo representa um texto de amostra (primeira versão ainda em desenvolvimento) do Livro Node.js para iniciantes. Para acompanhar o desenvolvimento, acesse: &lt;a href="https://github.com/fabiojaniolima/livros#livros"&gt;https://github.com/fabiojaniolima/livros#livros&lt;/a&gt;&lt;/p&gt;




&lt;h2&gt;
  
  
  O que é Node.js
&lt;/h2&gt;

&lt;p&gt;No guia oficial de começo rápido (Quick Start), temos basicamente a seguinte introdução:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;O Node.js é um ambiente de tempo de execução JavaScript de código aberto e multiplataforma. É uma ferramenta popular para quase qualquer tipo de projeto!&lt;/p&gt;

&lt;p&gt;O Node.js executa o motor JavaScript V8, o núcleo do Google Chrome, fora do navegador. Isso permite que o Node.js seja muito eficiente.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;Para maiores detalhes a respeito, bem como para conhecer a história da plataforma, acesse: &lt;a href="https://nodejs.dev/introduction-to-nodejs"&gt;https://nodejs.dev/introduction-to-nodejs&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Em outras palavras, o Node.js é um runtime JavaScript server-side, ou seja, uma solução que possibilita ao desenvolvedor executar aplicações escritas em JavaScript do lado do servidor, de forma simples, rápida e performática. Isso é possível basicamente graças ao motor V8 e a biblioteca libuv — solução open-source para a qual dedicaremos mais algumas linhas logo adiante.&lt;/p&gt;

&lt;p&gt;O JavaScript é considerado uma linguagem interpretado, porém, internamente o Node.js, mais precisamente o motor V8 realiza a compilação do código utilizando just-in-time (JIT) afim de acelerar o processo de execução do código.&lt;/p&gt;

&lt;h2&gt;
  
  
  Uma sugestão de amigo
&lt;/h2&gt;

&lt;p&gt;Antes de continuarmos, é muito importante que você tenha conhecimento dos links abaixo e gaste ao menos alguns minutos apreciando o que eles tem a oferecer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;A coleção de guias e artigos oficiais: &lt;a href="https://nodejs.org/en/docs/guides"&gt;https://nodejs.org/en/docs/guides&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;A documentação de referência das APIs nativas: &lt;a href="https://nodejs.org/api"&gt;https://nodejs.org/api&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Stack Overflow, este é um espaço (fórum/comunidade) onde você poderá achar soluções para os problemas que irá encontrar durante a longa jornada: &lt;a href="http://pt.stackoverflow.com"&gt;http://pt.stackoverflow.com&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Funcionamento básico
&lt;/h2&gt;

&lt;p&gt;Muitos iniciantes enfrentam dificuldades ao tentar compreender o ciclo de vida dos eventos no Node.js. Pode parecer complexo à primeira vista, mas as aparências enganam. A compreensão deste processo se torna mais acessível ao focarmos em dois conceitos fundamentais: Single-Thread e Event-Loop.&lt;/p&gt;

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

&lt;p&gt;Node.js é uma plataforma orientada a eventos que opera sob o princípio de uma única thread, gerenciando eficientemente a pilha de eventos ou Call Stack. Esta pilha adota a estratégia LIFO (Last In, First Out), onde a última entrada é a primeira a ser processada. As operações de fundo, ou background, são administradas por ‘workers’ que operam em segundo plano, e estes podem executar tarefas multi-thread.&lt;/p&gt;

&lt;p&gt;Os "workers" são, essencialmente, processos de I/O assíncronos e não-bloqueantes, gerenciados pela libuv. Esta é uma biblioteca open-source, multiplataforma, escrita em C, que se vale de um pool de threads para gerir operações paralelas. A abordagem de thread única na gestão da Call Stack é vital para o alto desempenho do Node.js.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;🔗 Para uma exploração mais aprofundada deste conceito, sugiro consultar: The Node.js Event Loop, Timers, and process.nextTick()&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Event-Loop
&lt;/h3&gt;

&lt;p&gt;Ao tratar do Event-Loop, evitarei detalhar aspectos mais complexos e momentaneamente desnecessários, como Micro Task Queue, Next Tick Queue, Timers Queue, Immediates Queue, entre outros. Em vez disso, vamos nos concentrar no que de fato é relevante neste momento.&lt;/p&gt;

&lt;p&gt;O Event-Loop é responsável por monitorar a Call Stack e processar eventos. Quando um evento é detectado e não representa uma operação extensa, ele é executado imediatamente. Operações mais longas, como leituras em disco ou comunicações de rede, são despachadas para um “worker” em um thread separado. Isso libera o Event-Loop para continuar processando outros eventos na pilha. Uma vez concluída a operação em segundo plano, sua função de callback é enfileirada e aguarda a liberação do Event-Loop para ser executada.&lt;/p&gt;

&lt;p&gt;Este modelo permite que o Node.js lide eficientemente com I/O assíncrono, evitando bloqueios e mantendo a aplicação responsiva.&lt;/p&gt;

&lt;p&gt;A seguir, apresento uma representação simplificada do Event-Loop e seu funcionamento, focando em transmitir a essência desse mecanismo de forma acessível:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--adLyKQ7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/upc0la3hlm6ezj6aunho.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--adLyKQ7---/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/upc0la3hlm6ezj6aunho.png" alt="Representação simples e abstrata do Event-Loop." width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Talvez eu seja um pouco repetitivo agora, porém, vamos analisar a imagem acima aproveitando para revisar o que foi apresentado previamente:&lt;/p&gt;

&lt;p&gt;No Node.js, os eventos são empilhados na Stack. O Event-Loop monitora essa Stack, identificando e processando eventos. Para eventos que não requerem operações extensas, a execução é imediata, permitindo que o Event-Loop passe rapidamente para o próximo evento.&lt;/p&gt;

&lt;p&gt;Entretanto, eventos que envolvem “operações longas” — como leitura de arquivos ou comunicação de rede — são abordados de maneira diferente. Nesses casos, o Event-Loop delega a tarefa, junto com sua função de callback, ao Background Thread. Aqui, a libuv entra em cena, gerenciando a operação em um thread separado. Isso permite que o Event-Loop continue processando outros eventos na Stack sem interrupções.&lt;/p&gt;

&lt;p&gt;Uma vez concluída a operação pelo Background Thread, a função de callback é colocada na Task Queue. O Event-Loop, que opera em uma única thread, só processará esta callback após finalizar as tarefas correntes na Stack. Esta abordagem assegura um gerenciamento eficiente de múltiplas tarefas pelo Event-Loop, alternando entre execuções rápidas de operações breves e o manejo de operações mais demoradas em segundo plano.&lt;/p&gt;

&lt;p&gt;Esta estrutura é vital para a eficiência do Node.js, habilitando-o a lidar com um volume elevado de operações de I/O de forma não-bloqueante e assíncrona.&lt;/p&gt;

&lt;p&gt;Veja um exemplo prático de funcionamento:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--8hxWSpGG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxsj97pem1icjwuh9g48.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--8hxWSpGG--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xxsj97pem1icjwuh9g48.png" alt="Representação simples e abstrata do Event-Loop e seu funcionamento." width="800" height="520"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;No exemplo ilustrado, temos dois eventos na Stack. O primeiro a ser processado é o &lt;code&gt;fs.readFile()&lt;/code&gt;, seguindo o princípio LIFO (Last In, First Out) da Stack. Sendo &lt;code&gt;fs.readFile()&lt;/code&gt; uma operação de I/O em disco — portanto, uma operação mais lenta e potencialmente bloqueante — ela é delegada para execução em background pela libuv.&lt;/p&gt;

&lt;p&gt;Quando esta tarefa de leitura de arquivo é concluída, seu callback é colocado na Task Queue. Este callback aguardará sua vez para ser transferido para a Stack. E quando acontecerá essa transferência? Acontecerá quando a Stack estiver vazia. Nesse momento, o callback é movido da Task Queue para a Stack e, finalmente, processado pelo Event-Loop.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Caso tenha interesse em aprofundar no assunto, acesse: &lt;a href="https://dev.to/khaosdoctor/node-js-por-baixo-dos-panos-3-um-mergulho-no-event-loop-38l9"&gt;https://dev.to/khaosdoctor/node-js-por-baixo-dos-panos-3-um-mergulho-no-event-loop-38l9&lt;/a&gt; e &lt;a href="https://imasters.com.br/front-end/node-js-o-que-e-esse-event-loop-afinal"&gt;https://imasters.com.br/front-end/node-js-o-que-e-esse-event-loop-afinal&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Vantagens da plataforma
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gerenciador de pacotes nativo (NPM)&lt;/strong&gt;: Instalando o Node.js, você obtém o NPM, um poderoso gerenciador de pacotes, facilitando o início do desenvolvimento.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;JavaScript em Todo Lugar&lt;/strong&gt;: Com o Node.js, o JavaScript, anteriormente limitado a funções de front-end, expande seu alcance para o back-end, mobile e desktop, dinamizando o desenvolvimento e a manutenção.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Comunidade Ativa e Integrada&lt;/strong&gt;: A união das comunidades de Node.js e JavaScript promove uma sinergia poderosa, apoiando desde tarefas de desenvolvimento front-end até automações complexas.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Eficiência e Leveza&lt;/strong&gt;: O modelo de Event-Loop do Node.js garante uma performance excepcional, otimizando o uso de RAM e CPU e evitando a sobrecarga por processos múltiplos.
I/O Não-Bloqueante: O Node.js lida com operações de I/O de forma assíncrona e não-bloqueante, mantendo a fluidez do fluxo de trabalho.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ecossistema Rico&lt;/strong&gt;: Com um vasto repositório de bibliotecas e módulos disponíveis no NPM, o Node.js atende a uma ampla gama de necessidades de desenvolvimento.
Multiplataforma: Funcionando em diversas plataformas como Windows, macOS e Linux, o Node.js oferece grande versatilidade.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Ideal para Aplicações em Tempo Real&lt;/strong&gt;: Seu modelo assíncrono torna o Node.js perfeito para aplicações que exigem processamento em tempo real, como chats e jogos online.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Quem está utilizando?
&lt;/h2&gt;

&lt;p&gt;O Node.js é amplamente adotado por uma variedade de usuários, desde indivíduos até grandes corporações, incluindo empresas renomadas como:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Netflix&lt;/li&gt;
&lt;li&gt;Trello&lt;/li&gt;
&lt;li&gt;Paypal&lt;/li&gt;
&lt;li&gt;LinkedIn&lt;/li&gt;
&lt;li&gt;Walmart&lt;/li&gt;
&lt;li&gt;Uber&lt;/li&gt;
&lt;li&gt;Medium&lt;/li&gt;
&lt;li&gt;Groupon&lt;/li&gt;
&lt;li&gt;Ebay&lt;/li&gt;
&lt;li&gt;NASA&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;E a lista vai longe…&lt;/p&gt;

&lt;h2&gt;
  
  
  Vale a pena investir em JavaScript?
&lt;/h2&gt;

&lt;p&gt;Dada a prevalência do JavaScript nas soluções baseadas no Node.js (incluindo TypeScript, que é transpilado para JavaScript), o investimento nesta linguagem é altamente vantajoso. Pesquisas anuais do Stack Overflow consistentemente classificam o JavaScript como uma das linguagens mais populares, reforçando sua relevância e demanda no mercado de desenvolvimento.&lt;/p&gt;

&lt;p&gt;O Stack Overflow, reconhecida mundialmente como uma das comunidades mais influentes entre os desenvolvedores, realiza anualmente um levantamento detalhado sobre tecnologias, linguagens e tendências do setor de TI. Nas pesquisas realizadas de 2014 a 2021, a linguagem JavaScript destacou-se consistentemente, ocupando a posição de liderança no ranking das linguagens preferidas pelos desenvolvedores. Notavelmente, em 2013, o JavaScript ficou em segundo lugar, superado apenas pela linguagem SQL.&lt;/p&gt;

&lt;p&gt;Em 2022:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--9bgBnsNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0y2d0ipdnbfzi8vchcx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--9bgBnsNH--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_800/https://dev-to-uploads.s3.amazonaws.com/uploads/articles/w0y2d0ipdnbfzi8vchcx.png" alt="Relatório 2022. Fonte: https://survey.stackoverflow.co/2022#most-popular-technologies-language" width="800" height="959"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Acesse todos os relatórios em: &lt;a href="https://insights.stackoverflow.com/survey"&gt;https://insights.stackoverflow.com/survey&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Esses dados reforçam claramente a existência de uma demanda significativa no mercado para profissionais com conhecimento em JavaScript. O fato de a procura por essa habilidade permanecer elevada por um período extenso não apenas sugere uma necessidade constante desses profissionais, mas também sinaliza uma evolução contínua da tecnologia, atendendo e superando as expectativas do setor.&lt;/p&gt;

&lt;p&gt;Vai JavaScript, ao infinito e além! 🚀🚀 🚀&lt;/p&gt;

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