Cómo Importar y Exportar Módulos en Node.js

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.

Módulos CommonJS

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().

Exportar un módulo (CommonJS)

Para exportar funcionalidades en un archivo, usamos module.exports:

javascript
// archivo saludo.js
module.exports = function saludar(nombre) {
return `Hola, ${nombre}!`;
};

Importar un módulo (CommonJS)

En otro archivo, puedes importar el módulo utilizando require():

javascript
// archivo app.js
const saludar = require('./saludo');

console.log(saludar('Juan')); // Output: Hola, Juan!

Exportar múltiples funcionalidades

También puedes exportar múltiples elementos en un solo objeto:

javascript
// 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));  // Output: 5
console.log(operaciones.resta(5, 2)); // Output: 3

Módulos 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.

Exportar un módulo (ESM)

En lugar de module.exports, se utiliza la palabra clave export para exportar funcionalidades.

javascript
// archivo saludo.js
export function saludar(nombre) {
return `Hola, ${nombre}!`;
}

Importar un módulo (ESM)

Para importar un módulo ESM, usamos import:

javascript
// archivo app.js
import { saludar } from './saludo.js';

console.log(saludar('Juan')); // Output: Hola, Juan!

Exportar como predeterminado (ESM)

También puedes exportar un valor por defecto:

javascript
// archivo saludo.js
export default function saludar(nombre) {
return `Hola, ${nombre}!`;
}

// archivo app.js
import saludar from './saludo.js';

console.log(saludar('Juan')); // Output: Hola, Juan!

Configuración para usar ESM en Node.js


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:

1Agrega 'type':'module' en tu package.json:
javascript
{
  "type": "module"
}
2Luego puedes usar los módulos de la siguiente manera:
javascript
// archivo app.js
import { saludar } from './saludo.js';

3. Diferencias entre CommonJS y ESM

CaracterísticaCommonJSESM
Sintaxis para exportarmodule.exportsexport
Sintaxis para importarrequire()import
Carga de módulosSincrónicaAsíncrona
Extensiones de archivo.js.mjs o .js (con "type": "module")
Soporte en versiones antiguasTotalmente soportadoRequiere Node.js >= 12

Casos Prácticos


1Modularizar un servicio de base de datos:

Imagina que tienes un servicio para interactuar con una base de datos y lo quieres modularizar para que sea reutilizable en varios archivos.

javascript
// 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);
};
javascript
// archivo app.js (CommonJS)
const { connectDB } = require('./db');

async function main() {
const db = await connectDB();
// Trabaja con la base de datos
}

main();
2Crear una biblioteca de utilidades:

Puedes crear un archivo que exporte varias funciones de utilidad y luego importarlas donde sea necesario.

javascript
// 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));   // Output: 8
console.log(resta(5, 3));  // Output: 2
  Conclusión

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.