Bem Vindo ao Node.js
Node.js é um assíncrono, é uma funcionalidade que o JavaScript fornece em tempo de execução como uma biblioteca concisa. É mantida e fornecida pela Fundação Node.js. Há duas verões de Node: Long-Term Support(LTS) e a corrente. Se você quer saber mais sobre o Node, visite a documentação no site (https://nodejs.org/en/).
Desde que o Node.js apareceu em 2009, o JavaScript vem ganhando terreno na programação entre os desenvolvedores. Isto deve em grande parte a chegada do ECMAScript 2015, o qual resolveu vários problemas críticos da versão anterior. Node utiliza o Google’s V8 JavaScript engine, que é baseado na sexta edição do ECMAScript, o qual pode ser chamado de ES6 ou ES2015. Isto trouxe inovações tecnológica, tais como, Node, React e Electron, isto permitiu a utilização do JavaScript em qualquer lugar: do servidor ao navegador e aplicações nativas para mobiles. Mesmo grande companhias como a Microsoft estão utilizando o JavaScript e a Microsoft tem até contribuído com o sucesso do Node.
Uma Típica Aplicação Web Node
Uma das forças do Node e JavaScript é o modelo de programação single-threaded. Threads são fontes comuns de erro, embora algumas linguagens de programação mais atual, incluindo Go e Rust, estão tentando produzir ferramentas para proteger contra isto, o Node continua como o modelo utilizado no navegador. No código baseado no navegador, nós escrevemos uma sequência de instruções que executam uma por uma, o código não executa nada em paralelo. Os usuários comuns não entendem isto, contudo eles não suportam lentidões tais como: acessar a rede ou fazer um download de um arquivo. Os navegadores utilizam eventos, por exemplo, quando você clica em um botão, um evento é disparado e uma função é executada conforme foi definida antes, mas que ainda não foi executada. Isto evita alguma problemas encontrados na programação de threaded, incluindo resource deadlocks e race conditions.
Nonblocking I/O
O que significa em um contexto a programação server-side? A situação é similar a: requisições I/O tais como acesso a dico e rede que são comparativamente lentas, nós não queremos executar em tempo de execução a camada lógica de negócio enquanto lemos arquivos ou mandamos mensagem na rede. Para resolver isto, o Node usa três técnicas: eventos, APIs assíncronas e Nonblocking I/O. Nonblocking I/O é um termo de baixo nível do ponto de vista dos programadores do Node. Isto significa que o seu programa pode fazer um request para um recurso da rede enquanto faz outra coisa, e quando a operação da rede termina um callback irá mostrar o resultado.
A imagem mostra uma típica aplicação web Node que utiliza uma biblioteca de aplicações web chamada Express para manipular um fluxo de pedidos de uma loja. O navegador faz um request para comprar um produto, e a aplicação checa o estoque, cria uma conta para o usuário, envia o recibo por email e recebe uma resposta em JSON HTTP. Junto com isto, outras coisas também são executada: um email com recibo é enviado e o banco de dados é atualizado com os detalhes da compra do usuário. O código em si é simples, a maior parte feita em JavaScript, mas o que ocorre em tempo de execução utiliza o Nonblocking I/O.
O banco de dados é acessado pela rede. No Node, quem acessa a rede é o Nonblocking, porque o Node utiliza a biblioteca libuv(http://libuv.org/) para fornecer acesso ao sistema operacional do Nonblocking a rede. Esta implementação é diferente no Linux, macOs e Windows, mas não precisa se preocupar porque a biblioteca do JavaScript resolve isto. Enquanto você escreve um código como db.insert(query, err -> {}), o Node está fazendo uma otimização nos bastidores da rede Nonblocking.
O acesso a disco é similar, mas não é igual. Quando um recibo de email é gerado e o template do email é lido pelo disco, libuv utiliza uma thread pool para fornecer a ilusão que um Nonblocking estão sendo utilizado. Manipular uma thread pool não é tão divertido assim, mas escrever email.send(‘template.ejs’, (err, html) -> {}) é muito mais fácil de entender.
O benefício de utilizar APIs assíncronas com Nonblocking I/O é que o Node pode fazer outras coisas enquanto processos mais lentos são executados. Apesar de você está executando apenas um single-threaded, um single-process de um app web Node, pode-se manipular mais do que uma conexão e potencialmente milhares de visitantes de uma vez em um site. Para entender isto você deve dar uma olhada no event loop.
Node.js in Action, Second Edition
#node
Deixe um comentário