O que é Node.js e outras 5 dúvidas fundamentais

Node.js é um fenômeno tem alguns anos. Diversos players gigantes da indústria de Internet tem adotado a plataforma, seja como uma ferramenta auxiliar, seja como sua principal tecnologia. O fato é que funciona, é eficiente e eficaz.

A ideia do post de hoje é explicar de uma vez por todas o que é Node.js e também solucionar outras dúvidas mais fundamentais, ao mesmo tempo em que apresento os principais conceitos de Node.js, suas principais características, vantagens, desvantagens, tecnologias concorrentes e falar das principais extensões.

Vamos ver nesse post (clique para ir direto ao tópico):

  1. O que é?
  2. Quais as vantagens?
  3. Quais as desvantagens?
  4. Para quê serve?
  5. Quais são os concorrentes?
  6. O que é usado em conjunto?

Caso prefira assistir um vídeo, eu palestrei sobre estes mesmos assuntos + MongoDB durante o IX Telecomptec na Universidade LaSalle, em Canoas/Rs, que você pode conferir ali pelo minuto 15 do vídeo abaixo:

#1 – O que é?

Node.js é uma tecnologia assíncrona que trabalha em uma única thread de execução. Por assíncrona entenda que cada requisição ao Node.js não bloqueia o processo do mesmo, atendendo a um volume absurdamente grande de requisições ao mesmo tempo mesmo sendo single thread.

Imagine que existe apenas um fluxo de execução. Quando chega uma requisição, ela entra nesse fluxo, a máquina virtual Javascript verifica o que tem de ser feito, delega a atividade (consultar dados no banco, por exemplo) e volta a atender novas requisições enquanto este processamento paralelo está acontecendo. Quando a atividade termina (já temos os dados retornados pelo banco), ela volta ao fluxo principal para ser devolvida ao requisitante.

Isso é diferente do funcionamento tradicional da maioria das linguagens de programação, que trabalham com o conceito de multi-threading, onde, para cada requisição recebida, cria-se uma nova thread para atender à mesma. Isso porque a maioria das linguagens tem comportamento bloqueante na thread em que estão, ou seja, se uma thread faz uma consulta pesada no banco de dados, a thread fica travada até essa consulta terminar.

Esse modelo de trabalho tradicional, com uma thread por requisição é mais fácil de programar, mas mais oneroso para o hardware, consumindo muito mais recursos.

Node.js não é uma linguagem de programação. Você programa utilizando a linguagem Javascript, a mesma usada há décadas no client-side das aplicações web. Javascript é uma linguagem de scripting interpretada, embora seu uso com Node.js guarde semelhanças com linguagens compiladas, uma vez que máquina virtual V8 (veja mais adiante) faz etapas de pré-compilação e otimização antes do código entrar em operação.

Node.js não é um framework Javascript. Ele está mais para uma plataforma de aplicação (como um Nginx?), na qual você escreve seus programas com Javascript que serão compilados, otimizados e interpretados pela máquina virtual V8. Essa VM é a mesma que o Google utiliza para executar Javascript no browser Chrome, e foi a partir dela que o criador do Node.js, Ryan Dahl, criou o projeto. O resultado desse processo híbrido é entregue como código de máquina server-side, tornando o Node.js muito eficiente na sua execução e consumo de recursos.

Node.js não é uma bala de prata. Ele não resolve todos os problemas. Na verdade nenhuma tecnologia vai resolver todos os seus problemas da melhor maneira possível. Quem acha que apenas uma tecnologia é a melhor opção para todos os cenários ou é ingênuo ou só inexperiente mesmo.

#2 – Quais as vantagens?

Node.js é programado com Javascript. Javascript tem algumas décadas de existência e milhões de programadores ao redor do mundo. Qualquer pessoa sai programando em JS em minutos (não necessariamente bem) e você contrata programadores facilmente para esta tecnologia. O mesmo não pode ser dito das plataformas concorrentes (veja mais adiante).

Node.js permite Javascript full-stack. Uma grande reclamação de muitos programadores web é ter de trabalhar com linguagens diferentes no front-end e no back-end. Node.js resolve isso ao permitir que você trabalhe com JS em ambos e a melhor parte: nunca mais se preocupe em ficar traduzindo dados para fazer o front-end se comunicar com o backend e vice-versa. Você pode usar JSON para tudo.

Claro, isso exige uma arquitetura clara e um tempo de adaptação, uma vez que não haverá a troca de contexto habitual entre o client-side e o server-side. Mas quem consegue, diz que vale muito a pena.

Node.js é muito leve e é multiplataforma. Isso permite que você consiga rodar seus projetos em servidores abertos e com o SO que quiser, diminuindo bastante seu custo de hardware (principalmente se estava usando Java antes) e software (se pagava licenças de Windows). Só a questão de licença de Windows que você economiza em players de datacenter como Amazon chega a 50% de economia, fora a economia de hardware que em alguns projetos meus chegou a 80%.

