node.js - ERR_REQUIRE_ESM - TypeScript + nodemon + ts-node + node-fetch
Estoy tratando de usar node-fetch v3 con nodemon + ts-node, pero he recibido todos los posibles errores relacionados con ESM. He probado muchas combinaciones de type en el archivo package.json y compilerOptions.target en el archivo tsconfig.json, pero no puedo compilar mi script y ejecutarlo en modo desarrollo simultáneamente.
Este es mi guion sencillo:
import express from "express";
import fetch from "node-fetch";
import json from "json-server";
const app = express();
app.use("/db", json.router("db.json"));
app.use("/test", (req, res) => {
fetch("http://localhost:3001/db");
res.json({ ok: true });
});
app.listen(3001);
Necesito poder hacer que funcione con los siguientes dos comandos:
tsc && node index.js
nodemon -r ts-node index.ts
¿Cómo deberían estar configurados package.json y tsconfig.json para que ambos comandos funcionen?
Tenga en cuenta que los problemas comienzan tan pronto como agrego node-fetch al proyecto.
Respuesta #1
Actualmente es muy difícil compilar TypeScript a ESM nativo. Recomiendo degradar node-fetch a 2.6.5.
Node Fetch empezó a distribuir Módulos ES desde 3.0.0 ver aquí: https://github.com/node-fetch/node-fetch/blob/main/docs/v3-UPGRADE-GUIDE.md#breaking
Si quieres tomar el camino difícil, puedes seguir este blog: https://2ality.com/2021/06/typescript-esm-nodejs.html
El problema es que no puedes usar require('some-module') que está diseñado para ser un ESM. Dado que estás compilando a módulos commonjs, será necesario hacer algo de transpilación para que funcionen con ESM.
Typescript está agregando nodenext como una opción de módulo en Typescript 4.5