O JavaScript é uma das linguagens de programação mais populares do mundo. Ela alimenta milhões de websites hoje, e tem atraído multidões de desenvolvedores e designers para construir recursos para a web. Se você é novo em programação, o JavaScript é facilmente uma das melhores linguagens de programação para se colocar sob seu cinto.

Durante seus primeiros 20 anos, o JavaScript foi utilizado principalmente para a elaboração de scripts do lado do cliente. Como o JavaScript só podia ser usado dentro da tag <script>, os desenvolvedores tinham que trabalhar em várias linguagens e estruturas entre os componentes front-end e back-end. Mais tarde veio o Node.js, que é um ambiente de tempo de execução que inclui tudo o que é necessário para executar um programa escrito em JavaScript.

O Node.js é um ambiente de tempo de execução com uma única camada, de código aberto e multiplataforma para construir aplicações rápidas e escalonáveis no lado do servidor e em rede. Ele roda no motor de tempo de execução JavaScript V8, e usa uma arquitetura de E/S não bloqueada por eventos, o que o torna eficiente e adequado para aplicações em tempo real.

O que está escrito no Node.js?

Node.js é escrito em C, C++, e JavaScript.

A Wikipedia define o Node.js como “uma compilação empacotada do motor JavaScript V8 do Google, a camada de abstração da plataforma libuv, e uma biblioteca central, que por si só é escrita principalmente em JavaScript”.

O runtime utiliza internamente o Chrome V8, que é o motor de execução JavaScript, e também está escrito em C++. Isto acrescenta casos de uso adicionais ao repertório do Node.js, como o acesso à funcionalidade do sistema interno (como rede).

Arquitetura do Node.js e como funciona

O Node.js usa a arquitetura “Single Threaded Event Loop” para lidar com vários clientes ao mesmo tempo. Para entender como isto é diferente de outros tempos de execução, precisamos entender como clientes multi-tarefa simultâneos são tratados em linguagens como Java.

Em um modelo de resposta a solicitações multi-threaded, vários clientes enviam uma solicitação, e o servidor processa cada um deles antes de enviar a resposta de volta. No entanto, múltiplos threads são usados para processar chamadas simultâneas. Estes tópicos são definidos em um pool de tópicos, e cada vez que uma solicitação chega, um tópico individual é designado para tratá-la.

 

Como o node.js processa os pedidos recebidos usando o loop do evento
Como o node.js processa os pedidos recebidos usando o loop do evento

 

O Node.js funciona de forma diferente. Vamos dar uma olhada em cada passo que ele passa:

  1. O Node.js mantém um pool limitado de threads para atender aos pedidos.
  2. Sempre que um pedido chega, o Node.js o coloca em uma fila.
  3. Agora, o “loop de eventos” – o componente central – é o que está em jogo. Este loop de eventos espera por solicitações indefinidamente.
  4. Quando um pedido chega, o laço o pega da fila e verifica se requer uma operação de entrada/saída (E/S) de bloqueio. Caso contrário, ele processa a solicitação e envia uma resposta.
  5. Se a solicitação tiver uma operação de bloqueio a realizar, o loop do evento atribui um fio do pool interno de threads para processar a solicitação. Há poucas roscas internas disponíveis. Este grupo de roscas auxiliares é chamado de grupo de trabalhadores.
  6. O loop do evento rastreia os pedidos de bloqueio e os coloca na fila uma vez que a tarefa de bloqueio é processada. É assim que mantém sua natureza de não-bloqueio.

Como o Node.js utiliza menos threads, ele utiliza menos recursos/memória, resultando em uma execução mais rápida das tarefas. Portanto, para nossos propósitos, esta arquitetura de rosca única é equivalente à arquitetura multi-tarefa. Quando se precisa processar tarefas com uso intensivo de dados, então o uso de linguagens multi-tarefa como Java faz muito mais sentido. Mas para aplicativos em tempo real, o Node.js é a escolha óbvia.

Características do Node.js

O Node.js tem crescido rapidamente nos últimos anos. Isto se deve à vasta lista de características que ele oferece:

  1. Fácil – Node.js é bastante fácil de começar. É a escolha ideal para iniciantes no desenvolvimento web. Com muitos tutoriais e uma grande comunidade iniciada, é muito fácil.
  2. Escalável – Proporciona uma vasta escalabilidade para aplicativos. O Node.js, sendo de rosca única, é capaz de lidar com um enorme número de conexões simultâneas com alto rendimento.
  3. Veloz – A execução da linha Non-blocking torna o Node.js ainda mais rápido e mais eficiente.
  4. Pacotes – Um vasto conjunto de pacotes open-source Node.js está disponível que pode simplificar seu trabalho. Há mais de um milhão de pacotes no ecossistema NPM atualmente.
  5. Forte back-end – Node.js forte é escrito em C e C++, o que o torna mais rápido e acrescenta recursos como suporte de rede.
  6. Multiplataforma – plataforma permite criar sites SaaS, aplicativos desktop e até mesmo aplicativos móveis, todos usando o Node.js.
  7. Mantenível – Node.js é uma escolha fácil para os desenvolvedores, já que tanto o frontend quanto o backend podem ser gerenciados com JavaScript como uma única linguagem.

