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".

O que é Node.js

No guia oficial de começo rápido (Quick Start), temos basicamente a seguinte introdução:

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!

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.

<aside> 🔗 Para maiores detalhes, bem como para conhecer a história da plataforma, acesse: https://nodejs.dev/introduction-to-nodejs

</aside>

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.

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.

Uma sugestão de amigo

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:

Funcionamento básico

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.

Single-Thread

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.

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.

<aside> 🔗 Para uma exploração mais aprofundada deste conceito, sugiro consultar: The Node.js Event Loop, Timers, and process.nextTick()

</aside>

Em capítulos posteriores, exploraremos diversas estratégias para implementar processamento paralelo e escalabilidade em aplicações Node.js. Algumas dessas estratégias incluem: