Error err require esm

В проекте инструментов Node.js Cli, разработанном с помощью TypeScript, для вывода tsconfig.jsonустановлено значение CommonJS.

При импорте внешних зависимостей, таких как chalk, boxen, и т. д., последние версии этих пакетов являются чистыми ES Moduleпакетами, что приводит к ошибке, подобной следующей, и недоступно.

  1. Error [ERR_REQUIRE_ESM]: require() of ES Module xxx\node_modules\boxen\index.js from abc.ts not supported.
  2. Instead change the require of index.js in xxx.ts to a dynamic import() which is available in all CommonJS modules.
  3. at Object.newLoader [as .js] (xxx\index.js:141:7)
  4. at Object.checkPkgUpdate (abc.ts:86:29) {
  5. code: ‘ERR_REQUIRE_ESM’
  6. }

Иногда проблема заключается в сочетании различных конфигураций машинописного текста. В этом случае достаточно начать новый проект, и ошибка больше не будет появляться.

Решение

Путем поисковых запросов и анализа общие решения заключаются в следующем.

  • Измените свой собственный проект на схему ESM

Если возможно, измените свой проект на решение ESM, например, измените «module»: «CommonJS»на . На практике, однако, поскольку существует много различий между решениями ESM и ESM, реальная логика кода также может потребовать значительных изменений для адаптации.tsconfig.json»module»: «ESNext»CommonJS

  • Продолжайте использовать самую последнюю старую версию пакета зависимостей, поддерживающую схему CommonJs.

Это решение в принципе прекрасно, и многие библиотеки с открытым исходным кодом делают то же самое. Однако существует потенциальная проблема безопасности, заключающаяся в том, что ни один из этих пакетов не может быть обновлен, и если они и их косвенные зависимости подвержены проблемам безопасности, эти риски безопасности не могут быть устранены.

  • Использование await import(…)метода

Схема NodeJs CommonJSподдерживает использование import(…)для динамического импорта.

Пример:

  1. // ESM import
  2. import boxen from ‘boxen’;
  3. // Modify to dynamic import method
  4. const { default: boxen } = await import(‘boxen’);

Однако, поскольку tsc компилирует выходные данные как CommonJS, он фактически компилирует весь динамический импорт как require(…)метод.

  • eval(«import(…)»)метод использования

Основываясь на приведенной выше схеме динамического импорта, проблему можно решить, просто избегая компиляции tsc. Используя функцию динамической компиляции eval, вы можете использовать следующий пример метода для достижения этой цели.

Пример:

  1. import type Boxen from ‘boxen’;
  2. const tips = ‘…’;
  3. const { default: boxen } = await (eval(`import(‘boxen’)`) as Promise<{ default: typeof Boxen }>);
  4. console.log(boxen(defaultTemplate));

После тестирования решение для динамической компиляции на основе evalрешает проблему такого рода, пока что это просто временное решение.

  • Импорт для загрузки ошибки модуля ES?

Чтобы решить ошибку [ERR_REQUIRE_ESM]: необходимо использовать импорт для загрузки ошибки модуля ES. Этот код идеален, но я рекомендуется использовать последнюю версию узла.  Просто помните, что версия узла >= 14. Все работает только с последней версией узла.

Конечно, долгосрочным вариантом, наиболее соответствующим разработке стандартов сообщества, по-прежнему является вариант 1.

Ника Боника
Оцените автора
Добавить комментарий