Finalmente entendendo Node.js
Tags: node, javascript, backend, eventloop
Published: 2020-11-16 15:05:10

Com esse artigo você vai entender o que é e como funciona Node.js de forma simples.

### Sumário

* Intro: Front-end e Back-end
* Javascript: o ‘js’ de Node.js
* Node.js: o que é, como foi feito e como funciona?
* Consideração final

## Intro: Front-end e Back-end

A arquitetura de uma aplicação web pode ser dividida em basicamente 2 componentes: o Front-end e o Back-end.
O Front-end é a interface do aplicativo, ou seja, toda estrutura que você vê em tela. Essa parte do projeto irá interagir diretamente com o usuário e por isso é tão relevante.

Já o Back-end é toda a inteligência por trás das cortinas. O usuário não o vê, mas é o que faz o aplicativo funcionar.
Esses 2 segmentos conversam o tempo todo.

#### Exemplo:

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/uosceoij22mgm1j3up7h.gif)

1. O Front-end exibe em tela um formulário de login.
2. Ao apertarmos o botão o Front-end faz uma requisição ao Back-end.
3. O Back-end, com os dados inseridos no formulário, verifica no servidor o e-mail e a senha e retorna se houve um erro ou se o usuário foi autenticado.
4. Com essa informação, o Front-end decide se exibe uma mensagem de erro ou se transfere o usuário para a página principal da aplicação.

## Javascript: o ‘js’ de Node.js

#### Javascript para front-end.
Definida como uma linguagem script para o ambiente web, Javascript é tradicionalmente aplicada no Front-end. Com seu uso, é possível construir sites e aplicações interativas e dinâmicas. Para isso os navegadores têm mecanismos, chamados também de [motores](https://en.wikipedia.org/wiki/JavaScript_engine), que são capazes de executar javascript.

#### Javascript para back-end?
Antes da existência de Node.js, javascript não era comumente utilizado para programação do Back-end. Pelo fato da linguagem ser interpretada ao invés de compilada, seu uso não era eficiente para essa finalidade e podia deixar o aplicativo web muito lento.

## Node.js

#### O que é?
Node.js é um ‘runtime enviroment’ de javascript. Em outras palavras: É um mecanismo responsável pela execução do programa de uma forma que torna eficiente o seu uso para Back-end. O seu reconhecimento deve-se à sua rapidez, responsividade e escalabilidade.

#### Como foi feito?
O Node foi construído com base no motor, desenvolvido e usado pelo Google Chrome, que executa javascript no browser, chamado V8 engine.

O V8 compila javascript em tempo de execução (compilação just-in-time) ao invés de interpretá-la. Isso, junto a uma série de outras características desse motor, acaba deixando a execução mais rápida.

#### Como funciona?
Ao pesquisar sobre Node.js você pode se deparar com termos como:

* Orientação a eventos
* Single-thread
* Event Loop
* Assíncrono
* I/O não bloqueante

Para explicar seu funcionamento e os termos acima, iremos expor a, comumente usada, analogia do restaurante.

Fazendo um paralelo de uma aplicação com um restaurante, os clientes seriam os usuários e seus pedidos seriam as requisições feitas. Sendo a cozinha o equivalente ao Back-end.

O comportamento dos garçons é o que será estudado conforme as características do Node.

Node.js opera com uma única thread (**single-thread**), designada como **event-loop**, que age de forma **orientada a eventos**. Em contrapartida, temos a abordagem thread-based, que funciona com múltiplas threads. No restaurante single-threaded existe somente um garçom e no multi-threaded, vários.

Mas como um restaurante com menos garçons vai realizar pedidos mais rapidamente?

Isso acontece por causa do comportamento de **I/O não bloqueante** que faz com que a cozinha atue de forma **assíncrona** dos garçons. Essa prática difere do modelo thread-based, onde cada garçom, ao fazer o pedido, deve esperar o prato ficar pronto para retornar o pedido à mesa e poder atender outro cliente. Considerando esse último modelo, um restaurante com X garçons e 1000X clientes teria um atendimento extremamente lento. Já o modelo com single-thread se mantém rápido e eficiente com muitos clientes, mesmo com só um garçom, ou seja, mesmo exigindo menos hardware. E é por isso que o uso de Node.js torna a aplicação altamente escalável.

![Alt Text](https://dev-to-uploads.s3.amazonaws.com/i/vu56r5x3kulmsqc540tb.gif)

Como o restaurnte da analogia funcionaria. Esquerda: com Node; Direita: abordagem thread-based.

## Consideração final

Então concluímos que Node.js é a melhor forma de programar um aplicativo web?

_Não necessariamente._

Em uma aplicação com um grande volume de requisições, Node pode ser a melhor pedida, mas num aplicativo cujas requisições exigem mais do CPU, como manipulação de imagens e vídeos por exemplo, optar Node.js não seria a melhor saída. Para entender melhor, imagine que no exemplo do restaurante, o tempo necessário para anotar o pedido de cada cliente seja maior que o tempo do prato ser preparado. Desse modo, a abordagem thread-based seria mais rápida.

Fontes:
[Dany York, 2011;](http://code.danyork.com/2011/01/25/node-js-doctors-offices-and-fast-food-restaurants-understanding-event-driven-programming/)
[StackPath, Robert Gibb, 2019;](https://blog.stackpath.com/v8-javascript-engine/)
[Programming with Mosh, 2018.](https://www.youtube.com/watch?v=uVwtVBpw7RQ&list=PLTjRvDozrdlydy3uUBWZlLUTNpJSGGCEm).