[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:
Sockets TCP e UDP do pacote
net
Resoluções DNS assíncronas
Operações assíncronas de arquivos e file system
Eventos do file system
IPC
Child processes e controle de shell
Controle de threads
Sinalização
Relógio de alta resolução Fonte: https://dev.to/_staticvoid/node-js-por-baixo-dos-panos-3-um-mergulho-no-event-loop-38l9
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
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;
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;
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.