Modulos - Node.js
O Node.js utiliza um sistema modular. Isso significa que toda a funcionalidade incorporada é dividida em pacotes ou módulos separados. Um módulo representa um bloco de código que pode ser reutilizado em outros lugares.
Quando necessário, podemos importar os módulos. As suas funcionalidades são podem ser encontrados na documentação.
No mundo do JavaScript, existem diferentes sistemas de módulos. Por padrão, o Node.js aplica o sistema de módulos CommonJS, que considera cada arquivo como um módulo e utiliza a função require()
http
const http = require("http");
Após importar o módulo, podemos usar toda a funcionalidade definida nele, que também pode ser encontrada na documentação.
De maneira similar, podemos carregar e usar outros módulos incorporados. Por exemplo, usemos o módulo os
app.js
const os = require("os");
// Obteremos o nome do usuário atual
const userName = os.userInfo().username;
console.log(userName);
Executamos esta aplicação com o comando node app.js
c:\app> node app.js programicio
Criando Seus Próprios Módulos
Não estamos limitados apenas aos módulos incorporados e, quando necessário, podemos criar nossos próprios módulos. Assim, adicionamos ao diretório da aplicação (onde está o arquivo app.js
greeting.js
console.log("Hello Programício");
No arquivo app.js
const greeting = require("./greeting");
Diferentemente dos módulos incorporados, para importar nossos módulos, precisamos passar o caminho relativo com o nome do arquivo (a extensão do arquivo é opcional) para a função require
c:\app> node app.js Hello Programício
A string definida no arquivo greeting.js
Vale notar que, dentro do módulo, podemos obter informações sobre o próprio módulo usando o objeto especial module
greeting.js
console.log(module);
Reexecutamos o arquivo app.js
c:\app> node app.js { id: '/Users/programicio/Documents/app/greeting.js', path: '/Users/programicio/Documents/app', exports: {}, filename: '/Users/programicio/Documents/app/greeting.js', loaded: false, children: [], paths: [ '/Users/programicio/Documents/app/node_modules', '/Users/programicio/Documents/node_modules', '/Users/programicio/node_modules', '/Users/node_modules', '/node_modules' ] }
Aqui, vemos que o objeto module
Exportando de um Módulo
Agora, vamos definir um conteúdo mais interessante no módulo greeting.js
greeting.js
const currentDate = new Date();
// Dependendo da hora, exibimos uma mensagem específica
function printMessage(name) {
const hour = currentDate.getHours();
if (hour >= 18) {
console.log("Boa noite,", name);
} else if (hour >= 12) {
console.log("Boa tarde,", name);
} else {
console.log("Bom dia,", name);
}
}
Aqui, definimos a constante currentDate
printMessage
Podemos usar a constante currentDate
printMessage
greeting.js
app.js
greeting
const greeting = require("./greeting");
console.log(greeting); // {}
Executamos o arquivo app.js
c:\app> node app.js {} c:\app>
Vemos que o módulo greeting
greeting.js
const currentDate = new Date();
exports.date = currentDate; // Exportando a constante currentDate como date
// Exportando a função
exports.printMessage = function (name) {
const hour = currentDate.getHours();
if (hour >= 18) {
console.log("Boa noite,", name);
} else if (hour >= 12) {
console.log("Boa tarde,", name);
} else {
console.log("Bom dia,", name);
}
}
Para tornar as variáveis/constantes ou funções de um módulo acessíveis, precisamos exportá-las. Para isso, usamos o objeto exports
Agora, alteramos o arquivo app.js
const os = require("os");
const greeting = require("./greeting");
// Nome do usuário atual
const userName = os.userInfo().username;
console.log(`Data da solicitação: ${greeting.date}`);
greeting.printMessage(userName);
Reexecutamos a aplicação. No meu caso, o resultado será:
c:\app> node app.js Data da solicitação: Tue Nov 21 2023 18:23:06 Boa tarde, programicio
Importando Componentes de um Módulo
No exemplo acima, importamos toda a funcionalidade do módulo como um todo e, através do nome greeting
const greeting = require("./greeting");
No entanto, também podemos importar componentes individualmente:
// Obtendo componentes do módulo individualmente
const { date, printMessage } = require("./greeting");
// Nome do usuário atual
const userName = "Tom";
console.log(`Data da solicitação: ${date}`);
printMessage(userName);
Aqui, para obter os componentes do módulo, indicamos seus nomes entre chaves:
const { date, printMessage } = require("./greeting");
Podemos definir um nome personalizado para um componente do módulo:
// A função print representa a função printMessage
const print = require("./greeting").printMessage;
const userName = "Bob";
print(userName);
Definindo Construtores e Objetos em um Módulo
Além de definir funções ou propriedades simples, um módulo pode definir objetos ou funções construtoras, que são usadas para criar objetos. Vamos adicionar um novo arquivo user.js
function User(name, age) {
this.name = name;
this.age = age;
this.print = function () {
console.log(`Nome: ${this.name} Idade: ${this.age}`);
}
}
User.prototype.sayHi = function() {
console.log(`Olá, meu nome é ${this.name}`);
};
module.exports = User;
Aqui, definimos uma função construtora padrão User
module.exports = User;
Vamos importar e usar este módulo no arquivo app.js
// Obtendo a função printMessage
const User = require("./user.js");
const programicio = new User("Programício", 22);
programicio.print();
programicio.sayHi();
Executamos a aplicação:
c:\app> node app.js Nome: Programício Idade: 22 Olá, meu nome é Programício