En Node.js, el manejo de módulos es esencial para estructurar nuestras aplicaciones de manera eficiente y reutilizable.
Node.js tiene dos sistemas principales para importar y exportar módulos: el sistema CommonJS y el sistema de módulos ECMAScript (ESM).
A continuación, exploraremos ambos métodos.
El sistema CommonJS es el sistema de módulos por defecto en Node.js.
Permite importar y exportar funcionalidades entre archivos de manera sencilla usando module.exports y require().
Para exportar funcionalidades en un archivo, usamos module.exports:
// archivo saludo.js
module.exports = function saludar(nombre) {
return `Hola, ${nombre}!`;
}; En otro archivo, puedes importar el módulo utilizando require():
// archivo app.js
const saludar = require('./saludo');
console.log(saludar('Juan')); // Salida: Hola, Juan! También puedes exportar múltiples elementos en un solo objeto:
// archivo operaciones.js
module.exports = {
suma: (a, b) => a + b,
resta: (a, b) => a - b,
};
// archivo app.js
const operaciones = require('./operaciones');
console.log(operaciones.suma(2, 3)); // Salida: 5
console.log(operaciones.resta(5, 2)); // Salida: 3 ECMAScript (ESM)Los módulos ECMAScript (ESM) son una forma más moderna de importar y exportar módulos.
A partir de Node.js 12, el soporte para módulos ES6 ha sido habilitado de forma nativa, aunque en algunas versiones debes usar la extensión .mjs o establecer "type": "module" en tu package.json.
En lugar de module.exports, se utiliza la palabra clave export para exportar funcionalidades.
// archivo saludo.js
export function saludar(nombre) {
return `Hola, ${nombre}!`;
} Para importar un módulo ESM, usamos import:
// archivo app.js
import { saludar } from './saludo.js';
console.log(saludar('Juan')); // Salida: Hola, Juan! También puedes exportar un valor por defecto:
// archivo saludo.js
export default function saludar(nombre) {
return `Hola, ${nombre}!`;
}
// archivo app.js
import saludar from './saludo.js';
console.log(saludar('Juan')); // Salida: Hola, Juan! Si estás usando versiones recientes de Node.js (>= 12), puedes configurar tu proyecto para usar módulos ECMAScript sin tener que especificar la extensión .mjs de la siguiente manera:
'type':'module' en tu package.json:{
"type": "module"
} // archivo app.js
import { saludar } from './saludo.js'; CommonJS y ESM| Característica | CommonJS | ESM |
|---|---|---|
| Sintaxis para exportar | module.exports | export |
| Sintaxis para importar | require() | import |
| Carga de módulos | Sincrónica | Asíncrona |
| Extensiones de archivo | .js | .mjs o .js (con "type": "module") |
| Soporte en versiones antiguas | Totalmente soportado | Requiere Node.js >= 12 |
Imagina que tienes un servicio para interactuar con una base de datos y lo quieres modularizar para que sea reutilizable en varios archivos.
// archivo db.js (CommonJS)
const { MongoClient } = require('mongodb');
const url = 'mongodb://localhost:27017';
const dbName = 'miDB';
module.exports.connectDB = async function() {
const client = new MongoClient(url);
await client.connect();
console.log('Conectado a la base de datos');
return client.db(dbName);
}; // archivo app.js (CommonJS)
const { connectDB } = require('./db');
async function main() {
const db = await connectDB();
// Trabaja con la base de datos
}
main(); Puedes crear un archivo que exporte varias funciones de utilidad y luego importarlas donde sea necesario.
// archivo utils.js (ESM)
export function suma(a, b) {
return a + b;
}
export function resta(a, b) {
return a - b;
}
// archivo app.js (ESM)
import { suma, resta } from './utils.js';
console.log(suma(5, 3)); // Salida: 8
console.log(resta(5, 3)); // Salida: 2 En Node.js, los sistemas de módulos CommonJS y ECMAScript (ESM) permiten estructurar aplicaciones de forma modular, lo que facilita la reutilización de código.
CommonJS es el sistema tradicional en Node.js, mientras que ESM es una opción más moderna y estándar, que se alinea con las especificaciones de JavaScript en navegadores y otros entornos.