#3 – Quais as desvantagens?

Node.js é programado com Javascript. Para quem gosta de linguagens estritas como Java e C# (como eu), isso incomoda bastante. Não ter orientação à objetos, não ter tipagem, não ter uma compilação bacana, etc.

Node.js é recente. Apesar de já ter muita coisa criada pra ele, isso é uma desvantagem em relação à linguagens mais maduras como Java (21 anos) e Python (27 anos). Mesmo o C# (15 anos) já está bastante calejado e maduro, o que nos garante mais confiança para executar projetos maiores e mais pesados.

Node.js é assíncrono. Isso complica bastante dependendo da complexidade de cada uma das suas requisições, uma vez que o uso demasiado de callbacks pode gerar o chamado callback hell com um aninhamento extenso de funções e uma complexidade absurda de depuração.

#4 – Para quê serve?

Serve para fazer o que você quiser, desde sites à scripts de automação. No entanto, usos ideais de Node.js seriam:

Node.js serve para fazer APIs. Esse talvez seja o principal uso da tecnologia, uma vez que por default ela apenas sabe processar requisições. Não apenas por essa limitação, mas também porque seu modelo não bloqueante de tratar as requisições o torna excelente para essa tarefa consumindo pouquíssimo hardware.

Node.js serve para fazer backend de jogos e apps de mensagens. Sim eu sei, isso é praticamente a mesma coisa do item anterior, mas realmente é uma boa ideia usar o Node.js para APIs nestas circunstâncias (backend as a service) devido ao alto volume de requisições que esse tipo de aplicações efetuam.

Node.js serve para fazer aplicações de tempo real. Usando algumas extensões de web socket com Socket.io, Comet.io, etc é possível criar aplicações de tempo real facilmente sem onerar demais o seu servidor como acontecia antigamente com Java RMI, Microsoft WCF, etc.

#5 – Quais são os concorrentes?

Embora muitos costumem comparar Node.js com tecnologias mais comuns como PHP, Python e Ruby, elas não são de fato concorrentes do Node se a gente comparar o propósito específico de cada uma. Sendo assim, os concorrentes mais adequados para o Node.js seriam:

Node.js vs Go. Linguagem criada pelo Google, o Go tem um modelo alternativo para lidar com threads também, que é muito mais leve do que o modelo tradicional do Java, C#, etc tornando-o muito poderoso e leve como um Node.js mas mais parecido com o C (mais estrito).

Node.js vs Scala. Considerado por muitos uma evolução do Java, é apontado por muitos como o sucessor definitivo do mesmo, embora ainda esteja engatinhando. Em tese ela tem as mesmas vantagens do Java (escala, segurança, velocidade), sem a desvantagem do consumo excessivo de recursos.

Node.js vs Elixir. O mais desconhecido dos 3, ficou popular após a ascensão do Whatsapp como maior mensageiro instantâneo do mundo. Para quem não sabe, o Whatsapp usa Elixir, que roda sobre uma máquina virtual Erlang, com características parecidas com as do Node.js e paradigma funcional.

#6 – O que é usado em conjunto?

Como mencionei anteriormente, o Node.js por si só não tem muita coisa pronta, você tem de criar do zero tudo que quiser fazer, desde um handler de requisições até um renderizador de HTML. Felizmente, há muita coisa bacana pronta criada pela comunidade, que você pode instalar via NPM:

Node.js + Express. Boilerplate e framework web mais famoso para Node.js. Inclui suporte a diferentes view engines, funciona no padrão MVC, possui JSON e HTTP na caixa, trabalha com URLs amigáveis nativamente e muito mais, sem deixar de ser bem leve, o tornando indispensável para APIs e aplicações web escritas em Node.

Já usei ele aqui em alguns tutoriais aqui do blog.

Node.js + Mongoose. Biblioteca ORM para uso de Node.js com MongoDB. Não é a única existente, mas de longe a que possui a maior performance (50% mais rápido que seu principal concorrente, o Monk), sendo a número um do mercado. Os mesmos tutoriais de uso do Express que tem aqui no blog usam Mongoose também.

Node.js + EJS. É um renderizador de páginas HTML (view engine) para quem gosta de escrever HTML. Não é necessariamente idolatrado, mas uma boa opção para diminuir a curva de aprendizado do Jade/Pug (view engine padrão do Express) e atrair profissionais de front end mais facilmente pra sua equipe.

Node.js + Socket.io. Extensão muito poderosa e popular para uso de sockets com Node.js, usada especialmente em jogos e aplicações de tempo real que exigem comunicação instantânea e conexões persistentes entre cliente e servidor.

E aí, esqueci de cobrir alguma coisa?

Está curtindo os conteúdos de Node.js aqui do blog?

Deixe aí nos comentários!

O que achou desse artigo?
[Total: 2 Média: 5]