Repositório destinado à agregar conceitos e práticas relacionados ao Node.js e JavaScript
É uma plataforma para execução de JavaScript desenhada para ser orientada a eventos assíncronos, permitindo a criação de aplicações que utilizam recursos de rede de forma bastante escalável, podendo lidar com inúmeras conexões concorrentes, sendo mais eficiente comparado ao modelo tradicional baseado em threads.
- Utiliza um conceito de Event Loop que é responsável pela "orquestração" das operações, delegando tarefas e executando callbacks.
- Quase nenhuma função no Node.js executa I/O diretamente, sendo assim difícilmente o processo se tornará bloqueante, facilitando escalonamento da aplicação.
- Grande parte do código é escrito em C++.
- É open-source (repositório Github), fomentando uma comunidade bastante ativa fornecendo excelentes módulos e capacidades adicionais às aplicações.
O Node.js depende de um conjunto de bibliotecas, sendo as principais:
- Engine JavaScript V8 que é controlada pelo Node.js por meio de suas APIs em C++. É mantida pela Google e é a mesma engine do browser Google Chrome.
- libuv é responsável por abstrair operações de I/O não bloqueante em todas as plataformas suportadas pelo Node.js. Provê mecanismos para lidar com filesystem, DNS, network, child processes, pipes, signal handling, polling e streaming. Possui também um thread pool que é utilizado para cargas de trabalho que, à nível de sistema operacional, não conseguem ser executadas de modo assíncrono.
O Node.js também traz algumas ferramentas sendo a mais comum o seu gerenciador de pacotes.
- npm é uma ferramenta de linha de comando que permite o gerenciamento de pacotes no ecosistema do Node.js.
Pode ser utilizado inúmeras aplicações em diversas plataformas, como podemos ver neste relatório oficial Node.js Foundation - User Survey Report, que exibe inúmeras métricas de uso e impacto.
Abaixo, alguns exemplos onde podemos extrair o máximo da plataforma:
- Single Page Applications (SPAs) onde tende à ter um volume de requisições muito grande ao servidor em busca de pequenos fragmentos de dados que vão modelando a interface com o usuário.
- Real-time Applications (RTAs) estes tipos de aplicações executam uma carga ou frequência elevada de operações I/O, podendo aproveitar ao máximo a natureza baseada em eventos assíncronos e performance de rede através de websockets. Ex: Chat rooms, Google Documents/Spreadsheets
- Data Streaming Apps permite através da Stream API transmitir partes (chunks) de dados sem fechar a conexão caso outras operações precisem ser atendidas, sem necessidade de buffering facilitando streaming em tempo real
- REST APIs possui uma posição de destaque na construção de arquiteturas fazendo o uso do protocolo HTTP, e algumas outras vantagens como a não necessidade de conversões entre objetos JSON com o banco NoSQL MongoDB.
- Command line tools se faz viável pela aptidão do Node.js na escrita de scripts de linha de comando.
- Hardware programming (IoT) pode extrair o máximo do Node.js para o processamento de inúmeras requisições de diversos dispositivos periféricos, tendo um fluxo de informações de maneira rápida. Ex: robôs, quadcopters, dispositivos embarcados e IoT
- Praticidade a mesma linguagem pode ser utilizada frontend e backend, acelerando muito o ciclo de desenvolvimento.
- Microservices a natureza do Node.js é perfeita para construção de micro serviços
- Compatibilidade Mobile temos plataformas que permitem construção de aplicativos móveis através de JavaScript como React Native, Ionic, etc.
No ecosistema do Node.js temos módulos nativos e comunitários
- Módulos nativos, embutidos no Node.js, não sendo necessário a instalação.
- Módulos comunitários implementados e distribuídos pela comunidade por meio de alguma ferramenta de gerenciamento de pacotes, sendo a alternativa oficial o npm (Node Package Manager).
Nesta sandbox alguns desses pacotes são testados/explorados nos core-modules, community-modules e também no labs
Alguns conceitos avançados do funcionamento do Node.js são explorados neste documento docs/nodejs-conceitos-avancados.md, dentre eles estão: Event Loop, Relação com C++, libuv, OS e Performance.