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.
¿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.
¿Quieres que una IA te ayude? Genera el prompt perfecto para tu error:
Generador de Prompts