Tamanho do mercado

Houve um crescimento imenso nos websites nas últimas duas décadas e, como esperado, o Node.js também está crescendo rapidamente. O tempo de execução popular já ultrapassou o limite de 1 bilhão de downloads em 2018, e de acordo com a W3Techs, o Node.js é usado por 1,2% de todos os websites em todos os lugares. São mais de 20 milhões de sites em toda a Internet.

Não surpreende, é uma seleção popular com milhões de empresas, também. Aqui estão algumas das mais populares que usam o Node.js hoje:

  • Twitter
  • Spotify
  • eBay
  • Reddit
  • LinkedIn
  • Godaddy

Aplicativos do Node.js

Aplicações do Node.js
Aplicativos do Node.js

 

O Node.js é usado para uma grande variedade de aplicativos. Vamos explorar alguns casos de uso popular onde o Node.js é uma boa escolha:

  1. Conversas em tempo real – devido à sua natureza assíncrona de um único fio, o Node.js é bem adequado para processar a comunicação em tempo real. Ele pode ser facilmente dimensionado e é freqüentemente utilizado na construção de chatbots. O Node.js também torna simples a construção de recursos adicionais de bate-papo como bate-papo multi-pessoa e notificações push.
  2. Internet das Coisas – Os aplicativos da Internet das Coisas (IoT) tipicamente incluem vários sensores, já que eles frequentemente enviam pequenos pedaços de dados que podem se acumular em um grande número de solicitações. O Node.js é uma boa escolha porque é capaz de lidar rapidamente com estes
  3. Fluxo de dados – Empresas como a Netflix utilizam o Node.js para fins de fluxo de dados. Isto se deve principalmente ao Node.js ser leve e rápido, além do qual Node.js fornece um API nativo para streaming. Estes fluxos permitem que os usuários encaminhem as solicitações uns aos outros, resultando em que os dados sejam encaminhados diretamente para seu destino final.
  4. Aplicativos complexas de página única (SPAs)-Em SPAs, a aplicação inteira é carregada em uma única página. Isto geralmente significa que há um par de solicitações feitas em segundo plano para componentes específicos. O loop de eventos do Node.js vem em socorro aqui, pois processa as solicitações de forma não obstrutiva.
  5. Aplicativos REST baseadas em API-JavaScript é usado tanto no front-end quanto no backend dos sites. Assim, um servidor pode se comunicar facilmente com o frontend via REST APIs usando o Node.js. O Node.js também fornece pacotes como Express.js e Koa que tornam ainda mais fácil a construção de aplicativos web.

O Node.js é uma linguagem de programação?

Em uma palavra: não.

Node.js não é uma linguagem de programação. Ao contrário, é um ambiente de tempo de execução que é usado para executar JavaScript fora do navegador.

Nem o Node.js é uma estrutura (uma plataforma para o desenvolvimento de aplicativos de software). O Node.js é construído em cima de uma linguagem de programação – neste caso, JavaScript – e ajuda na execução dos próprios frameworks.

Em resumo, Node.js não é nem uma linguagem de programação nem uma estrutura; é um ambiente para eles.

O Node.js é Frontend ou Backend?

Um equívoco comum entre os desenvolvedores é que o Node.js é uma estrutura backend e é usado apenas para construir servidores. Isto não é verdade: o Node.js pode ser usado tanto no frontend quanto no backend.

Uma das razões pelas quais as estruturas do Node.js são uma escolha popular para os desenvolvedores que constroem um backend flexível e escalável é sua natureza não bloqueadora e orientada a eventos. No entanto, os desenvolvedores do frontend verão estes benefícios do Node.js em seu próprio trabalho com a mesma clareza.

