我有一个过时的应用程序,它使用非常旧的几个不支持ES模块的包作为示例file-type
包。所以,如果你安装babel和节点HTTP服务器,然后安装文件类型的包,然后开始构建和运行将抛出如下错误信息:
Error [ERR_REQUIRE_ESM]: require() of ES Module E:testtestbabelnode_modulesfile-
typeindex.js from E:testtestbabeldistindex.js not supported.
Instead change the require of E:testtestbabelnode_modulesfile-typeindex.js in
E:testtestbabeldistindex.js to a dynamic import() which is available in all CommonJS
modules.
at Object.<anonymous> (E:testtestbabeldistindex.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;
filepackage.json
.
{
"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"
,根本没有帮助。
这个问题最简单的解决方案是什么?我们如何修复它?
注意:我看到人们回到支持的包,而不是新的,这对我来说是没有意义的解决方案。
Option1(babel with mocha): Rename "index.js";index.mjs"并修改文件类型的包。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)
],
});
使用巴别塔。配置代替.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,
};
Option2(仅限babel):使用动态导入表达式
async function doSomething() {
const {fileTypeFromStream} = await import("file-type");
}
和
["@babel/preset-env", {
exclude: ["proposal-dynamic-import"]
}]
避免巴别塔文件动态导入表达式