ERR_REQUIRE_ESM не поддерживает модуль ES, как я могу это исправить? на файловом пакете

У меня есть устаревшее приложение, которое использует несколько очень старых пакетов, которые не поддерживают модуль ES в качестве примера. file-typeупаковка. Поэтому, если вы настроите HTTP-сервер babel и node с помощью, а затем установите пакет файлового типа, то при запуске сборки и запуска будет выдано сообщение об ошибке, как показано ниже:

      Error [ERR_REQUIRE_ESM]: require() of ES Module E:\test\testbabel\node_modules\file- 
type\index.js from E:\test\testbabel\dist\index.js not supported.
Instead change the require of E:\test\testbabel\node_modules\file-type\index.js in 
E:\test\testbabel\dist\index.js to a dynamic import() which is available in all CommonJS 
 modules.
at Object.<anonymous> (E:\test\testbabel\dist\index.js:10:17) {
code: 'ERR_REQUIRE_ESM'
}

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

Вот мои index.jsкоды

      import http from 'http';
import { fileTypeFromFile } from 'file-type';

const server = http.createServer((req, res) => {
    res.end('Hello from the server');
}).listen(4001);

console.log('Server is up and running');

export default server;

файл .

      {
  "name": "testbabel",
  "version": "1.0.0",
  "description": "test babel with http or express",
  "main": "index.js",
  "scripts": {
    "build": "babel index.js -d dist",
    "start": "npm run build && node dist/index.js"
  },
  "author": "",
  "license": "ISC",
  "devDependencies": {
    "@babel/cli": "^7.17.10",
    "@babel/core": "^7.18.2",
    "@babel/plugin-transform-modules-commonjs": "^7.18.2",
    "@babel/preset-env": "^7.18.2"
  },
  "dependencies": {
    "file-type": "^17.1.1"
  }
}

Я только что попытался импортировать пакет и получил ошибки выше.

пытаться:

Я думал, что конвертер может помочь, поэтому использовал @babel/plugin-transform-modules-commonjsно все же не помогло и, похоже, не влияет на включение этого пакета

Я не уверен, но добавил некоторые настройки на package.jsonкак "type": "module" "type": "commonjs"вообще не помогло.

какое самое простое решение этой проблемы и как мы это исправим?

Примечание. Я видел, что люди возвращались к поддерживаемому пакету вместо нового, что для меня не имеет смысла в качестве решения.

1 ответ

Вариант 1(babel с мокко): переименуйте «index.js» в «index.mjs» и измените pacakage.json типа файла («index.js» на «index.mjs»), затем оставьте Babel для транспиляции.

      // babel-register.js
const babel_register = require("@babel/register").default;
babel_register({
    ignore: [
        // Only work on Project-wide configuration
        // overrides ignore can transpile packages(modules) from node_modules (https://babeljs.io/docs/en/babel-register/#ignores-node_modules-by-default)
    ],
});

Используйте babel.config вместо .babelrc

      //.mocharc.js
require("./babel-register");

module.exports = {
    // https://github.com/mochajs/mocha/blob/v8.4.0/example/config/.mocharc.js
    ui: "bdd",
    timeout: 5000,
    recursive: true,
};

Вариант 2 (только для Babel): использование выражения динамического импорта

      async function doSomething() {
    const {fileTypeFromStream} = await import("file-type");
}

и

      ["@babel/preset-env", {
    exclude: ["proposal-dynamic-import"]
}]

Как избежать выражения динамического импорта Babel tanspile

Другие вопросы по тегам