【问题标题】:Is it possible to use both CommonJS and ES6 module in a Node.JS command-line program?是否可以在 Node.JS 命令行程序中同时使用 CommonJS 和 ES6 模块?
【发布时间】:2021-06-05 20:42:22
【问题描述】:

我正在开发 CLI 工具。我使用“commander”(一个 CommonJS 模块)来解析命令行参数。我还想使用“p-map”来管理并发。但是,“p-map”是一个 ES6 模块。

我也在使用 Typescript。

现在代码编辑器和 Typescript 编译器都不会抱怨了。但是我无法执行我的 CLI 工具。如果我使用“module”编译:“commonjs”,节点将不会加载 p-map 并抱怨“必须使用导入来加载 ES 模块... node_modules/p-map/index.js ...require() of ES modules不支持。”。如果我用 "module":"es2015" 编译,使用 "require" 导入 CommonJS 模块,并在我的 package.json 中添加 "type":"module",节点会报错 "ReferenceError: require is not defined"。

我喜欢 Typescript/Javascript 的灵活性,但是,是时候让我怀念 Java。 Java 可能太麻烦了,但我不会花几个小时来弄清楚导入/导出......

那么,是否可以在 Node.JS 命令行程序中同时使用 CommonJS 和 ES6 模块?

【问题讨论】:

  • 使用 ESM 并导入 cjs 模块。那should work。或者,如链接页面所述,如果确实需要,您可以使用其他方式动态导入。
  • 感谢您的回复!我尝试了 ECM 导入 cjs 模块,是的,它可以工作。我不知道我可以导入 cjs 模块,而不仅仅是使用“require()”。我也尝试过动态导入。它应该工作。但是问题是 Typescript 总是将我的动态 import() 编译成 require()。
  • 请您将您的回复作为答案,以便我接受它作为正确答案吗?再次感谢!

标签: javascript node.js typescript ecmascript-6 module


【解决方案1】:

为了增强兼容性,(较新的)节点 esm 加载程序 can import cjs-modules(例如 import identifier from 'cjs-module-name';)。

反过来不行,你不能 require 一个 esm 模块,但是 dynamic import 应该可以工作,如果真的有必要的话。

相关阅读可能是关于该主题的statement from p-map's owner

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2014-04-18
    • 2020-08-16
    • 2021-11-27
    • 2021-07-18
    • 2018-03-11
    相关资源
    最近更新 更多