ERR_REQUIRE_ESM — машинописный текст nodemon ts-узел узел-выборка

#node.js #typescript

Вопрос:

Я пытаюсь использовать node-fetch v3 с nodemon ts-node , но у меня есть все возможные ошибки в ESM. Я перепробовал множество комбинаций type в package.json файле и compilerOptions.target в tsconfig.json файле, но я не могу одновременно скомпилировать свой сценарий и запустить его в режиме разработки.

Это мой простой сценарий:

 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);
 

Мне нужно, чтобы он работал со следующими двумя командами:

 tsc amp;amp; node index.js
nodemon -r ts-node index.ts
 

Как должно быть package.json и tsconfig.json настроено, чтобы обе команды работали?

Пожалуйста, обратите внимание, что проблемы начинаются, как только я добавляю node-fetch в проект.

Ответ №1:

В настоящее время очень сложно скомпилировать машинописный текст в собственный ESM, в который я рекомендую понизить node-fetch 2.6.5 .

Выборка узлов начала отправлять модули ES с тех пор 3.0.0 , как см. Здесь: https://github.com/node-fetch/node-fetch/blob/main/docs/v3-UPGRADE-GUIDE.md#breaking

Если вы хотите пройти сложный путь, вы можете следить за этим блогом: https://2ality.com/2021/06/typescript-esm-nodejs.html

Проблема в том, что вы не можете использовать require('some-module') то, что создано для ESM. Поскольку вы компилируете в модули commonjs, потребуется некоторая транспилировка, чтобы заставить их работать с ESM.

Typescript добавляется nodenext в качестве опции модуля в typescript 4.5

Комментарии:

1. Спасибо, интересное чтение. Я не буду следовать вашему предложению, я предпочитаю жесткий маршрут: одна из целей моего вопроса-понять, как работать с модулями ESM.