Я хочу использовать пакет под названием Ora от npm.
Итак, я сделал это:
$ npm i ora
Затем внутри моего проекта я просто сделал:
import ora from 'ora'
Но в моем терминале я получил эту ошибку:
╰─>$ npm run start:dev 00:01:11
> [email protected] start:dev
> cross-env NODE_ENV=development nest start --watch
Info Webpack is building your sources...
webpack 5.92.1 compiled successfully in 433 ms
Type-checking in progress...
~/dist/main.js:517
module.exports = require("ora");
^
Error [ERR_REQUIRE_ESM]: require() of ES Module ~/node_modules/ora/index.js from ~/dist/main.js not supported.
Instead change the require of index.js in ~/dist/main.js to a dynamic import() which is available in all CommonJS modules.
at Object.ora (~/dist/main.js:517:18)
at __webpack_require__ (~/dist/main.js:541:42)
at ./libs/dma/src/providers/dma-client-provider/dma-client-provider.ts (~/dist/main.js:246:15)
at __webpack_require__ (~/dist/main.js:541:42)
at ./libs/dma/src/dma.module.ts (~/dist/main.js:25:31) {
code: 'ERR_REQUIRE_ESM'
}
Node.js v21.4.0
No errors found.
Как решить эту проблему?
Вещи, которые я пробовал до сих пор.
Измените tsconfig.json на это:
"module": "NodeNext",
"moduleResolution": "NodeNext",
И изменил оператор импорта на динамический импорт:
async function myFunction(){
const ora = (await import('ora')).default
}
Но я получил ту же ошибку.
вы можете найти информацию о том, как импортировать пакет только для ESM в проекте CommonJS. Это не проблема гнезда, это ошибка Node.js. Так что проверьте это Невозможно импортировать модуль ESM в Nestjs
Один из способов:
const dynamicImport = async (packageName) =>
new Function(`return import('${packageName}')`)()
// ...
const ora = await dynamicImport('ora').then(p => p.default)
Можете ли вы объяснить этот ответ? как работает новый синтаксис функции?
Этот ответ великолепен. Я гуглил это уже 2 года. Как вы думаете, это решение будет работать в любом контексте?
да ладно, Function
из JS. Есть несколько хороших ресурсов, которые могут вам помочь. Кроме того, это p.default
может не вернуть то, что вы ожидаете, в зависимости от вашего tsconfig и от того, как пакет экспортирует свои данные. Но вам просто нужно немного поиграть с этим, ничего сложного.
Я знаю, но почему вы решили использовать конструктор функций, а не просто функцию стрелки?
это хакерство для tsc, потому что в противном случае он преобразует import
в вызов require
, как описано на stackoverflow.com/a/75287028/5290447
Я был в этом вопросе, и я перепробовал каждый пост, но все они не сработали.