CommonJS vs ESM y estructura backend

Aprende a separar código con CommonJS y ESM para evitar dependencias circulares y mantener un backend escalable.

Módulos bien diseñados reducen acoplamiento y facilitan pruebas.

Node soporta CommonJS y ESM; necesitas criterio para elegir y migrar sin romper.

La clave no es la sintaxis, es el diseño de fronteras entre responsabilidades.

Meta: dividir un backend en piezas reutilizables y predecibles.

  • Ambos funcionan, pero no conviene mezclarlos sin plan.
  • CommonJS: `require` y `module.exports`.
  • ESM: `import` y `export`.
  • Define estándar por proyecto y documenta la convención.
  • Cada módulo debe responder a una pregunta concreta.

CommonJS vs ESM en la práctica

Ambos funcionan, pero no conviene mezclarlos sin plan.

  • CommonJS: `require` y `module.exports`.
  • ESM: `import` y `export`.
  • Define estándar por proyecto y documenta la convención.

Cómo partir un módulo ?til

Cada módulo debe responder a una pregunta concreta.

Un módulo no es una carpeta aleatoria: define una capacidad (usuarios, auth, pagos, validaciones).

Si un archivo necesita saber demasiado del resto del sistema, estás mezclando capas.

Errores tópicos al modularizar

Los ciclos y los imports ambiguos son deuda técnica temprana.

  • Dependencias circulares entre servicios.
  • Funciones utilitarias sin dominio claro.
  • Exportar todo desde `index` sin criterio.
  • Nombres genéricos (`helpers`, `utils`) para lógica crítica.

Siguiente aplicación: API HTTP

Modularizar primero te ahorra refactors después.

JavaScript
53

CommonJS vs ESM y estructura backend

Aprende a separar código con CommonJS y ESM para evitar dependencias circulares y mantener un backend escalable.

Código del tema: require/module.exports | import/export

📘 Teoría

CommonJS vs ESM en la práctica

Ambos funcionan, pero no conviene mezclarlos sin plan.

  • CommonJS: `require` y `module.exports`.
  • ESM: `import` y `export`.
  • Define estándar por proyecto y documenta la convención.
Comparativa mínima
Revisar
// CommonJS
const { sumar } = require('./math.cjs');

// ESM
import { sumar } from './math.js';

Cómo partir un módulo ?til

Cada módulo debe responder a una pregunta concreta.

1

Un módulo no es una carpeta aleatoria: define una capacidad (usuarios, auth, pagos, validaciones).

2

Si un archivo necesita saber demasiado del resto del sistema, estás mezclando capas.

Errores tópicos al modularizar

Los ciclos y los imports ambiguos son deuda técnica temprana.

  • Dependencias circulares entre servicios.
  • Funciones utilitarias sin dominio claro.
  • Exportar todo desde `index` sin criterio.
  • Nombres genéricos (`helpers`, `utils`) para lógica crítica.

Siguiente aplicación: API HTTP

Modularizar primero te ahorra refactors después.

🧪 Aprende probando

Ejemplo Ejemplo guiado: exportar funciones de dominio Separa validación de email en su propio módulo.
Ejemplo Ejemplo guiado: versión CommonJS equivalente Mismo caso usando `require`.

¿Qué es esto?

Soy Cristian Eslava y a veces hago webs para procrastinar yo y vosotros 😉.

Esta la hice en febrero de 2026 para facilitar el aprendizaje de mis alumnxs. Aprender desarrollo web practicando. La idea es que crezca semanalmente con nuevos temas, tests y retos.

Inspirado en MDN, en W3Schools, en Codepen, en el crack de Manz y en mil sitios de documentación sobre desarrollo web. Quería aportar además de bloques teóricos con ejemplos, la gamificación de los retos y el sistema de test que ya tenía en culTest .

Si te gustó, si no te gustó, si quieres saludarme, o invitarme a 🍻 no dudes en escribirme en cristianeslava@gmail.com .