Vejamos por que a Node.js trabalha tanto para backend quanto para frontend:

  1. Reusabilidade – JavaScript é uma linguagem comum que é usada para escrever tanto backend quanto frontend com a ajuda de estruturas como Express.js e Meteor.js. Algumas pilhas populares como MERN usam o Express.js como backend (uma estrutura do Node.js). Múltiplos componentes também podem ser reutilizados entre o frontend e o backend.
  2. Produtividade e eficiência do desenvolvedor – Graças a uma redução na troca de contexto entre várias linguagens, muito tempo do desenvolvedor pode ser economizado. O uso do JavaScript tanto para backend quanto para frontend resulta em maior eficiência, já que muitas ferramentas são comuns para ambos.
  3. Enorme comunidade – Uma próspera comunidade online fatores na velocidade de um ciclo de desenvolvimento bem sucedido. Quando você fica preso a um problema, há uma boa chance de que alguém já o tenha resolvido e compartilhado a solução no Stack Overflow. O Node.js faz grande uso desta comunidade, que é ativa e engajada quando se trata do tempo de execução popular e seus pacotes.

Começando com o Node.js

Pode ser esmagador decidir por onde começar com o Node.js. Felizmente, é suficientemente simples de instalar, e então você será capaz de testá-lo por si mesmo.

Como instalar o Node.js

Se você já tem o Node.js instalado, sinta-se à vontade para passar por esta seção.

No macOS

Usando Bash no Mac

curl "https://nodejs.org/dist/latest/node-${VERSION:-$(wget -qO- https://nodejs.org/dist/latest/ | sed -nE 's|.*>node-(.*)\.pkg.*|\1|p')}.pkg" > "$HOME/Downloads/node-latest.pkg" && sudo installer -store -pkg "$HOME/Downloads/node-latest.pkg" -target "/"

Usando Homebrew no Mac

brew install node

No Windows

Faça o download do Windows Installer diretamente do site nodejs.org.

No Linux

No Ubuntu 18.04+ você pode instalar o Nodo usando os seguintes comandos.

sudo apt update
sudo apt install nodejs

Verifique a versão do Node.js instalado

Na seção anterior, instalamos com sucesso o Nodo. Vamos verificar isso verificando a versão instalada. Execute o seguinte comando no terminal.

node -v

Você também pode verificá-lo através da bandeira mais longa

node --version

Você deve ver uma saída semelhante a esta. Embora o número da versão possa variar.

v14.16.0

O que é NPM?

NPM é o ecossistema de pacotes do Node.js. É o maior ecossistema de todas as bibliotecas de código aberto do mundo, com mais de 1 milhão de pacotes e em crescimento. O NPM é de uso livre e milhares de desenvolvedores de código aberto contribuem diariamente para ele.

O NPM vem com um utilitário de linha de comando fora da caixa. Você pode simplesmente ir até o site do NPM para procurar o pacote que você precisa e instalá-lo usando um único comando. Você também pode gerenciar as versões de seu pacote, revisar dependências e até mesmo configurar scripts personalizados em seus projetos através deste utilitário de linha de comando. Sem dúvida, o NPM é a posse mais amada da comunidade Node.js; o Node.js atrai um grande número de desenvolvedores devido em grande parte a seu excelente suporte a pacotes.

Instalação de pacotes NPM via CLI

Quando você instala o Node.js, o NPM é instalado automaticamente junto com ele. Cobrimos como instalar o Node.js nas seções anteriores, então agora vamos dar uma olhada no comando para instalar um pacote com NPM:

npm install <package-name>

Sim, é tão fácil assim! Você pode até mesmo instalar vários pacotes ao mesmo tempo:

npm install <pkg-1> <pkg-2> <pkg-3>

Você também pode especificar a bandeira -g (global) se você quiser instalar um pacote no contexto global. Isto permite que você use o pacote em qualquer lugar através de sua máquina.

Quando você inicializa um novo aplicativo, o NPM cria automaticamente um arquivo package.json que consiste de todos os pacotes NPM. É aqui que você pode especificar versões, dependências e scripts personalizados.

Há uma longa lista de comandos que vêm com o utilitário NPM, incluindo publish, audit, run, e muito mais. Você pode verificar como usar estes comandos usando o comando de npm help.

Versão nodo e npm.
Versão nodo e npm.

Pacotes populares

