【问题标题】:ES6 style imports in Node.js REPLNode.js REPL 中的 ES6 样式导入
【发布时间】:2026-01-26 12:35:01
【问题描述】:

来自 Python 背景和 Node.js 的新手,我发现使用 Node.js REPL 交互式地尝试代码非常困难。我遇到的一个关键问题是imports

ES6 样式导入在 Node.js REPL 上不起作用,我必须使用 require 来使用 CommonJS 样式导入。示例:我不能在节点提示符下写import rxjs,必须使用require('rxjs')。这使得将粘贴脚本复制到 Node REPL 以快速测试它们变得更加困难,我必须首先将所有 ES6 样式导入转换为 require 导入,这感觉违反直觉。

有没有什么简单的方法可以使用从 Node.js REPL 导入的 ES6 样式?

喜欢:

$节点
> 导入“rxjs”;
> 从 'rxjs/operator/map' 导入 {map};

我什至尝试过babel-node,它似乎不支持模块导入。

【问题讨论】:

标签: javascript node.js


【解决方案1】:

恐怕答案是,或者至少还没有。我们知道将来会支持它,但是 ES2015 importexport 不会作为 CommonJS requiremodule.exports 的就地替换。这仅仅是因为它们的工作方式不同。您可以在this Node.js blog postthis SO question 中找到更多信息。特别是,已经可以在 Node.js 中运行和导入标准模块,标记为 --experimental-modules(相关 2ality blog post)。但是,此功能仍然无法在 REPL 中使用。

您使用babel-node(现在称为babel-cli)的想法还不错:babel 实现了一个可互操作的require 函数,这是一种可以检索为任一类型系统设计的模块的填充程序.不幸的是,official website 声称在 REPL 中不支持此功能:

ES6 样式的模块加载可能无法按预期运行

由于技术限制,babel-node REPL 不完全支持 ES6 样式的模块加载。

尽管如此,这个问题不适用于生产代码,它不应该依赖于 REPL。除了使用 REPL,您可以考虑在包含 babel-cli 的基本项目中编写一个脚本,并创建一个用于运行转译版本的脚本:

{
  "name": "my-test-chamber",
  "private": true,
  "scripts": {
    "build": "babel src/main.js -o lib/main.js",
    "start": "npm run build && node lib/main.js"
  },
  "dev-dependencies": {
    "babel-cli": "^6.0.0"
  }
}

【讨论】:

  • 这个使用 babel-cli 的解决方案似乎在 prod 中不起作用。我在导入行import 'rxjs'; 得到SyntaxError: Unexpected token import。但这回答了我关于是否有办法在 REPL 中处理 ES6 导入的问题。我希望 Node.js 在其未来的版本中尽快引入解决方案。
  • @PranjalMittal 我不知道rxjs 是什么,但您必须将模块名称放在引号之间。然后,您可以将包中的所有内容放入命名空间中:import * as rxks from 'rxks'。尽管如此,这还不足以让 REPL 发挥作用。
  • 这需要更新吗? --experimental-modules 标志似乎对脚本很有用,但我无法让它在 REPL 中工作(import 给出了语法错误,但 require 给出了“必须使用 import 来加载 ES 模块”错误)。但是我还在用Node 10,11和12可能不一样。
  • @aldel 虽然 Node.js 目前对 ESM 模块具有实验性支持,但它们仍然无法在 REPL 上运行,即使使用 --experimental-modules。不过我已经更新了答案。
  • 那么使用包有什么意义呢?或者更确切地说,既然我们可以使用包,那么我们实际上如何使用它们呢?如果导入不起作用,那该怎么办?