O que é Node.js, como funciona e como instalar: guia completo
Node.js é um ambiente de execução que permite executar JavaScript no lado do servidor. Multiplataforma e de código aberto, o software tem uma arquitetura que proporciona transferências de dados eficientes, o que o torna muito popular para desenvolver aplicações em tempo real e amplamente escaláveis.
Nos parágrafos abaixo, contaremos o que é Node.js e contaremos tudo sobre ele, incluindo como ele funciona e suas aplicações práticas. Nós também vamos explicar como configurar o software em seu servidor, para que você possa começar seu desenvolvimento rapidamente. Vamos lá?
Conteúdo
Introdução ao Node.js
Nos seus primórdios, o JavaScript só podia ser executado no front-end, pois seu runtime estava disponível apenas para navegadores como o Google Chrome. Isso o tornava viável para a construção de aplicações do lado do cliente, como sites dinâmicos.
Ryan Dahl criou o Node.js em 2009 justamente para expandir as funcionalidades do JavaScript, oferecendo um ambiente de execução de back-end leve e responsivo. Em outras palavras, o Node.js permite que os desenvolvedores usem a linguagem como o código do lado do servidor (server side).
Com isso, os desenvolvedores podem programar tanto o front quanto o back-end na nesma linguagem. Isso ajuda a otimizar o desenvolvimento e a manutenção das aplicações, pois vários trechos de código podem ser reaproveitados.
Além disso, desenvolver o back-end em JavaScript permite que seu aplicativo use o modelo de programação assíncrona do Node.js. Basicamente, essa arquitetura permite que o seu serviço web atenda a várias solicitações de usuários de maneira mais eficiente.
Falaremos mais sobre isso na próxima seção.
Como funciona o Node.js
Para entender o princípio de funcionamento do Node.js, é preciso compreender alguns termos.
Modelo de I/O non-blocking (não bloqueante)
Para lidar com uma solicitação de usuário, servidores tradicionais, como Apache e Tomcat, usam umathread que pode atender apenas um cliente por vez. Se o servidor atingir o número máximo de threads, uma nova solicitação precisa esperar até que as solicitações existentes terminem suas tarefas.
Threads que ainda estão processando solicitações de usuários bloquearão a entrada de novos clientes e não encaminharão a saída para serviços externos, como APIs ou bancos de dados. Isso pode levar a gargalos durante picos de tráfego, que geram muitas conexões simultâneas.
O Node.js, por outro lado, possui um modelo não bloqueante (non-blocking), o que significa que uma única thread pode receber e encaminhar uma nova solicitação sem esperar que a atual seja concluída. Esse sistema leva o nome de arquitetura assíncrona.
Arquitetura assíncrona
A arquitetura síncrona processa as solicitações do cliente em uma ordem, o que significa que o servidor web necessariamente completará a operação atual antes de iniciar uma nova.
Enquanto isso, uma aplicação com arquitetura assíncrona pode iniciar uma nova operação enquanto aguarda os resultados de outras operações. Ao receber uma resposta, o servidor web retorna os dados para o cliente.
A arquitetura assíncrona é adequada para aplicações que requerem a busca de dados de outros serviços, como interfaces de programação de aplicações (APIs) ou bancos de dados. Em vez de ficar ocioso, o servidor web pode processar novas solicitações enquanto aguarda respostas.
Embora excelente para tarefas de entrada e saída (I/O), essa arquitetura faz com que o Node.js exija mais da CPU, pois ele usa apenas uma única thread para lidar com várias solicitações.
Orientado a eventos (event-driven)
No Node.js, eventos são sinais indicando que uma determinada ação ocorreu. Por exemplo, eles podem acionar uma nova operação ou uma conclusão de tarefa.
Eventos são fundamentais para possibilitar o modelo assíncrono. Eles operam em um event loop, instruindo o Node.js sobre como lidar com o fluxo de solicitações.
Ao receber uma nova solicitação do cliente, o loop de eventos começa. Então, o Node.js encaminha a solicitação para o serviço externo apropriado, como uma API. Assim que seu servidor recebe os dados, um novo evento aciona uma função de retorno de chamada (callback).
Uma função de callback executa outra função quando uma condição específica ou operação assíncrona é concluída. Ela permite que o servidor web processe solicitações e envie respostas para o cliente.
Motor JavaScript V8
No núcleo do Node.js está o motor JavaScript V8, que analisa e executa a linguagem. Em outras palavras, ele permite que seu servidor de back-end execute código JavaScript fora de um navegador.
O Google originalmente desenvolveu este motor para o Google Chrome. Mais tarde, o Node.js adotou essa tecnologia para permitir que o JavaScript seja executado de forma independente em cima do software.
Vantagens de usar o Node.js
Agora que você já entende o funcionamento do Node.js, vamos explorar como ele pode beneficiar o desenvolvimento da sua aplicação web.
- Velocidade. A arquitetura assíncrona do Node.js lida com várias operações de entrada e saída de maneira mais eficiente, resultando em uma aplicação mais responsiva. Isso também torna o tempo de execução perfeito para a busca de dados em tempo real.
- Mecanismo de tratamento de erros. Os objetos de erro integrados proporcionam aos usuários mais flexibilidade no tratamento de inúmeros problemas. Eles permitem que os desenvolvedores obtenham informações mais detalhadas sobre o erro para solucionar os problemas de maneira mais eficiente.
- Eficiência no desenvolvimento. O Node.js permite que os desenvolvedores usem JavaScript em qualquer lugar para o desenvolvimento full-stack. Isso facilita o desenvolvimento, pois o código trabalha perfeitamente entre o back-end e o front-end.
- Ecossistema completo. Os usuários podem instalar vários módulos através do Gerenciador de Pacotes Node (NPM) para adicionar novas funcionalidades às suas aplicações Node.js sem precisar programá-las do zero.
- Flexibilidade e escalabilidade. Os desenvolvedores podem usar o Node.js com outros frameworks e sistemas operacionais. Também é possível escalar o tempo de execução usando diferentes abordagens, como a instalação de um balanceador de carga ou a configuração de microservices.
- Código aberto. O código-fonte do Node.js é aberto a todos os usuários, e seus criadores incentivam valores como transparência, inovação e personalização. O runtime também tem forte apoio da comunidade.
O que você pode fazer com Node.js
Aqui estão vários casos de uso do Node.js que podem se beneficiar de elementos como entradas e saídas responsivas e arquitetura assíncrona:
- Chats e transmissões ao vivo. Plataformas de bate-papo e transmissão envolvem muitas operações de I/O, pois os usuários enviam e recebem dados em tempo real. O processamento eficiente do Node.js ajuda a minimizar o atraso, pois pode lidar com múltiplas solicitações de clientes simultaneamente.
- Fluxos de dados. O Node.js pode buscar e enviar informações de fontes externas rapidamente, tornando-o uma opção ideal para fluxos de dados (data streams) em tempo real. Com isso, você pode usar o Node.js para aplicações de monitoramento de sistemas e mercado de ações, por exemplo.
- Servidores proxy. Um servidor proxy é um intermediário entre clientes e o servidor de hospedagem, geralmente usado para balanceamento de carga ou filtragem de tráfego. O Node.js garante que as solicitações do cliente e a resposta do servidor ocorram suavemente.
- APIs RESTful. O Node.js é bastante usado para criar APIs RESTful, que permitem que as aplicações usem serviços externos através de uma rede.
- Aplicações de página única (SPAs). Algumas SPAs, como o Gmail e o PayPal, podem atualizar dados no front-end em tempo real sem a necessidade de atualizar a página. O Node.js permite que os dados do servidor de hospedagem sejam transferidos rapidamente.
Node.js vs. outras tecnologias de back-end
Além do Node.js, os desenvolvedores também usam várias outras tecnologias para desenvolver aplicações de back-end. Abaixo, vamos falar sobre algumas das mais populares e como elas se comparam com o Node.js.
.NET é uma estrutura de aplicação web muito popular entre aplicações empresariais de grande escala. Apesar de ser um produto da Microsoft, ela é compatível com Linux e macOS. No entanto, muitos desenvolvedores afirmam que ela é mais responsiva quando executada no Windows.
.NET suporta linguagens de programação orientadas a objetos, como C++, C# e VB. Isso torna o framework mais adequado para desenvolvedores que desejam tirar proveito da flexibilidade e dos recursos dessas linguagens.
O framework .NET adota a abordagem multithread com um modelo de processamento assíncrono. Esta arquitetura é adequada se o seu serviço envolve principalmente tarefas complexas e que exigem bastante poder de processamento.
No entanto, as aplicações .NET são mais difíceis de desenvolver. Se seus serviços web envolvem muitas chamadas externas, o Node.js acaba sendo mais eficiente para construir o seu back-end.
Ruby on Rails é uma estrutura de desenvolvimento web escrita na linguagem orientada a objetos Ruby. Ela segue a abordagem modelo-visão-controlador (MVC), que fornece uma estrutura definida para a sua aplicação.
Essa estrutura permite que os desenvolvedores construam eficientemente um protótipo funcional de aplicativo e incluam recursos adicionais posteriormente. Isso torna o Ruby on Rails ideal para projetos iterativos, onde os desenvolvedores dividem um projeto em tarefas menores.
Apesar da simplicidade, a abordagem MVC torna o Ruby on Rails menos flexível do que o Node.js. Enquanto isso, o runtime do JavaScript permite que você desenvolva uma aplicação na forma de microsserviços, tornando-o altamente modular e escalável.
Como o Ruby on Rails é multithread, ele é mais adequado para um sistema com vários núcleos. No entanto, ele não funciona de forma assíncrona, o que pode diminuir o desempenho do seu aplicativo se ele requerer chamadas de I/O frequentes.
Django é uma estrutura de desenvolvimento web para Python, uma linguagem de programação altamente versátil e flexível. Ele é bastante popular para construir aplicações ou serviços que processam grandes quantidades de dados.
Ao contrário do Node.js, que é ideal para a construção de microsserviços, o Django costuma ser utilizado para desenvolver aplicações monolíticas. Neste modelo, você escreve os serviços do seu programa em uma única base de código.
Embora escaláveis, as aplicações monolíticas do Django são menos flexíveis do que os microsserviços. No entanto, a abordagem modelo-visão-template (MVT) deste framework ajuda os desenvolvedores a construir serviços de forma mais eficiente usando componentes menores e reutilizáveis.
O Django usa uma arquitetura síncrona e multithread, o que o torna adequado para aplicações monolíticas que usam muito dados e para sistemas com múltiplos núcleos.
O Laravel oferece vários templates comumente usados em aplicações web, incluindo autenticação, autorização e notificações.
Os templates do Laravel e sua sintaxe simples facilitam a programação aplicações web, especialmente para iniciantes. Além disso, ele segue a arquitetura MVC, que ajuda os desenvolvedores a manter e modificar rapidamente o código base.
No entanto, muitos usuários relatam que o Laravel oferece um desempenho inferior em comparação com outras tecnologias de back-end. Isso significa que você deve ajustar as configurações do seu projeto ou lançar mão de softwares adicionais, como o Octane, para melhorar sua velocidade.
Se sua aplicação envolve muitos fluxos de dados e operações de I/O em tempo real, o Laravel pode não ser o mais indicado, porque ele usa um mecanismo de bloqueio multi-threaded.
Dica
Na hora de escolher tecnologias de back-end, muitos desenvolvedores recomendam priorizar a familiaridade com a tecnologia e as necessidades do projeto. Embora os frameworks tenham desempenhos diferentes, você pode acabar ignorando o impacto significativo que isso pode ter no uso real delas.
Node Package Manager (NPM)
O Node Package Manager (NPM) é uma ferramenta para a instalação de software, como módulos ou dependências, para aplicações JavaScript. Isso melhora a eficiência do desenvolvimento do Node.js, permitindo que os usuários acessem componentes adicionais a partir de um só lugar.
Importante! A sigla NPM pode se referir tanto ao utilitário que os desenvolvedores usam para baixar os pacotes quanto ao repositório onde os usuários compartilham seus módulos.
O repositório NPM atualmente abriga milhões de pacotes e módulos, incluindo a popularíssima biblioteca JavaScript Lodash. Você também pode baixar outros frameworks do repositório, como o Express.js e o Mocha.js.
Para baixar e gerenciar pacotes do NPM, você deve usar a interface de linha de comando do seu sistema. Por padrão, essa utilidade é configurada automaticamente após a instalação do Node.js, o que explicaremos na seção seguinte.
Primeiros passos com Node.js
Agora que você entende como o Node.js pode beneficiar seus projetos de desenvolvimento web, vamos explicar como configurá-lo. Para este tutorial, vamos demonstrar como fazer isso em um servidor privado virtual (VPS) da Hostinger rodando o Ubuntu 22.04.
Instalando o Node.js
Os usuários do VPS da Hostinger podem instalar o Node.js no Ubuntu facilmente sem executar um comando sequer — basta usar o template do sistema operacional.
Após comprar o plano de hospedagem VPS Node.js, complete as tarefas de configuração inicial e aguarde até que o processo de instalação esteja completo. Isso deve levar alguns minutos, e, ao final, nosso sistema configurará automaticamente o ambiente de execução no seu servidor.
Escolheu um plano VPS diferente?
Se você já tem um plano de hospedagem VPS da Hostinger, também pode instalar o Node.js sem mexer em comandos usando o template de sistema operacional.
Para outros provedores de hospedagem, você deve instalar manualmente o Node.js usando comandos. Aqui está o passo a passo:
- Conecte-se ao seu servidor usando o cliente SSH PuTTY ou uma ferramenta de linha de comando, como o Terminal. Recomendamos fazer isso como um superusuário em vez de root.
- Atualize o pacote do seu sistema executando esses comandos um por um:
sudo apt update && sudo apt upgrade
- Agora, execute o seguinte comando para a instalação do Node.js:
sudo apt install nodejs -y
- Seu gerenciador de pacotes também deve instalar automaticamente o NPM. No entanto, execute o comando abaixo para garantir que a ferramenta esteja configurada corretamente:
sudo apt install npm -y
- Confirme a instalação consultando a versão do node usando o seguinte comando:
node -v
Ao desenvolver uma aplicação Node.js localmente, você deve instalar o runtime em sua máquina local. A maneira mais fácil de fazer isso é baixando o instalador pré-construído baseado no seu sistema operacional na página oficial de lançamento.
Desenvolvendo e executando aplicações com Node.js
Os passos para construir aplicações Node.js são semelhantes aos de outras estruturas de desenvolvimento web. Aqui está um guia básico:
- Instale o Node.js, o NPM, o editor de código VSCode e a extensão Live Server.
- Crie uma pasta para o seu projeto. Abra o VSCode → Arquivo → Abrir Pastae selecione seu novo diretório.
- Navegue até o terminal VSCode e execute o comando abaixo para criar um arquivo de configuração para o seu projeto:
npm init
- Insira as informações necessárias. Depois de finalizar, você deverá ver o arquivo package.json na janela do explorador do VSCode.
- Na tela principal, selecione Novo Arquivo e crie um novo arquivo de projeto. Por exemplo, nomeie-o app.js.
- Escreva seu código de aplicação. Para teste, testar pode criar um simples programa Hello World. Pressione Ctrl + S para salvar.
- Do seu terminal VSCode, execute node seguido pelo nome do seu arquivo JS para iniciar sua aplicação:
node app.js
Pronto! Em nosso exemplo, você pode acessar o aplicativo digitando o endereço localhost junto com o número da porta designado no seu navegador.
Os passos são semelhantes, independentemente do seu sistema operacional.
Para implantar o aplicativo no seu servidor web, faça o upload do arquivo do projeto usando comandos, git ou o protocolo seguro de transferência de arquivo (SFTP).
Trabalhando com módulos e dependências
O NPM permite que você gerencie facilmente módulos e dependências para melhorar a funcionalidade do seu aplicativo Node.js.
O arquivo package.json na pasta do seu projeto contém informações sobre as dependências do seu aplicativo. Em vez de gerenciar os pacotes individualmente, você pode chamar o package.json em massa.
Por exemplo, executar o comando abaixo atualizará todas as dependências listadas no arquivo:
npm install
Você pode verificar pacotes desatualizados e instalar atualizações usando um único comando. Isso torna o processo mais eficiente e mantém a consistência em diferentes ambientes de projeto.
Além disso, o Node.js permite que você liste automaticamente novas dependências ou módulos (como os E S Modules) no packages.json durante a instalação usando a opção –save. O comando vai ficar assim:
npm install nome-do-software --save
O Node.js inclui módulos internos que vêm pré-configurados quando você faz a instalação do ambiente de execução. Você também pode instalar módulos externos do repositório npm.
Para carregar um módulo no código da sua aplicação, use a função require. Por exemplo, o trecho a seguir chama express.js e o atribui como a variável express:
const express = require('express')
Os módulos integrados variam dependendo da sua versão do Node.js. Para verificar quais módulos estão instalados no seu sistema atual, use o seguinte comando:
npm list -g
Precisa de ajuda com o JavaScript?
Use nosso assistente de IA Kodee para te ajudar a programar códigos JavaScript e gerar comandos npm para desenvolver sua aplicação.
Frameworks e bibliotecas Node.js
Na prática, é muito raro que desenvolvedores usem apenas o Node.js para construir uma aplicação. Em vez disso, eles incorporam um framework para criar a estrutura do projeto e uma biblioteca para adicionar funções facilmente. Aqui estão algumas das opções mais populares.
Express.js, ou Express, é o framework Node.js mais utilizado do mundo. Ele é bastante popular por conta do seu modelo minimalista e imparcial, que permite aos desenvolvedores estruturar o código de suas aplicações sem restrições.
Entre as principais características deste framework, podemos citar o manuseio de solicitações integrado e bastante versátil. Ele permite que os desenvolvedores chamem rapidamente uma função específica com base no método e nos padrões de URL das solicitações HTTP. Sem o Express, tal mecanismo só seria possível usando um código extenso.
Além disso, o framework Express.js permite que os desenvolvedores usem middleware — isto é, um software que modifica solicitações e respostas durante a transmissão. Por exemplo, ele permite que você autentique, registre ou limite os dados transferidos.
React.js é uma biblioteca JavaScript de front-end que é usada para desenvolver a interface do usuário (UI) de um site ou aplicativo web. Embora relativamente nova, ela ganhou enorme popularidade devido ao seu foco na facilidade de uso e na acessibilidade para iniciantes.
Como outras bibliotecas, o React fornece um conjunto de componentes reutilizáveis que ajudam os desenvolvedores a construir uma interface complexa sem esforço. Seu maior diferencial é o uso da sintaxe JSX, que permite escrever marcações semelhantes ao HTML em JavaScript.
O React ajuda a melhorar a velocidade de carregamento do seu site ou aplicação web usando um modelo de objeto de documento (DOM) virtual. Este recurso permite que os navegadores renderizem apenas as seções de interface que sofreram alterações (em vez de toda a página), tornando o processo mais eficiente.
A biblioteca JavaScript Socket.io fornece recursos para lidar com a transmissão de dados em tempo real, tornando-a uma alternativa popular para o desenvolvimento de serviços intensivos como jogos, plataformas de transmissão ao vivo e aplicativos de chat.
O Socket.io permite que sua aplicação Node.js responda aos clientes sem esperar por suas solicitações. Em aplicativos de mensagens, por exemplo, essa funcionalidade permite que os membros do grupo recebam uma mensagem de um usuário automaticamente.
O Socket.io oferece uma maneira mais confiável e responsiva para proporcionar a comunicação bidirecional do cliente do que os WebSockets tradicionais. Sem ele, você precisaria desenvolver um código personalizado para gerenciar a conexão bidirecional e desviar manualmente as solicitações do cliente.
Next.js é um framework de desenvolvimento web full-stack baseado em React que pode lidar com o front-end e o back-end. Ele fornece blocos de construção e ferramentas para construir a interface de sua aplicação, além de sistemas para o lado do servidor.
Por exemplo, a versão mais recente do Next possui um compilador integrado que melhora significativamente o tempo de atualização do código. Com isso, as mudanças que você faz na sua aplicação são refletidas no navegador dos usuários mais rapidamente.
O Next.js também utiliza um mecanismo de pré-renderização que compila aplicações JavaScript no back-end, em vez de no navegador do cliente. Isso ajuda a melhorar a velocidade de carregamento das páginas e a otimização para motores de busca (SEO).
Sites populares que usam Node.js
Agora, vamos explorar alguns sites construídos com base no Node.js para demonstrar suas capacidades.
Netflix
A capacidade do Node.js de lidar com operações intensivas em tempo real torna-o uma tecnologia ideal para a aplicações web de transmissão ao vivo, como a Netflix.
Uber
O Uber utiliza Node.js para lidar com a comunicação em tempo real entre diferentes clientes e APIs.
Por exemplo, seu aplicativo processa dados de serviços de mapas, sistemas de GPS dos motoristas e solicitações de pedidos dos usuários.
eBay
O Node.js permite que plataformas de e-commerce, como o eBay, lidem eficientemente com chamadas de API de serviços externos como logística ou provedores de pagamento.
Além disso, os desenvolvedores podem implementar recursos como gerenciamento de estoque e chat ao vivo separadamente, bem como aproveitar as operações eficientes de I/O do runtime.
PayPal
Aplicações de gateway de pagamento, como o PayPal, trabalham com outras APIs e middlewares para habilitar transações seguras e criptografadas.
O Node.js permite o processamento de dados em tempo real a partir de várias fontes, incluindo microserviços, para tarefas como detecção de fraude.
Conclusão
O Node.js é um ambiente de runtime que permite executar código JavaScript no lado do servidor para desenvolvimento de back-end. Ele foi construído com base no motor V8 do Google, inicialmente destinado para o navegador Chrome.
No texto acima, aprendemos que o Node.js emprega uma arquitetura assíncrona, não bloqueante e orientada a eventos. Ele usa uma única thread para atender várias solicitações simultâneas sem enfileiramento, tornando-o adequado para aplicações intensivas de entrada e saída.
O software, já incluindo o Node Package Manager (NPM), vem pré-instalado nos planos de hospedagem Node.js da Hostinger. Para outros provedores, você provavelmente precisará fazer a instalação manual do runtime usando comandos ou pacotes binários.
O NPM permite que você instale outros frameworks e bibliotecas para complementar o Node.js, como o React.js e o Express.js. Quando combinadas, essas tecnologias são bem excelentes para aplicações de nível empresarial, como PayPal, eBay e Uber.
O que é Node js: perguntas frequentes
Por fim, vamos responder algumas perguntas comuns sobre o Node.js.
O Node.js é uma linguagem de programação ou um framework?
O Node.js não é nem uma linguagem de programação nem um framework. Trata-se de um ambiente de execução JavaScript multiplataforma que permite que a linguagem seja executada como código do lado do servidor.
Posso usar Node.js para desenvolvimento de front-end?
Embora você não possa usar diretamente o Node.js para o desenvolvimento de front-end, ele oferece funções adicionais para isso. Por exemplo, você pode usar módulos NPM na interface do usuário usando ferramentas como o Browserify. Várias bibliotecas de front-end, como React.js, também dependem do Node.js.
O Node.js é indicado para construir aplicações web escaláveis?
Com certeza! O Node.js permite que você construa aplicações escaláveis como componentes menores e isolados, chamados microsserviços. Isso torna seu projeto mais fácil de escalar, pois você pode escolher serviços específicos para aprimorar sem afetar os demais.