Módulos e NPM em NodeJS
Em NodeJS o código se organiza por meio de módulos. São como os pacotes ou bibliotecas de outras linguagens como Java. Por sua parte, NPM é o nome do gerenciador de pacotes (package manager) que usamos em Node JS.
Se você conhece os gerenciadores de pacotes de Linux poderá fazer uma boa ideia do que é npm, caso contrário , simplesmente entenda-o como uma forma de administrar módulos que você deseja ter instalados, distribuir os pacotes e acrescentar dependências a seus programas.
O gerenciador de pacotes npm, no entanto, é um pouquinho diferente de outros gerenciadores de pacotes que podemos conhecer, porque os instala localmente nos projetos. Ou seja, ao baixar um módulo, se adiciona um projeto local, que é o que terá disponível para incluir.
Incluir módulos com “require”
Javascript nativo não dá suporte aos módulos. Isto é algo que foi adicionado a NodeJS e se realiza com asentença require(), que está inspirada na variante proposta por CommonJS.
A instrução require() recebe como parâmetro o nome do pacote que queremos incluir e inicia uma busca no sistema de arquivos, na pasta “node_modules” e seus filhos, que contêm todos os módulos que poderiam ser requeridos.
Por exemplo, se desejamos trazer a biblioteca para fazer um servidor web, que escute solicitações http, faríamos o seguinte:
var http = require(“http”);
Existem distintos módulos que estão disponíveis de maneira predeterminada em qualquer projeto NodeJS e que portanto não necessitamos trazer previamente ao local mediante o gerenciador de pacotes npm. Esses tomam o nome de “Módulos nativos” e exemplos deles temos o próprio “http”, “fs” para o acesso ao sistema de arquivos, “net” que é um módulo para conexões de rede ainda de mais baixo nível que “http” (na verdade “http” está majoritariamente escrito sobre o módulo “net” github.com/joyent/node/blob/master/lib/http.js), “URL” que permite realizar operações sobre “url”, o módulo “util” que um conjunto de utilidades, “child_process” que te dá ferramentas para executar sobre o sistema, “domain” que te permite manipular erros, etc.
Podemos criar facilmente nossos módulos exportando as funções que desejemos
É claro, também podemos escrever nossos próprios módulos e para isso usamos module.exports. Escrevemos o código de nosso módulo, com todas as funções locais que queiramos, depois fazemos um module.exports = {} e entre as chaves colocamos todo aquilo que queiramos exportar.
function soma(a,b){
return a + b;
}
function multiplicar(a,b){
return a * b;
}
module.exports = {
soma: soma,
multiplicar: multiplicar
}
Assumindo que o arquivo anterior se chame “operações.js”, nós poderíamos requerê-lo mais tarde e outro arquivo.js da seguinte maneira:
var operacoes = require(‘./operacoes’);
operacoes.soma(2,3);
Obviamente, isto é apenas uma tomada de contato e voltaremos a este assunto mais adiante.
Comando npm para gerenciamento de pacotes
No que diz respeito ao uso de npm, é um comando que funciona desde a linha de comandos de NodeJS. Portanto temos que invocá-lo com npm seguido da operação que queiramos realizar.
npm install async
Isto instalará o pacote async dentro de meu projeto. O instalará dentro da pasta “node_modules” e a partir desse momento estará disponível no meu projeto e poderei incluí-lo por meio de “require”:
require(“async”);
Outras instruções possíveis de npm são,a de publicar pacotes (com “publish”), instalar globalmente (pondo o flag -g ao fazer o “install”), desinstalar, inclusive premiar (pontuar pacotes feitos por outras pessoas), etc.
Podemos ver pacotes para instalar entrando na página do gerenciador de pacotes npm: npmjs.org
Por último, sobre npm se mencionou que cada pacote tem entre seu código um arquivo package.json que contém em notação JSON os dados do pacote em si. É como um cartão de identificação do pacote, que pode servir para você se informar de suas características e de qualquer sistema informático.Se você fosse o criador de um pacote, ou criasse alguma aplicação com NodeJS, também deveria incluir “package.json” com os dados do módulo ou aplicação que se está criando, como o autor, versão, dependências, etc.
No artigo seguinte vamos ver algo mais específico, que também nos sirva como primeiro exemplo para realizar em NodeJS. Em concreto veremos o módulo HTTP, com o qual poderemos fazer um rudimentar servidor web.