Saltar al contenido principal
Node.js

Solución: ERR_REQUIRE_ESM — require() no puede importar módulos ES

Node.js rechaza usar require() con un paquete que solo exporta ES Modules. La causa es la guerra CJS vs ESM. Todas las soluciones sin reescribir tu proyecto.

Error: Error [ERR_REQUIRE_ESM]: require() of ES Module not supported

¿Por qué ocurre?

Muchos paquetes modernos de npm han dejado de publicar una versión CommonJS y solo publican ES Modules (tienen `"type": "module"` en su package.json). Si tu proyecto usa CommonJS (require/module.exports) e intentas importar uno de estos paquetes, Node.js lanza ERR_REQUIRE_ESM porque require() no puede cargar ESM.

Solución paso a paso

Comprueba qué paquete lo causa:

El error incluye la ruta del módulo problemático:

Error [ERR_REQUIRE_ESM]: require() of ES Module
/node_modules/chalk/index.js not supported.

Solución A — Usa una versión anterior del paquete que aún soporta CJS:

Algunos paquetes dejaron de soportar CJS en una versión específica. Instala la última versión CJS:

# Ejemplos de versiones que aún son CJS:
npm install chalk@4         # chalk 5+ es solo ESM
npm install node-fetch@2    # node-fetch 3+ es solo ESM
npm install got@11          # got 12+ es solo ESM
npm install sindresorhus/is@4 # versiones 5+ son ESM

Solución B — Convierte tu proyecto a ESM:

// package.json — añade "type": "module"
{
  "type": "module"
}

// Cambia require() por import en todos tus archivos:
// ❌ CommonJS
const express = require('express');
const { join } = require('path');

// ✅ ESM import express from 'express'; import { join } from 'path'; import { createRequire } from 'module'; // si necesitas require() puntualmente

Solución C — Importación dinámica (para casos puntuales):

Si solo necesitas ese módulo en un sitio y no quieres convertir todo el proyecto:

// Dentro de una función async puedes usar import() dinámico
async function usarChalk() {
  const { default: chalk } = await import('chalk');
  console.log(chalk.green('¡Funciona!'));
}

Solución D — TypeScript con esModuleInterop:

// tsconfig.json
{
  "compilerOptions": {
    "module": "NodeNext",
    "moduleResolution": "NodeNext",
    "esModuleInterop": true
  }
}

Cómo evitarlo en el futuro

Antes de instalar un paquete nuevo, revisa su package.json en npm (pestaña Code) para ver si tiene `"type": "module"`. Si tu proyecto es CJS y el paquete es ESM-only, decide si migras el proyecto completo a ESM o si usas una versión anterior.

Node.jsESMCommonJSErrorimports

¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:

Generador de Prompts

¿Necesitas desarrollo a medida?

Apps web, IA, módulos ERP — cuéntame tu proyecto.