CommonJS (require)
CommonJS (require, module.exports) impulsó Node durante años; todavía lo mantienes en paquetes heredados, cargadores de configuración y shims .cjs, mientras que los nuevos servicios se estandarizan en ESM.
Busca en todas las páginas de la documentación
require)CommonJS (require, module.exports) impulsó Node durante años; todavía lo mantienes en paquetes heredados, cargadores de configuración y shims .cjs, mientras que los nuevos servicios se estandarizan en ESM.
// config.cjs
const path = require('node:path');
module.exports = {
port: Number(process.env.PORT ?? 3000),
root: __dirname,
resolve: (p) => path.join(__dirname, p),
};const config = require('./config.cjs');Cuándo usarlo:
require en repositorios existentes.cjs (jest.config.cjs, prettier.config.cjs)createRequire desde puntos de entrada ESM// circular-a.cjs
const b = require('./circular-b.cjs');
module.exports = {
name: 'A',
bName: () => b.name,
};// circular-b.cjs
const a = require('./circular-a.cjs');
module.exports = {
name: 'B',
aName: () => a.name,
};// main.cjs
const a = require('./circular-a.cjs');
console.log(a.name, a.bName()); // A B - exportaciones parciales durante la inicialización circular// esm-dirname-polyfill.cjs - patrón que los importadores de ESM evitan usando import.meta.url
const { fileURLToPath } = require('node:url');
// Solo es necesario al enseñar las diferencias entre CJS y ESMLo que esto demuestra:
require devuelve module.exports: las asignaciones reemplazan todo el objeto de exportaciónrequire circulares devuelven module.exports parciales hasta que los módulos terminan de inicializarse__dirname es el directorio del archivo CJS actual; no hay equivalente en ESM sin import.meta.urlrequire('./same') devuelve la misma referencia de objetomodule.exports en require.cache.exports.foo = 1 es azúcar sintáctico para module.exports.foo hasta que reasignes module.exports = ....require('node:fs') no accede al disco.require('./x.json') en CJS; ESM necesita readFile + JSON.parse o patrones de aserciones de importación.| Patrón | Resultado |
|---|---|
module.exports = fn | Equivalente a exportación predeterminada |
exports.a = 1 | Propiedad con nombre en las exportaciones |
module.exports = { a, b } | Exportación de un solo objeto |
// consumir CJS desde TS con esModuleInterop
import config from './config.cjs';
// o
import { createRequire } from 'node:module';
const require = createRequire(import.meta.url);
const cfg = require('./config.cjs') as { port: number };exports después de module.exports = - falla. Solución: muta module.exports solo una vez.require perezoso dentro de funciones o refactorizar el módulo compartido.__dirname en ESM - ReferenceError. Solución: import.meta.url + fileURLToPath.../../../ - movimientos frágiles. Solución: migrar a ESM con mapa de exports o alias de ruta en tsconfig.| Alternativa | Usar cuándo | No usar cuándo |
|---|---|---|
ESM import | Todo el código de aplicación nuevo | Ejecutor de pruebas heredado no compatible sin configuración |
createRequire | La aplicación ESM necesita una dependencia CJS | Todo el paquete puede ser ESM |
import() dinámico | Interoperabilidad CJS asíncrona desde ESM | Carga de configuración síncrona al inicio de CJS |
import de módulo JSON | Configuración estática en ESM | Necesidad de recarga en caliente sin reiniciar |
No se ha eliminado, pero ESM es el camino a seguir. CommonJS permanece por compatibilidad y configuración .cjs.
No directamente. Usa createRequire(import.meta.url) para excepciones.
Objeto claveado por rutas resueltas; elimina entradas para una rara recarga en caliente en herramientas de desarrollo.
Node devuelve module.exports incompletos hasta que el cuerpo del módulo termina; diseña para evitar ciclos.
No de forma nativa; compila a JS primero o usa cargadores tsx/ts-node en desarrollo.
Fuerza el análisis de CommonJS cuando el paquete tiene "type": "module".
Generalmente no desde CJS; ESM es asíncrono. Importa ESM desde ESM o usa un puente de importación dinámica.
module.exports = function myFn() {} o module.exports = { myFn }.
Inicialmente, exports hace referencia a module.exports. Reasignar module.exports rompe el alias.
Los autores de bibliotecas admiten ambos ecosistemas a través de condiciones de exports; los consumidores eligen a través del estilo de importación.
Nest admite ambos; los nuevos proyectos usan cada vez más ESM con SWC; sigue el ADR del equipo.
Renombra a .cjs solo donde sea necesario, convierte primero los módulos hoja y luego usa createRequire temporalmente en los límites.
Versiones de la pila: Esta página fue escrita para Node.js 24.18.0 (LTS activa), npm 10+, TypeScript 5.6+, Express 5, Fastify 5 y NestJS 11.
Revisado por Chris St. John·Última actualización: 19 jul 2026