[ESTUDOS DE NODE.JS] O que é o Node.js

A documentação do Node.js o defini como:

Como um ambiente de execução JavaScript assíncrono orientado a eventos, o Node.js é projetado para desenvolvimento de aplicações escaláveis de rede.

O Eloquent Java Script, sobre o Node.js, escreve: permite ao programador utilizar suas habilidades de Javascript além do ambiente do browser. Com ele, é possível escrever desde pequenas ferramentas de linha de comando até servidores HTTP, poderosos.

Na documentação lemos o Node.js roda sobre o motor de Javascrip V8, do core do Google Chrome. O Node.js é single process o que significa que apenas podemos executar uma coisa de cada vez. Para lidar com isso, temos a Call Stack que empilha as tarefas e as executa na sequência da última, empilhada, para a primeiro. Mas isso não significa que a execução do app é interrupida quando for necessário executar uma ação demorada, como um requisição a uma API ou a busca por algum dado em um banco de dados. Nesses cenários, o Node.js tem o suporte de executar tarefas assíncronas, que relega a execução da tarefa mais demorada, enquanto continua a execução do fluxo de código.
Sendo que o Node faz um uso de apenas um thread ou um único processo. Ele lida com as I/O (entradas e saídas) de forma assíncrona.

O que é uma operação assíncrona

Uma operação assíncrona é quando o fluxo de execução do código não segue linha por linha. Durante a execução do software pode ocorrer que determinada ação demorar de estar pronta ou encerrar, a exemplo: uma requisição HTTP a uma API. Nesse caso, o fluxo de execução é continuado, sem seja interrompido. Quando a operação estiver terminada, é retornada ao fluxo de execução da aplicação.

Para tal feito, o Node.js recorre ao Event Loop, em que é baseado na biblioteca libuv. Segundo a documentação no site de biblioteca: A biblioteca fornece muito mais do que uma simples abstração sobre diferentes mecanismos de sondagem de E/S: 'handles' e 'streams' fornecem uma abstração de alto nível para soquetes e outras entidades; a funcionalidade de E/S e de threading de ficheiros em plataforma cruzada é também fornecida, entre outras coisas.

As tarefas (funções, chamada de API, leitura de arquivo, são exemplos) são iniciadas, caso não tenha um resultado imediato, ela é colocada em uma pilha de execução, e o código segue sendo executado, sem que seja interrupdo por aquela tarefa, mais demorada. Quando a tarefa é concluída, ela é devolvida para o fluxo de execução da aplicação. Conforme controle do Event loop.

Explicação do Event Loop na documentação.

A estrutura de dados da Call Stack é no formato Pilha, e a ordem que são adicionados e retirados os elementos é LIFO, Last In, First Out.

O colocar e retirar elementos da Call Stack é chamado de Stack Frame.

**Mais sobre o libuv

A maioria das pessoas pensa que o libuv é o event loop em si, isso não é verdade, além de implementar o event loop com todos os recursos, também é a casa de várias outras partes principais do Node, como:

Composição do Node

Fonte: https://dev.to/_staticvoid/node-js-por-baixo-dos-panos-1-conhecendo-nossas-ferramentas-34b6

O Node.js é composto de algumas dependências:

  • V8

  • Libuv

  • http-parser

  • c-ares

  • OpenSSL

  • zlib

As que ganha mais destaque é o V8, o seu motor de Javascript, e a Libuv, que implementar os principais módulos que fazem o Node.js funcionar.

Imagem representativa da arquitetura do Node:

Abstrações conceituais na LibUV

  1. Handles: Um handle são representações de objetos de longa vida que podem fazer algo enquanto estão ativos. Examples of handles are I/O devices, signals, timers or processes;

  2. Requests: Representa operações de curta duração. São utilizados para escrever dados em handles. Ao contrário dos handles que são objetos, os requests podem ser considerados funções ou métodos;

  3. Thread pool: O grupo de discussão encarrega-se da pesquisa do ficheiro I/O e DNS. Todas as chamadas de retorno, contudo, são executadas no fio principal. Desde o Node.js v10.5, os threads de trabalhadores também podem ser utilizados pelo programador para executar Javascript em paralelo.

Comando Node

Após a instalação do Node, é provido o comando node, no qual é utilizado para executar código JS em um arquivo. Como tamém serve para chamar um prompt REPL.