Introdução ao NodeJS
Quando se trata de aprender uma nova linguagem - ou neste caso, uma plataforma - é sempre pertinente recorrermos a documentação. A oficial do NodeJS começa da seguinte forma:
O que é NodeJS?
NodeJS não é uma linguagem de programação e sim uma cross-platform que roda um ambiente em Javascript, a linguagem usada é o próprio JS. NodeJS roda em cima da V8 engine que é o core do google chrome. Neste caso, o Node interpreta e executa o código em Javascript mesmo fora do navegador. Antes, o código em JS só era executado dentro do próprio navegador, mas após a criação do Node é possível fazer muito mais com JavaScript, assim como outras linguagens interpretadas.
Por que NodeJS?
Cá estou em mais mais um dos textos falando de outra stack que já tive o prazer de trabalhar escrevendo aplicações. Já trabalhei com NodeJS em uma de minhas empresas: ele fazia o papel de uma API web entre uma aplicação mobile híbrida com um banco de dados. Nessa instância, a aplicação era responsável por liberar acessos a pacotes pagos em meu negócio, uma senhora responsabilidade, não.
Em um outro trabalho, desta vez para uma empresa que cuidava de pagar contas de forma automática para seus clientes via seus cartões de crédito, o NodeJS era usado para acessar os serviços dos provedores das contas de água, luz, telefone e retornar o código de barras para a outra aplicação que efetivamente fazia os pagamentos via um outro serviço que cobrava do cartão do cliente.
Acima estão dois exemplos bem distintos, todavia bem críticos de aplicações que funcionam com NodeJS e a WEB está repleta deles. Abaixo vamos falar mais um pouco sobre as razões de usar NodeJS.
1- Muita velocidade apesar de ter apenas 1 thread
De forma simplificada NodeJS é assíncrono e single thread (o fator de uma única thread não é tão simples assim conforme este artigo ilustra). Isso significa que as operações não irão travar umas às outras, na verdade elas irão executar de forma concorrente. Então uma operação não irá esperar a outra finalizar para outra começar a executar, na verdade todas elas irão executar ao mesmo tempo fazendo uso do event loop. Isso acontece sem o Node criar uma nova thread para cada operação.
Logo você pode se perguntar: mas o que acontece por exemplo caso uma operação leve alguns segundos para executar, como essa plataforma lida com isso? O Node irá continuar a executar todas as operações e retornará a resposta quando ela for retornada, sem travar as outras operações em progresso. E qual o resultado disso? A própria documentação oficial ilustra:
Ou seja, ganha-se a possibilidade de suportar múltiplas conexões ou operações sem introduzir a necessidade de inserir a complexidade de threads.
2- Baixa curva de aprendizagem
Por ser escrito na linguagem nativa da WEB, o Javascript Node tem uma vantagem clara em relação às outras: já existem milhões de desenvolvedores de front end capazes de escreverem aplicações em Node sem precisarem passar por uma curva de aprendizagem para aprender uma nova linguagem. Pensando em times full stack por exemplo, os desenvolvedores conseguem construir tanto o front quanto back da aplicação em uma única linguagem. Desta maneira qualquer desenvolvedor independente do seu nível apenas o javascript é requerido para escrever o back, front e ate mobile. Isto facilita contratação, tempo de aprendizagem e velocidade de desenvolvimento das aplicações dentre as equipes.
3- NPM
Algo que um desenvolvedor sempre deveria checar antes de escolher uma linguagem ou framework é se existem bibliotecas para lidar com problemas usuais da nossa vida de desenvolvedor. Ao precisar criptografar uma senha, conectar ao banco de dados relacional comumente procuramos automaticamente por uma biblioteca que vai abstrair a parte de level mais baixo dessa funcionalidade. Desta forma conseguimos resolver o problema algumas com algumas linhas de código, importando e usando a library que foi selecionada. É esta necessidade que faz do NPM - node package manager uma grande vantagem ao usar o NodeJS. Ele é o maior repositório de software existente e conta com bibliotecas para resolver os mais diferentes problemas.
4- Vasta comunidade
Acabamos de ilustrar um pouco a respeito da importância e utilidade do NPM para o desenvolvimento de aplicações. É importante ressaltar que só é possível ter tantas bibliotecas diferentes e uma base tão grande cheia delas devido a uma comunidade que é grande, super ativa e útil para quem está desenvolvendo. Qualquer dúvida que você procurar no google ou stackoverflow provavelmente já foi questionada e respondida anteriormente. Realmente uma mão na roda para quem desenvolve.
Casos de uso interessantes
1- Aplicações que se atualizam em tempo real - imagine um grande dashboard que atualiza diversas informações do mercado financeiro para mostrá-las ao usuário. É um desafio conseguir e mostrar todas essas informações desejadas. Neste caso, o event loop do NodeJS pode ser usado para construir uma aplicação WEB que busca e valida essas informações de forma assíncrona e não blockante. E os dados podem ser enviados ao dashboard fazendo uso de websockets.
2- Data Streaming - este é um dos conceitos fundamentais por trás do NodeJS. O termo streaming se trata de um fluxo de dados, muito útil para trabalhar com um grande volume de dados. Ao usar esse componente você pode enviar e receber pedaços de um grande arquivo e processar seu conteúdo sem mantê-lo em memória. Podemos pensar em streams fazendo uma analogia a escutar uma música em algum serviço de streaming. Neste caso você não precisa fazer o download da música antes de escutá-la, mas você recebe a música em pedaços, tanto que se você ficar sem internet certamente a música irá parar no meio a não ser que todos os seus pedaços já tenham sido baixados.
Existem duas grandes vantagens ao usar esse recurso, são elas:
- Memória: não é necessária a alocação de uma grande quantidade de memória para processá-las. É possível alocar apenas o que for necessário para aquele pedacinho dos dados.
- Eficiência de tempo: ao invés de ter que aguardar toda a carga de dados ser transmitida para processá-la é possível iniciar assim que você possui o dado.
3- Web scraping - esse é o conceito de extração de informações de páginas da web. Lembra da aplicação que mencionei que trabalhei, um serviço que buscava as contas dos clientes para pagar com seu cartão de crédito automaticamente? Em algumas partes dessa aplicação Web scraping era usado para pegar certas informações das contas e poder pagá-las.
Desta forma, se não houvesse um suporte oficial do provedor de serviço de luz, água e outros era possível buscar as informações direto no painel do cliente usando seus dados de acesso ao painel do provedor. O NodeJS foi escolhido aqui devido a quantidade de bibliotecas disponíveis para auxiliar nesta tarefa como cheerio e request.
Seu primeiro Hello World com NodeJS
Vamos colocar a mão na massa agora e construir nossa primeira aplicação em Node.
O primeiro passo é instalar a ferramenta na sua máquina. Existem algumas variações da instalação dependendo de qual é o seu sistema operacional. Ao acessar a página principal dela, os comandos de instalação já são mostrados para cada sistema operacional:
Acesse a página e execute os comandos necessários. Não estou informando-os por que eles podem alterar com as futuras versões do Node.
Após a conclusão da instalação vamos criar o arquivo index.js e colocar o seguinte código dentro dele:
const http = require('http');
http.createServer(function (request, response) {
response.writeHead(200, {'Content-Type': 'text/html'});
response.end('Hello World!');
}).listen(8080, 'localhost');
Vamos entender o que fizemos no código acima:
- Importamos o módulo http. Essa interface do NodeJS é responsável para suportar as diversas funcionalidades do http. E ela foi construída de uma forma que as requisições e respostas não são armazenadas em buffer, para que possa ser feito o uso de streams.
- Criamos um servidor fazendo o uso da interface http com a função createServer. Essa instância do servidor irá rodar na porta 8080 e no ip local conforme definimos na função listen.
- Toda vez que uma requisição for recebida pelo servidor a função interna que passamos para o createServer será engatilhada. Ela por sua vez sempre receberá os parâmetros request e response. São esses atributos que iremos manipular para alterar a nossa resposta ao cliente.
- Logo definimos o head e a mensagem da resposta com writeHead. A resposta a ser enviada é HTTP 200 (OK) e o tipo de conteúdo (Content-Type) é text/html.
- Com a função end definimos a resposta em texto que será enviada ao cliente: Hello World
Agora vamos rodar o nosso servidor node executando node executando node index.js. Ao entrar no seu navegador digitando http://localhost:8080/ você verá:
Essa resposta é exatamente a mesma que indicamos no código.
E é isso pessoal! Espero que tenham gostado deste texto. Nele fizemos uma breve introdução ao NodeJS, além de explicar os motivos pelos quais é uma plataforma tão popular e quais são suas principais características e particularidades. NodeJS é usado no mundo todo por empresas como Paypal, Netflix, Trello entre muitas outras. Como mencionado anteriormente, a sua capacidade de lidar com múltiplos requests de forma rápida e também por ser escrito em JavaScript estão entre as principais razões para essa adoção.