Introdução ao Node.js

Node.js é um interpretador de código JavaScript, criado por Ryan Dahl em 2009, com base no V8 JavaScript Engine do Google. Um dos principais diferenciais do Node.js é sua arquitetura baseada em eventos, desenvolvida para trabalhar com tarefas assíncronas de forma não obstrutiva (i.e., para que nenhuma tarefa interrompa uma aplicação) . Este diferencial melhora o rendimento e a escalabilidade de aplicações com operações de I/O, tempo real, etc.

Este artigo tem como objetivo apresentar os principais benefícios do Node.js, bem como abordar boas práticas e pacotes utilizados para o desenvolvimento de aplicações.

Principais benefícios

Quando desenvolvemos com Node.js utilizamos uma abordagem orientada a eventos, o que exige identificar/mapear/generalizar quais eventos podem ocorrer, bem como disponibilizar uma interface para ouvi-los, possibilitando executar operações específicas.

Estar melhor preparado para trabalhar com interações de tempo real entre cliente e servidor é um diferencial interessante do Node.js. Neste ponto, destacam-se os pacotes SockJS, Socket.IO e Engine.IO. Estes pacotes são compatíveis com o protocolo WebSockets e permitem trafegar dados por meio de uma conexão bi-direcional, tratando as mensagens via eventos no JavaScript.

Por ser uma linguagem single-threaded, o JavaScript acaba tendo benefícios (e.g., ausência de deadlocks), mas também existem limitações quando executamos blocos de códigos demorados. Neste ponto, é essencial analisar possíveis gargalos no código e refatorar visando tarefas assíncronas.

Para instalar o Node.js, acesse o site https://nodejs.org/.

Gerenciamento de pacotes com NPM

NPM é um gerenciador de pacotes para código JavaScript, considerado o maior registro de software do mundo. Trata-se de um facilitador para reutilização de código compartilhado, onde pequenos pacotes são criados para solucionar problemas específicos. Dessa forma, desenvolvedores e engenheiros de software ficam responsáveis pela composição de soluções customizadas, combinando diferentes pacotes, porém, dependências externas são perigosas e continua sendo necessário analisar o que está sendo adotado, bem como o envolvimento da comunidade.

Há duas maneiras de instalar pacotes: local e global. Quando o uso do pacote se limitar no apoio ao desenvolvimento de forma externa, este deve ser instalado de forma global. Por outro lado, caso o pacote faça parte do projeto, uma dependência para que os requisitos do projeto sejam realizados, este deve ser instalado localmente.

// Global
npm install -g swagger

// Local
npm install express --save

O gerenciamento dos pacotes instalados localmente na aplicação ocorre por meio do arquivo package.json, que organiza informações sobre o projeto, suas dependências e scripts visando a inicialização da aplicação, etc.

Para descobrir pacotes ou obter mais informações, acesse o site https://www.npmjs.com/.

Boas práticas usando Node.js

  • Pesquisar pacotes antes de implementar (NPM)
  • Compreender o versionamento de pacotes do NPM (Major, Minor e Patch)
  • Nomenclatura de arquivos lower-kebab-case (file-name.js)
  • Considerar adoção de guia de estilo (http://standardjs.com)
  • Trabalhar com tarefas assíncronas (Callback, Promise e async/await)

Gerenciamento de erros e processos

Para colocar uma aplicação Node.js em produção, alguns cuidados precisam ser tomados, os principais estão relacionados com o gerenciamento de erros e exceções, bem como o gerenciamento automatizado do processo da aplicação.

Quando ocorrem exceções ou rejeições não tratadas (uncaughtException e unhandledRejection), o comportamento de uma aplicação Node.js torna-se imprevisível. Para estes cenários, uma prática realizada pelos desenvolvedores é armazenar o log do erro e finalizar o processo da aplicação para reiniciá-lo. Porém, o gerenciamento do processo da aplicação precisa ser automatizado, neste ponto, destacam-se os pacotes PM2 e Forever.

O gerenciamento de erros e exceções não deve se limitar na finalização do processo da aplicação por meio dos eventos uncaughtException e unhandledRejection. Continua sendo importante que os desenvolvedores realizem o tratamento das exceções da aplicação (try/catch, promise, etc).

Para mais informações, acesse as dicas de performance para produção do express.

Pacotes interessantes

Pacote Descrição
standardjs Guia de estilo de JavaScript, com analisador e fixador de código automático.
dotenv Pacote para carregar variáveis de ambiente.
socket.io Framework para criação de aplicações de tempo real.
swagger Pacote composto por ferramentas para projetar e criar APIS compatíveis com Swagger.
express Framework minimalista para desenvolvimento de aplicações web.
helmet Pacote de apoio para proteção de aplicações web.
sequelize ORM baseado em promise para Node.js (Banco de dados relacionais).
mongoose ODM baseado em schema para Node.js (MongoDB).
restify Pacote para criação ou consumo de API Rest.
soap Pacote para criação ou consumo de API SOAP.
winston Pacote para armazenar log assíncrono.
morgan Pacote para armazenar log de requisição HTTP.
supertest Pacote para teste em alto nível de requisições HTTP.
mocha Pacote para teste unitário.
jasmine Pacote para desenvolvimento orientado a comportamento (BDD).

Conclusão

Node.js está conquistando muitos desenvolvedores, porém, ainda existe debate sobre quando adotá-lo. Não existe bala de prata, continua sendo importante analisar os requisitos funcionais e não funcionais do projeto, bem como questões sobre capacitação dos desenvolvedores para construção e manutenção da aplicação. Reconhecer os limites de cada tecnologia bem como os principais cenários para sua aplicação é importante para evitar qualquer tipo de viés, seja gerencial ou técnico.

Para mais informações, consulte a documentação do Node.js. Além disso, procure saber quais recursos ECMAScript estão disponíveis para estruturar sua aplicação na versão do Node.js instalada.

  • Gabriel "Barbarize" Corrêa

    15/01/2018 às 18:29

    Boa garoto!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados *