Pessoal, vamos trabalhar com módulos em nossa aplicação Node. Vou começar com o código abaixo.

http = require('http');

Essa instrução carrega o módulo http, um módulo do sistema core module.
O carregamento de módulos em Node é feito pela função require. Para quem vem do Python é como executar o código:

import os as real_os

Módulos são sub programas que executão tarefas bem definidas. Nós esperamos com nosso exemplo que o módulo http permita que utilizemos os protocolo http. Os módulos do sistema do Node têm suas funções documentadas na página da API do Node.

Core Module

São módulos embutidos no Node. Eles são carregados pela declaração sem prefixo do nome do módulo. Por exemplo:

require('buffer');

Módulos declarados dessa forma dão preferência aos módulos do sistema, mesmo tendo um arquivo buffer.js na raiz de nossa aplicação.

Módulos da aplicação.

É comum uma grande aplicação dividir suas tarefas em módulos para atender aos requisitos do sistema, tomando como exemplo uma aplicação com o arquivo circle.js (expõe funções matemáticas aplicadas a círculos) em sua raiz. Esse arquivo corresponde a um módulo da aplicação e pode ser chamado da seguinte forma:

circle = require('./circle');
circle = require('circle');
circle = require('/path/to/app/circle');

todas são formas válidas de carregar módulos na aplicação.

Prefixos ./ /

Os prefixos determinam a localização do módulo. O prefíxo / utiliza o caminho absoluto do módulo, já o prefíxo ./ utiliza o caminho relativo a partir do caminho atual.

dica: Quando o módulo não vem prefixado e há um conflito de nomes com módulos do sistema, os módulos do sistema ganham preferência no carregamento.

Extensão dos módulos

Quando os módulos não tem a extensão explícita o Node procura pelas seguintes extensões em sua devida ordem :

  • Primeiro .js: o arquivo é iterpretado como um arquivo de código fonte javascript;
  • Depois .json: é utilizado um analisador JSON no arquivo;
  • Por último .node: interpretado como um addon através do dlopen.

Módulos do node_module

Quando o arquivo não é prefixado e não é nativo do Node core modules, o Node busca o módulo na pasta node_module. A busca percorre toda o caminho de diretórios do código executado até a raíz.

Fica mais fácil de entender com o exemplo abaixo. (vamos supor que código é executado em /path/to/app/code.js)

require('mymodule');

Como mymodule não é um módulo do sistema ele então pesquisa na pastas node_module. Essa pesquisa é recursiva por todo o caminho iniciando no diretório atual até atingir a raiz.

  • /path/to/app/node_modules/mymodule.js
  • /path/to/node_modules/mymodule.js
  • /path/node_modules/mymodule.js
  • /node_modules/mymodule.js

Diretórios como módulos

Quando um diretório da aplicação contém um arquivo package.json ele é também é considerado um módulo e pode ser carregado como outros módulos.

draw = require('./draw');

Ele busca pelo arquivo: ./draw/package.json que contém informações do módulo e qual arquivo carregar. Caso não exista esse arquivo mas exista um index.js ele é utilizado como arquivo source do módulo.

Outras informações que você deve conhecer sobre os módulos

  • Os módulos são carregados apenas uma vez.
  • Node trata as chamadas cíclicas de módulos, então mesmo que não seja muito bom tê-las você não precisa se preocupar.
  • Somente variáveis exportadas estão disponíveis no módulo, as demais variáveis e funções são privadas do módulo.
  • Você pode carregar somente atributos específicos do módulo. Ex: var EventEmitter = require('events').EventEmitter;