[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.
Subscribe to my newsletter
Read articles from Plínio Hávila directly inside your inbox. Subscribe to the newsletter, and don't miss out.
Written by
Plínio Hávila
Plínio Hávila
Programador Entusiasta