Aqui estão alguns dos pacotes mais populares para o Node.js hoje:

  • Express – Express.js, ou simplesmente Express, é uma estrutura de desenvolvimento web inspirada no Sinatra para o Node.js, e o padrão de fato para a maioria das aplicações do Node.js atualmente.
  • MongoDB – O motorista oficial da MongoDB. Ele fornece a API para bancos de dados de objetos MongoDB no Node.js.
  • Socket.io – Socket permite a comunicação em tempo real, bidirecional e baseada em eventos.
  • Lodash – Lodash facilita o JavaScript, tirando o incômodo de trabalhar com arrays, números, objetos, cordas, etc.
  • Moment – Uma biblioteca JavaScript de datas para analisar, validar, manipular e formatar datas.
  • Commander.js – Isto é tudo que você precisa para trabalhar e construir com interfaces de linha de comando para o node.js.
  • Para sempre – Uma ferramenta CLI simples para garantir que um determinado roteiro funcione continuamente (ou seja, para sempre). Mantém seu processo Node.js em produção diante de qualquer falha inesperada.
  • Async – Um módulo utilitário que fornece funções simples e poderosas para trabalhar com JavaScript assíncrono.
  • Redis – Uma biblioteca de clientes para apoiar a integração do banco de dados Redis.
  • Mocha – Uma estrutura de teste JavaScript limpa e flexível para o Node.js e o navegador.
  • Passaport – Autenticação simples e discreta para o Node.js. O único objetivo do passaporte é autenticar os pedidos.

Hello World no Node.js

Como sempre, vamos começar com o programa básico “Hello World”, onde criamos um servidor no Node.js que retornará uma saída do “Hello World” em um pedido de servidor. Antes de mergulhar, certifique-se de se preparar com um bom editor de texto.

Uma vez que você tenha aberto seu editor de texto, aqui está o código que você usará para seu programa “Hello World”:

// server.js
const http = require('http');

const hostname = '127.0.0.1';
const port = 3000;

const server = http.createServer((req, res) => {
  res.statusCode = 200;
  res.setHeader('Content-Type', 'text/plain');
  res.end('Hello World! Welcome to Node.js');
});

server.listen(port, hostname, () => {
  console.log(`Server running at http://${hostname}:${port}/`);
});

Salvar este arquivo como `server.js`. Agora vá para o terminal e inicie o servidor utilizando o comando:

node server.js

O servidor deve começar a funcionar agora. Para verificar a saída, abra http://localhost:3000 em seu navegador. Você deve ver a mensagem –

Hello World! Welcome to Node.js

Explicação do Hello World Server

O Node.js vem com um módulo embutido chamado “HTTP” que permite ao Node.js transferir dados através do Protocolo de Transferência de Hipertexto (HTTP).

No código acima, primeiro carregamos o módulo http em nosso programa. Em seguida, usamos o método createServer para aceitar uma solicitação e retornar uma resposta com um código de status. Finalmente, ouvimos em uma porta definida.

Parabéns – você acabou de criar seu primeiro servidor no Node.js! Na próxima seção, aprenderemos como usar a estrutura Express para criar um servidor.

Criando servidor usando Express

Em primeiro lugar, devemos discutir o que é um servidor. Um servidor é responsável por levar as solicitações dos clientes através de seu software (mais comumente Apache ou Nginx), executando o conjunto de tarefas necessárias e, finalmente, enviando respostas de volta aos clientes. Express é uma estrutura que nos ajudará a criar um servidor no Node.

Express.js é uma estrutura mínima e flexível de aplicativos web Node.js que fornece um conjunto robusto de recursos para aplicativos web e móveis. Ele permite adicionar tabelas de rotas e configurar middleware em sua aplicação. Você pode instalar o Express usando o comando abaixo.

npm install express --save

Na seção anterior, utilizamos o utilitário http embutido para criar um servidor. Agora, vamos criar um servidor “Hello World” usando o Express.js.

Abra seu editor de texto e digite este código:


// server-express.js
const express = require('express')
const app = express() // initialize app
const port = 3000

// GET callback function returns a response message
app.get('/', (req, res) => {
res.send('Hello World! Welcome to Node.js')
})

app.listen(port, () => {
console.log(`Server listening at http://localhost:${port}`)
})

Em seguida, executaremos nosso servidor com o seguinte comando.

node server-express.js

Verifique agora http://localhost:3000 em seu navegador para ver a saída “Hello World”.

Resumo

Em poucas palavras, Node.js é um ambiente de programação popular que pode ser usado para construir aplicativos de alta escala que precisam suportar vários pedidos simultâneos. A E/S sem bloqueio de uma única rosca faz dela uma excelente escolha tanto para aplicativos em tempo real quanto para aplicativos de fluxo de dados também.

Para reforçá-lo, ainda mais, o Node.js tem uma comunidade maciça de desenvolvedores ativos e possui o maior repositório de pacotes de código aberto do mundo, o NPM, que atualmente contém mais de um milhão de pacotes.

É fácil começar com o Node.js. Cobrimos como instalar e criar um servidor no Node.js, então tudo o que resta é considerar como você vai usar e implantar o Node.js em sua própria pilha. Você também pode expandir seu conhecimento visitando a documentação oficial do Node.js em nodejs.dev.