Introdução ao NodeJs

O node.js é um runtime de javascript, open source, baseado no motor de javascript V8 do Google Chrome que permite que o javascript seja executado fora do ambiente de um browser.

Um motor de javascript é um interpretador que traduz código de javascript em código máquina e depois o executa:

Dado que o node.js permite executar scripts de javascript fora do browser, estes podem ser executados num servidor.

Temos assim que podemos executar javascript num browser ou podemos executá-lo fora de um browser, no node.js:

O browser (neste caso, o Chrome) e o node, fornecem ambientes de execução diferentes ao motor V8.

No browser temos acesso a um conjunto de objetos como window e document os quais não existem no ambiente do node.

O nodejs é muitas vezes usado para construir serviços de backend ou APIs dada a sua rapidez de execução.

Estes serviços de backend ou APIs, correm no servidor e podem ser acedidos por aplicações cliente como aplicações web ou aplicações móveis.

O node.js é ideal para construir serviços de backend altamente escaláveis, em tempo real, com grande volume de dados que alimentam aplicações cliente.

Empresas como a Uber, Paypal, Netflix e Wallmart usam o node.js para os seus serviços de backend.

Características do node.js

  • O nodejs é assíncrono e orientado a eventos – Todas as APIs da biblioteca Node.js. são assíncronas, ou seja, sem bloqueio. Essencialmente, significa que um servidor baseado no node.js. nunca espera que uma API retorne dados. O servidor passa para a próxima API depois de a chamar e possui um mecanismo de notificação de eventos que ajuda o servidor a obter uma resposta da API chamada anteriormente.
  • Muito rápido – Sendo criada no mecanismo JavaScript V8 do Google Chrome, a biblioteca node.js. é muito rápida na execução do código.
  • Single threaded, mas altamente escalável – O node.js usa um modelo de uma única thread com loop de eventos. O mecanismo de eventos ajuda o servidor a responder de maneira não-obstrutiva e torna o servidor altamente escalável, em oposição aos servidores tradicionais, que criam threads limitados para lidar com pedidos. O node.js usa um programa com uma única thread mas pode fornecer serviços para um número muito maior de solicitações que servidores tradicionais como o Apache HTTP Server.

Para além destas características, o node.js permite escrever backend services com menos linhas de código e o programador pode fazer uso de uma miríade de bibliotecas open source existentes.

Uma grande vantagem é a de quer os programas cliente quer os programas no servidor usarem a mesma linguagem: javascript. Isto permite que um programador de frontend desenvolva igualmente código de backend, tornando-se um programador full stack, usando uma única linguagem.

Desvantagens do node.js

Dado que o node.js executa numa única thread, aplicações que façam uso intensivo do processador, como aplicações de tratamento de imagem ou vídeo não devem ser escritas em node.js.

Modo de funcionamento do node.js

O node.js funciona com base em pedidos assíncronos e não bloqueantes, por defeito.

O node.js usa uma única thread mas consegue atender vários pedidos devido ao carácter assíncrono dos pedidos, não ficando à espera que um pedido termine para atender outro.
Suponhamos que temos um pedido que implica acesso a uma base de dados para obter dados:

A única thread do node.js atende esse pedido mas não fica à espera que este obtenha os dados da base de dados. Ao invés, enquanto o primeiro pedido acede à base de dados, o node.js vai atender o próximo pedido:

Quando o primeiro pedido obtém os dados da base de dados, coloca uma mensagem num objeto chamado EventQueue. O node.js está constantemente a monitorizar o EventQueue para saber dos pedidos que terminaram a sua execução e, eventualmente, obter dados:

Este tipo de arquitetura torna o node.js ideal para aplicações baseadas num intenso acesso a disco ou à rede. O node.js pode servir mais clientes sem a necessidade de adicionar mais hardware. Ao contrário, o node.js não é recomendado para aplicações baseadas num processamento intensivo do CPU.

Event loop

O node.js funciona numa única thread, mas pode oferecer suporte à concorrência por meio do conceito de eventos e callbacks.

Toda API do node.js é assíncrona e, sendo um thread único, usa chamadas de função assíncronas para manter a concorrência. O node.js usa o padrão observer.

A thread do node.js mantém um loop de eventos e, sempre que uma tarefa é concluída, dispara o evento correspondente e executa a função de callback associada.

Numa aplicação orientada a eventos, geralmente há um loop principal que escuta eventos e, em seguida, dispara uma função de callback quando um desses eventos é detetado.

Instalação do node.js

O node.js pode ser obtido a partir do endereço https://nodejs.org/.

Será mostrada a seguinte página:

Deve ser descarregada a versão LTS que é a última versão estável.

No caso do Windows para instalar o nodejs basta executar o instalador que foi descarregado.

Para verificarmos se a instalação foi feita baixa abrirmos a janela de terminal e executar o comando

node -v

Será mostrada a versão do node que foi instalado:

O objeto global

Existe um conjunto de objetos que estão disponíveis a nível global, para todos os módulos, não havendo a necessidade de os incluir nas aplicações.

Esses objetos são propriedades de um objeto chamado global.

O objeto global está disponível a nível global sem necessidade de ser incluído na aplicação.
Um dos objetos que são propriedade do objeto global é o objeto console, que possui métodos para emitir mensagens na consola. O método mais comum é o método log().

Exemplo:

console.log("Bom dia"); 
global.console.log("Boa tarde");

Outro objeto presente no objeto global é o objeto process que nos dá informações sobre o processo corrente.
Para além destes objetos presentes no objeto global, temos as funções de temporização:

setImmediate(), setInterval(), setTimeout(), clearImmediate(), clearInterval(), clearTimeout().