我有一个 Node.js 项目,其模块是使用
require
以 Common.JS 方式导入的。但是,需要导入仅 ESM 的包。
在我的项目中使用 ESM
import from
的一种方法是将 "type": "module"
添加到我的 package.json
文件中。然而,所有的requires
都停止工作了。
我验证了一种解决方案是从
module
包创建 require 模块:
import { createRequire } from "module";
const require = createRequire(import.meta.url);
但是,整个(大型)项目都导入了
require
,在我看来,必须向其中每个项目添加此解决方案是不可行的。
所以我想知道是否有一种优雅的方式来声明
require
一次并在整个项目中使用它。
或者,有没有比创建
require
或用所有内容替换 ESM 更优雅的解决方案?
要同时使用
require
和 import
,您需要使用动态 import()
表达式将 ES 模块加载到 CommonJS 上下文中。
提供解决方案的常见 Node.js 错误消息如下所示:
Error [ERR_REQUIRE_ESM]: require() of ES Module <path> from <path> not supported.
Instead change the require of <path> in <path> to a dynamic import() which is available in all CommonJS modules.
这是使用
lodash
和 lodash-es
的示例:
const lodash = require('lodash')
async function main() {
const output = lodash.concat(['hello'], ['world'])
const lodashEs = await import('lodash-es')
console.log(lodashEs.join(output, ' '))
}
main()