Como sinto sua dor!
Como muitos, achei difícil chegar à essência do Node.js porque a maioria das pessoas apenas escreve / fala sobre a parte do Node que consideram útil - e a parte que consideram interessante é geralmente um benefício secundário do Node, em vez de seu principal objetivo. Devo dizer que acho loucura as pessoas dizerem que o Node é apenas um runtime de JavaScript. O uso de JavaScript pelo Node - e sua seleção do tempo de execução V8 - são simplesmente meios para um fim , as melhores ferramentas para o problema que os desenvolvedores do Node queriam resolver.
O objetivo principal do Node era tornar o gerenciamento de eventos do usuário em um aplicativo da web mais eficiente. Então Node é esmagadoramenteusado no back-end de um aplicativo da web. O gerenciamento de eventos exige que algo esteja escutando na máquina do servidor para esses eventos do usuário. Portanto, um servidor http deve ser configurado para rotear cada evento para seu script de tratamento apropriado. O Node fornece uma estrutura para configurar rapidamente um servidor para ouvir em uma porta dedicada as solicitações do usuário. O Node usa JavaScript para manipulação de eventos porque JavaScript tem funções de retorno de chamada: isso permite que uma tarefa seja suspensa até que o resultado de uma tarefa dependente seja retornado. Poucas outras linguagens têm esse recurso e aquelas que têm podem não ter um intérprete tão eficiente quanto o tempo de execução V8 do Google. A maioria dos desenvolvedores da web conhece JavaScript, portanto, não há aprendizagem adicional de linguagem com o Node. Além do mais, ter funções de retorno de chamada permite colocar todas as tarefas do usuário em um único threadsem ter bloqueio explícito aplicado a tarefas que exigem acesso ao banco de dados ou sistema de arquivos. E é isso que leva à eficiência de execução superior do Node sob uso intenso e simultâneo - o objetivo principal de seu desenvolvimento.
Para ajudar os usuários do Node a escrever código back-end rapidamente, os desenvolvedores do Node também organizaram uma biblioteca JS integrada para tarefas de rotina (por exemplo, questões relacionadas a solicitações HTTP, string (des) codificação, fluxos, etc.) e o repositório NPM (Node Package Manager) : este é um conjunto de pacotes de script de código aberto mantido pelo usuário para várias funções padrão e personalizadas. Todos os projetos Node permitem a importação de pacotes NPM para um projeto por meio do comando npm install estabelecido .
As solicitações do usuário tratadas via Node serão coisas necessárias para o aplicativo web, como autenticação, consulta de banco de dados, gerenciamento de conteúdo (Strapi CMS), etc. Tudo isso será enviado para a porta do Node. (Onde a análise de dados obtidos de um banco de dados consome muito tempo de CPU, este tipo de processo é melhor colocado em um thread separado para não retardar as solicitações mais simples do usuário.) Outros tipos de solicitação do usuário, por exemplo, para carregar outra página da web , baixar arquivos CSS / JS / imagem, etc, continuará a ser enviado pelo navegador para a (s) porta (s) padrão na máquina do servidor onde o programa do servidor da web (Apache, NGinx, etc) os tratará.
Portanto, na prática , o Node é principalmente uma estrutura para criação rápida de servidor e tratamento de eventos, mas que substitui apenas algumas das funções do programa de servidor da web.
Outros usos não backend do Node simplesmente exploram um ou outro de seus recursos, por exemplo, o motor V8. Por exemplo, as ferramentas de construção de front-end Grunt e Gulp usam Node.js para processar um script de construção que pode ser codificado para converter SASS em CSS, reduzir arquivos CSS / JS, otimizar tamanho / carregamento de imagem etc. Mas esse tipo de trabalho é realmente apenas o uso de subproduto do Node, não seu uso principal, que é para fazer processos de back-end eficientes para aplicativos da web.