A crescente popularidade do JavaScript trouxe muitas mudanças, e a face do desenvolvimento da web hoje é drasticamente diferente.
Hoje em dia é difícil imaginar o que podemos fazer na Web com o JavaScript em execução no servidor e no navegador.
Há apenas alguns anos, ou foram encapsulados em ambientes de área restrita, como Flash ou Java Applets.
Antes de se aprofundar nas soluções Node.js, você pode ler sobre os benefícios do uso de JavaScript, que unifica o idioma e o formato de dados (JSON), permitindo reutilizar da melhor maneira os recursos do desenvolvedor.
Como esse é mais um benefício do JavaScript do que o Node.js especificamente, não discutiremos muito aqui. Mas é uma vantagem importante incorporar o Node.
Update Node JS: um tutorial fácil e rápido!
Afinal, o que é Node.Js?
Como declara a Wikipedia:
O Node.js. é uma compilação empacotada do mecanismo JavaScript V8 do Google, a camada de abstração da plataforma libuv e uma biblioteca principal, que é basicamente escrita em JavaScript.
Po, então quer dizer que Node nada mais é que o javascript nutella? Calma jovem padauã, não é bem assim.
Vale a pena notar que Ryan Dahl, o criador do Node.js, pretendia criar sites em tempo real com capacidade de envio “inspirados em aplicativos como o Gmail”.
No Node.js, ele deu aos desenvolvedores uma ferramenta para trabalhar no paradigma de E/S sem bloqueio e orientado a eventos.
Após mais de 20 anos de web sem estado com base no paradigma de solicitação-resposta, finalmente temos aplicativos da web com conexões bidirecionais em tempo real.
Ok, ok, já entendi que o node veio de Asgard e funciona como o Tesseract, uma joia do infinito.
Em uma frase: o Node.js brilha em aplicativos da web em tempo real, empregando a tecnologia push nos soquetes da web. O que há de tão revolucionário nisso?
Bem, após mais de 20 anos de web com base no paradigma de resposta a pedidos sem estado, finalmente temos aplicativos da web com conexões bidirecionais em tempo real, onde o cliente e o servidor podem iniciar a comunicação, permitindo que eles troquem dados livremente (chupa javascript!).
Isso contrasta fortemente com o paradigma típico de resposta da Web, onde o cliente sempre inicia a comunicação. Além disso, tudo é baseado na Web aberta (HTML, CSS e JS) executada na porta 80 padrão.
Pode-se argumentar que temos isso há anos na forma de Flash e Java Applets — mas, na realidade, esses eram apenas ambientes de área restrita usando a Web como um protocolo de transporte a ser entregue ao cliente.
Além disso, eles eram executados isoladamente e frequentemente operados em portas não padrão, o que pode exigir permissões extras e outras coisas e blá,blá,blá.
Com todas as suas vantagens, o Node.js agora desempenha um papel crítico na tecnologia de muitas empresas de alto nível, que dependem de seus benefícios exclusivos.
A Fundação Node.js consolidou todo o melhor pensamento sobre por que as empresas devem considerar o Node.js em uma breve apresentação que pode ser encontrada na página de Estudos de Caso da Fundação Node.js.
Neste guia do Node.js, discutirei não apenas como essas vantagens são alcançadas, mas também por que você pode querer usar o Node.js. — e por que não — usando alguns dos modelos clássicos de aplicativos da Web como exemplos.
Caso tenha ficado alguma dúvida, esse vídeo é muito didático!
Então chega dessas xurumelas e simbora pro que interessa, man!
Ok, mas como o Node.js funciona?
A principal ideia do Node.js é: Usar E/S orientada a eventos e sem bloqueio para permanecer leve e eficiente, em face de aplicativos em tempo real, com uso intenso de dados que são executados em dispositivos distribuídos.
Não esqueça isso, mizera! Quando perguntarem pra você: “ah, mas por quê o node é tão bom assim? Nem tava na guerra infinita?” Você vai ter a resposta mais linda na ponta da língua (não por que eu escrevi ela, é claro 🤗):
“O que realmente significa é que o Node.js não é uma nova plataforma de bala de prata que dominará o mundo do desenvolvimento web. Em vez disso, é uma plataforma que preenche uma necessidade específica”.
Eu, agora
E entender isso é absolutamente essencial (entendeu?).
Você definitivamente não deseja usar o Node.js para operações com uso intensivo de CPU; usá-lo para computação pesada anulará quase todas as suas vantagens.
Onde o Node realmente brilha é na criação de aplicativos de rede escaláveis e rápidos, pois é capaz de lidar com um grande número de conexões simultâneas com alto rendimento, o que equivale a alta escalabilidade.
Como funciona sob o capô é bastante interessante.
Comparado às técnicas tradicionais de serviço da Web, nas quais cada conexão (solicitação) gera um novo encadeamento, ocupando a RAM do sistema e atingindo o limite máximo de quantidade de RAM disponível e claro toda aquela chatice que acontece e normalmente você fala: “mas na minha máquina funciona”, o Node.js opera em um único encadeamento, usando I / I sem bloqueio, permitindo suportar dezenas de milhares de conexões simultâneas mantidas no loop de eventos.
Caso ainda não esteja claro, vou desenhar pra vocês 😎
Você é bom de matemática? Então responda rápido: supondo que cada thread possua potencialmente 2 MB de memória, rodar em um sistema com 8 GB de RAM nos coloca no máximo teórico de 4.000 conexões simultâneas (cálculos retirados do artigo de Michael Abernethy “Just what is Node.js? ”, publicado no IBM developerWorks em 2011; infelizmente, o artigo não está mais disponível), mais o custo da alternância de contexto entre os encadeamentos.
Esse é o cenário com o qual você normalmente lida nas técnicas tradicionais de exibição na web.
Ao evitar tudo isso, o Node.js atinge níveis de escalabilidade de mais de 1 milhão de conexões simultâneas e mais de 600 mil conexões simultâneas de websockets.
Se você entendeu, parabéns! Poderás ser o novo homem de ferro. Eu por sinal, descobri que não vai rolar pra mim 😬
Obviamente, existe a questão de compartilhar um único encadeamento entre todas as solicitações de clientes, e é uma armadilha potencial para escrever aplicativos Node.js.
Em primeiro lugar, a computação pesada poderia interromper o encadeamento único do Node e causar problemas para todos os clientes (mais sobre isso posteriormente), pois as solicitações recebidas seriam bloqueadas até que a computação fosse concluída.
Em segundo lugar, os desenvolvedores precisam ter muito cuidado para não permitir que uma exceção chegue ao loop de eventos Node.js. (principal), o que fará com que a instância Node.js. seja encerrada (travando efetivamente o programa).
A técnica usada para evitar exceções borbulhando na superfície está transmitindo erros de volta ao chamador como parâmetros de retorno de chamada (em vez de lançá-los, como em outros ambientes).
Mesmo que alguma exceção não tratada consiga surgir, foram desenvolvidas ferramentas para monitorar o processo Node.js e executar a recuperação necessária de uma instância travada.
Embora você provavelmente não consiga recuperar o estado atual da sessão do usuário, o mais comum é o módulo Forever, ou o uso de uma abordagem diferente com as ferramentas externas do sistema, iniciadas e monitoradas, ou mesmo iniciadas.
NPM: O Gerenciador de Pacotes de Nós do Node.js
Ao discutir o Node.js, uma coisa que definitivamente não deve ser omitida é o suporte interno ao gerenciamento de pacotes usando o NPM, uma ferramenta que vem por padrão a cada instalação do Node.js.
A ideia dos módulos NPM é bastante semelhante à do Ruby Gems (coisa boa essa linguagem, deveriam experimentar em uns jogos): um conjunto de componentes reutilizáveis publicamente disponíveis.
Disponíveis através de fácil instalação via repositório on-line, com gerenciamento de versões e dependências.
Uma lista completa de módulos empacotados pode ser encontrada no site npm ou acessada usando a ferramenta CLI npm, que é automaticamente instalada com o Node.js.
O ecossistema do módulo é aberto a todos e qualquer pessoa pode publicar seu próprio módulo que será listado no repositório npm.
Pra você que chegou até aqui, agora vamos aos bônus e as DLcs de grátis!
Alguns dos módulos npm mais úteis atualmente são:
- 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 dos aplicativos Node.j atualmente disponíveis.
- Hapi: Uma estrutura centrada na configuração, modular e simples de usar, para a construção de aplicativos da Web e de serviços
- Connect: Connect é uma estrutura de servidor HTTP extensível para Node.js, fornecendo uma coleção de “plugins” de alto desempenho conhecidos como middleware; serve como base básica para o Express.
- Socket.io e Sockjs: Componente do lado do servidor dos dois componentes mais comuns dos websockets atualmente disponíveis.
- Pug (anteriormente Jade ): Um dos mecanismos de modelos populares, inspirado no HAML, um padrão no Express.js.
- Mongodb e Mongojs: wrappers MongoDB para fornecer a API para bancos de dados de objetos MongoDB em Node.js.
- Redis: Biblioteca de clientes Redis.
- Lodash (sublinhado, lazy.js): O cinto de utilidades JavaScript. O Underscore iniciou o jogo, mas foi derrubado por um de seus dois colegas, principalmente devido ao melhor desempenho e implementação modular.
- Forever: Provavelmente o utilitário mais comum para garantir que um determinado script de nó seja executado continuamente. Mantém o processo do Node.js em produção diante de falhas inesperadas.
- Bluebird: Uma implementação Promises / A + completa com desempenho excepcionalmente bom
- Moment: Uma biblioteca de datas JavaScript para analisar, validar, manipular e formatar datas.
A lista continua. Existem toneladas de pacotes realmente úteis por aí, disponíveis para todos (sem ofensa para os que eu omiti aqui).
Exemplos de onde o Node.js deve ser usado
Bate-Papo
O bate-papo é o aplicativo multiusuário mais típico em tempo real (lembra do nosso msn, né? Quem nunca encheu o saco sacudindo a tela pedindo atenção).
Desde o IRC (de volta ao dia), passando por muitos protocolos proprietários e abertos em execução em portas não padrão, até a capacidade de implementar tudo hoje no Node.js com websockets executando a porta 80 padrão.
O aplicativo de bate-papo é realmente o exemplo ideal do Node.js.: é um aplicativo leve, de alto tráfego e com uso intenso de dados (mas com baixo processamento/computação), que é executado em dispositivos distribuídos.
Também é um ótimo caso de uso para o aprendizado, pois é simples, mas abrange a maioria dos paradigmas que você utilizará em um aplicativo típico do Node.js.
Vamos tentar descrever como isso funciona (relaxa que no final eu desenho de novo).
No exemplo mais simples, temos uma única sala de bate-papo em nosso site, onde as pessoas vêm e podem trocar mensagens da maneira um para muitos (na verdade, todas).
Por exemplo, digamos que temos três pessoas no site, todas conectadas ao nosso quadro de mensagens (pensa num tinder estilo ménage, não que eu conheça nenhum desses dois é claro).
No lado do servidor, temos um aplicativo Express.js simples que implementa duas coisas:
- Um manipulador GET / request, que serve a página da Web e contém um quadro de mensagens e um botão ‘Enviar’ para inicializar a entrada de novas mensagens
- Um servidor websockets, que escuta novas mensagens emitidas pelos clientes websocket.
No lado do cliente, temos uma página HTML com alguns manipuladores configurados.
Um para o evento de clique no botão ‘Enviar’, que pega a mensagem de entrada e a envia pelo websocket.
Outra que recebe novas mensagens recebidas no cliente websockets (ou seja, mensagens enviadas por outros usuários, que o servidor agora deseja que o cliente exiba).
Quando um dos clientes publica uma mensagem, eis o que acontece:
- O navegador captura o clique no botão ‘Enviar’ através de um manipulador JavaScript, pega o valor no campo de entrada (ou seja, o texto da mensagem) e emite uma mensagem websocket, usando o cliente websocket conectado ao nosso servidor (inicializado na inicialização da página da web).
- O componente do servidor da conexão do websocket recebe a mensagem e a encaminha para todos os outros clientes conectados usando o método de transmissão.
- Todos os clientes recebem a nova mensagem como uma mensagem push por meio de um componente do lado do cliente dos websockets em execução na página da web. Eles então escolhem o conteúdo da mensagem e atualizam a página da Web anexando a nova mensagem ao quadro.
Esse é o exemplo mais simples. Para uma solução mais robusta, você pode usar um cache simples com base no armazenamento Redis.
Ou, em uma solução ainda mais avançada, uma fila de mensagens para lidar com o roteamento de mensagens para clientes e um mecanismo de entrega mais robusto, que pode cobrir perdas temporárias de conexão ou armazenar mensagens para clientes registrados enquanto estão offline.
Mas, independentemente das melhorias que você fizer, o Node.js ainda estará operando sob os mesmos princípios básicos: reagindo a eventos, manipulando muitas conexões simultâneas e mantendo a fluidez na experiência do usuário.
API em cima de um banco de dados de objetos
Embora o Node.js realmente brilhe com aplicativos em tempo real, é perfeitamente natural expor os dados dos bancos de dados de objetos (por exemplo, MongoDB).
Os dados armazenados JSON permitem que o Node.js funcione sem a incompatibilidade de impedância e a conversão de dados.
Por exemplo, se você estiver usando o Rails, converterá de JSON para modelos binários e os exporá de volta como JSON sobre o HTTP quando os dados forem consumidos por Backbone.js, Angular.js, etc. ou mesmo jQuery AJAX simples chamadas.
Com o Node.js, você pode simplesmente expor seus objetos JSON com uma API REST para o cliente consumir.
Além disso, você não precisa se preocupar com a conversão entre JSON e o que quer que seja ao ler ou gravar em seu banco de dados (se estiver usando o MongoDB).
Em suma, você pode evitar a necessidade de várias conversões usando um formato uniforme de serialização de dados no cliente, servidor e banco de dados.
Entradas em fila
Se você estiver recebendo uma grande quantidade de dados simultâneos, seu banco de dados pode se tornar um gargalo.
Como mostrado acima, o Node.js pode lidar facilmente com as conexões simultâneas.
Mas, como o acesso ao banco de dados é uma operação de bloqueio (neste caso), encontramos problemas. A solução é reconhecer o comportamento do cliente antes que os dados sejam realmente gravados no banco de dados.
Com essa abordagem, o sistema mantém sua capacidade de resposta sob uma carga pesada, o que é particularmente útil quando o cliente não precisa da confirmação firme da gravação bem-sucedida dos dados.
Exemplos típicos incluem: o registro ou gravação de dados de rastreamento do usuário, processados em lotes e não utilizados até mais tarde; bem como operações que não precisam ser refletidas instantaneamente (como atualizar uma contagem de ‘Curtidas’ no Facebook), onde a consistência eventual (geralmente usada no mundo NoSQL) é aceitável.
Os dados são enfileirados por meio de algum tipo de infraestrutura de cache ou de enfileiramento de mensagens — como RabbitMQ ou ZeroMQ — e digeridos por um processo separado de gravação em lote de banco de dados.
Ou então, serviços de back-end de processamento intensivo de computação, escritos em uma plataforma com melhor desempenho para essas tarefas.
Comportamento semelhante pode ser implementado com outras linguagens/estruturas, mas não no mesmo hardware, com a mesma alta e mantida taxa de transferência.
Em resumo: com o Node, você pode empurrar as gravações do banco de dados para o lado e lidar com elas mais tarde, procedendo como se tivessem sucesso.
Transmissão de Dados
Nas plataformas da web mais tradicionais, solicitações e respostas HTTP são tratadas como eventos isolados. Na verdade, eles são realmente fluxos.
Essa observação pode ser utilizada no Node.js para criar alguns recursos interessantes.
Por exemplo, é possível processar arquivos enquanto eles ainda estão sendo carregados, pois os dados chegam por meio de um fluxo e podemos processá-los on-line.
Isso pode ser feito para codificação de áudio ou vídeo em tempo real e proxy entre diferentes fontes de dados (consulte a próxima seção).
Proxy
O Node.js é facilmente empregado como um proxy do lado do servidor, onde pode lidar com uma grande quantidade de conexões simultâneas de maneira não-bloqueadora.
É especialmente útil para fazer o proxy de diferentes serviços com diferentes tempos de resposta ou coletar dados de vários pontos de origem.
Um exemplo: Considere um aplicativo do servidor se comunicando com recursos de terceiros, obtendo dados de diferentes fontes ou armazenando ativos como imagens e vídeos em serviços em nuvem de terceiros.
Embora existam servidores proxy dedicados, o uso do Node pode ser útil se a sua infraestrutura de proxy não existir ou se você precisar de uma solução para o desenvolvimento local.
Com isso quero dizer que você poderia criar um aplicativo do lado do cliente com um servidor de desenvolvimento Node.js. para recursos e solicitações de API de proxy / stubbing, enquanto na produção você lidaria com essas interações com um serviço de proxy dedicado (nginx, HAProxy etc.)
Correção — Painel do Comercial
Vamos voltar ao nível do aplicativo.
Outro exemplo em que o software de desktop domina, mas pode ser facilmente substituído por uma solução da Web em tempo real, é o software de negociação de corretores, usado para rastrear os preços das ações, realizar cálculos, análises técnicas e criar gráficos ou tabelas.
Mudar para uma solução baseada na Web em tempo real permitiria aos corretores trocar facilmente estações de trabalho ou locais de trabalho.
Em breve, poderemos começar a vê-los na praia da Flórida, ou Ibiza, ou Bali, ou até mesmo em Floripa 😜.
Painel de monitoramento de aplicativos
Outro caso de uso comum no qual o Nó com soquetes da Web se encaixa perfeitamente: rastreando os visitantes do site e visualizando suas interações em tempo real.
Você pode coletar estatísticas em tempo real do seu usuário ou até movê-lo para o próximo nível, introduzindo interações direcionadas com seus visitantes, abrindo um canal de comunicação quando eles atingirem um ponto específico no seu funil.
(Se você estiver interessado, essa ideia já está sendo produzida pelo CANDDi .)
Imagine como você poderia melhorar seus negócios se soubesse o que seus visitantes estavam fazendo em tempo real — se pudesse visualizar as interações deles.
Com os soquetes bidirecionais em tempo real do Node.js, agora você pode.
Painel de monitoramento do sistema
Agora, vamos visitar o lado da infraestrutura (tem um brother meu, o Gui gui do café forte, que vai gostar dessa parte).
Imagine, por exemplo, um provedor de SaaS que queira oferecer a seus usuários uma página de monitoramento de serviços, como a página de status do GitHub.
Com o loop de eventos do Node.js., podemos criar um poderoso painel baseado na Web que verifica os status dos serviços de maneira assíncrona e envia dados aos clientes que usam websockets.
Tanto o status dos serviços internos (dentro da empresa) quanto os serviços públicos podem ser relatados ao vivo e em tempo real usando essa tecnologia.
Aprofunde um pouco mais essa ideia e tente imaginar aplicativos de monitoramento do Network Operations Center (NOC) em um operador de telecomunicações, provedor de nuvem/rede/hospedagem ou alguma instituição financeira.
Todos executados na pilha da Web aberta, suportada pelo Node.js e websockets, em vez de Java e/ou Java Applets.
Nota: Não tente criar sistemas rígidos em tempo real no Node (ou seja, sistemas que exigem tempos de resposta consistentes). Erlang é provavelmente uma escolha melhor para essa classe de aplicativo.
Aplicações web do servidor
O Node.js, com o Express.js, também pode ser usado para criar aplicativos da Web clássicos no lado do servidor.
No entanto, embora possível, esse paradigma de solicitação-resposta no qual o Node.js carregaria o HTML renderizado não é o caso de uso mais comum.
Há argumentos a serem feitos a favor e contra essa abordagem. Aqui estão alguns fatos a serem considerados:
Prós
- Se o seu aplicativo não possuir computação intensiva da CPU, você poderá construí-lo em Javascript de cima para baixo, até o nível do banco de dados, se você usar um BD de Objetos de armazenamento JSON, como o MongoDB. Isso facilita significativamente o desenvolvimento (incluindo a contratação).
- Os rastreadores recebem uma resposta HTML totalmente renderizada, que é muito mais amigável ao SEO do que, digamos, um aplicativo de página única ou um aplicativo websockets executado sobre o Node.js.
Contras
- Qualquer computação intensiva da CPU bloqueará a capacidade de resposta do Node.js. Portanto, uma plataforma encadeada é uma abordagem melhor. Como alternativa, você pode tentar expandir o cálculo [*].
- Usar o Node.js com um banco de dados relacional ainda é bastante trabalhoso (veja abaixo para mais detalhes). Faça um favor a si mesmo e escolha outro ambiente, como Rails, Django ou ASP.Net MVC, se você estiver tentando executar operações relacionais.
[*] Uma alternativa a esses cálculos intensivos da CPU é criar um ambiente de backup MQ altamente escalável com processamento de backend para manter o Node como um ‘funcionário’ de frente para lidar com solicitações de clientes de forma assíncrona.
Onde o Node.js não deve ser usado (se liga nessa parte!)
Aplicativo web do servidor lateral com um DB relacional atrás
Comparando o Node.js com o Express.js contra o Ruby on Rails, por exemplo, costumava haver uma decisão clara a favor do último quando se tratava de acessar bancos de dados relacionais como PostgreSQL, MySQL e Microsoft SQL Server.
As ferramentas de banco de dados relacional para o Node.js ainda estavam em seus estágios iniciais.
Por outro lado, o Rails fornece automaticamente a configuração de acesso a dados imediatamente, juntamente com as ferramentas de suporte à migração de esquemas de banco de dados e outras Gems (trocadilhos).
O Rails e suas estruturas de pares têm implementações maduras e comprovadas da camada de acesso a dados do Active Record ou Data Mapper. [*]
Mas as coisas mudaram. Seqüelizar, TypeORM e Bookshelf foram um longo caminho para se tornarem soluções ORM maduras.
Também pode valer a pena conferir o Join Monster se você estiver procurando gerar SQL a partir de consultas GraphQL.
[*] É possível e não incomum usar o Node apenas como front-end, mantendo o back-end do Rails e seu fácil acesso a um banco de dados relacional.
Apache Kafka: o que é e como integrar dados
Node.js: realmente vale a pena?
Discutimos o Node.js da teoria à prática, começando com seus objetivos e ambições e terminando com seus pontos positivos e negativos.
Quando as pessoas enfrentam problemas com o Node, quase sempre se resume ao fato de que as operações de bloqueio são a raiz de todos os males — 99% dos usos indevidos do nó são uma consequência direta.
Lembre-se: o Node.js nunca foi criado para resolver o problema de dimensionamento da computação. Foi criado para resolver o problema de dimensionamento de E / S, o que faz muito bem.
Então, Brunão do meu agrado, por que usar o Node.js?
Se o seu caso de uso não contiver operações intensivas de CPU (tipo o jogo Zelda 4k) nem acessar recursos de bloqueio, você poderá explorar os benefícios do Node.js e aproveitar aplicativos de rede rápidos e escaláveis.
Pós-créditos: Computação e Processamento pesado do lado do servidor
Quando se trata de computação pesada, o Node.js não é a melhor plataforma existente.
Não, você definitivamente não deseja criar um servidor de computação Fibonacci no Node.js.
Em geral, qualquer operação intensiva da CPU anula todos os benefícios de taxa de transferência que o Node oferece com seu modelo de E / S não bloqueado por eventos.
Isso pois todas as solicitações recebidas serão bloqueadas enquanto o encadeamento estiver ocupado com a trituração de números — supondo que você esteja tentando executar seus cálculos na mesma instância do Node com a qual você está respondendo às solicitações.
Como afirmado anteriormente, o Node.js é de thread único e usa apenas um único núcleo de CPU.
Quando se trata de adicionar simultaneidade em um servidor com vários núcleos, a equipe principal do Node trabalha na forma de um módulo de cluster [ref: http://nodejs.org/api/cluster.html].
Você também pode executar várias instâncias do servidor Node.js. com bastante facilidade por trás de um proxy reverso via nginx .
Com o armazenamento em cluster, você ainda deve descarregar toda a computação pesada em processos em segundo plano gravados em um ambiente mais apropriado para isso, e comunicá-los por meio de um servidor de fila de mensagens como o RabbitMQ.
Embora seu processamento em segundo plano possa ser executado no mesmo servidor inicialmente, essa abordagem tem o potencial de uma escalabilidade muito alta.
Esses serviços de processamento em segundo plano podem ser facilmente distribuídos para servidores de trabalho separados, sem a necessidade de configurar as cargas de servidores da Web voltados para a frente.
Obviamente, você também usaria a mesma abordagem em outras plataformas, mas com o Node.js você obtém o alto rendimento de reqs / s de que falamos, pois cada solicitação é uma pequena tarefa tratada com rapidez e eficiência.
Bem-vindo à web em tempo real. De seu amigo da vizinhança, o Brunoaranha 🤗
FAQ
O que é Node.js?
O Node.js. é uma compilação empacotada do mecanismo JavaScript V8 do Google, a camada de abstração da plataforma libuv e uma biblioteca principal, que é basicamente escrita em JavaScript.
Ou seja, com o Node.js, você passa a utilizar Javascript não somente nos navegadores, mas em qualquer ambiente. As possibilidades aumentam muito.
Ele usa uma arquitetura voltada a eventos, onde interpreta, em uma única thread, as requisições de forma assíncrona em vez de sequenciais, e não permitindo bloqueios.
Por que usar Node.js?
O loop de eventos do Node recebe várias requisições, como por exemplo, buscar alguma informação no banco, ler um arquivo no servidor, etc. Ao executar uma ação, ele não espera o tempo de resposta, já iniciando a ação da segunda, e assim por diante.
Assim que alguma dessas requisições forem respondidas, é disparado um evento e o callback é posto na fila para ser executado.
Lidando com a concorrência dessa maneira, evita-se a criação de múltiplas threads que ocupariam grande parte da CPU. Pelo Node, ocorre um ganho muito grande de número de requisições que podem ser processadas.
Onde usar Node.js?
Em resumo, você deve usar o Node.js em situações em que há muitas requisições, já que, usando um loop de eventos, o Node.js interpreta, em uma única thread, as requisições de forma assíncrona em vez de sequenciais, e não permitindo bloqueios.
Você pode usar Node.js em APIs, aplicações web em tempo real como chats ou ferramentas de múltiplos usuários, jogos multiplayer, aplicações que demandam alta escabilidade, servidores de streaming de dados e ambientes escaláveis.
Onde não usar Node.js?
Por usar somente uma thread, não é recomendado usar o Node.js em algoritmos complexos que exijam muita CPU. Também não deve ser usado em aplicações que exploram os recursos de bloqueio.
Por exemplo, em softwares de edição de imagens, ele impediria as outras ações de serem executadas até o processamento estar completo!