运行 Bash 终端中的 ES6 代码和 Bash heredoc

Run ES6 code in Bash terminal with Bash heredoc

ES5 代码可以 运行 在终端中使用 Bash heredoc 很容易:

node <<HEREDOC
  var fs = require("fs");
  ...
HEREDOC

但是 ES6 代码没有 运行,即使使用了正确的 --experimental-modules 标志:

node --experimental-modules <<HEREDOC
  import fs from "fs";
  ...
HEREDOC

显示的错误是:

(node:4130) ExperimentalWarning: The ESM module loader is experimental.
[stdin]:1
import fs from "fs";
       ^^

SyntaxError: Unexpected identifier
    at new Script (vm.js:83:7)
    at createScript (vm.js:267:10)
    at Proxy.runInThisContext (vm.js:319:10)
    at Object.<anonymous> ([stdin]-wrapper:6:22)
    at Module._compile (internal/modules/cjs/loader.js:722:30)
    at evalScript (internal/bootstrap/node.js:670:27)
    at ReadStream.<anonymous> (internal/bootstrap/node.js:340:15)
    at ReadStream.emit (events.js:187:15)
    at endReadableNT (_stream_readable.js:1098:12)
    at process.internalTickCallback (internal/process/next_tick.js:72:19)

它确实显示了此信息 "ExperimentalWarning: The ESM module loader is experimental.",这意味着 Node.js 运行 正确地使用了 ES6 模块功能,但是, import 关键字是只是不工作.

如何使用 Bash heredoc 在终端中 运行 内联 ES6 代码? 我知道我可以将代码写入文件以正常加载为 ES6 模块, 但它是一个简短的临时代码,它应该在 heredoc 中更好。

这是一个很好的问题,让我学到了很多东西!谢谢你问。这是我学到的:

首先
Bash node 的 heredoc 就像简单地执行 node 然后输入在 heredoc 标签中输入的任何内容

node --experimental-modules <<HEREDOC
  import fs from "fs";
  ...
HEREDOC

等同于

node --experimental-modules
> import fs from "fs";

然后像这样执行节点从节点

打开REPL

其次import语法:

import fs from "fs"

There is no fs in "fs"。现在这对您来说不是问题,但如果导入成功,则不会在 "fs" 模块中找到它。相反,正确的语法应该是,例如:

import { readFile } from "fs";

然而,这会产生:

SyntaxError: Unexpected token {

最后,问题是整个功能确实是实验性的。

有关于此的未解决问题:

更新:
自 Node.js 14 以来,标志 --experimental-modules 不再需要,默认情况下它已经在 Node.js 中用于 .mjs 文件,也用于 heredoc,但是 --input-type在 CLI 上仍然需要 ES5 或 ES6 仍然应该为 heredoc 指定:

node --input-type module <<HEREDOC
  //example:
  import fs from "fs";
HEREDOC

较早的指南:
查了一下,Node 11 根本不支持 stdin 的 ES 模块,如果你想在 Node 11 中使用模块,你需要把它们放在一个文件中。

对于 Node 12(当前未发布,但您可以使用 npm i -g node-nightly 进行尝试),您可以使用标志 --entry-type=module 将标准输入用作模块。

node-nightly 下,以下工作正常:

node-nightly --experimental-modules --entry-type=module <<HEREDOC
  import fs from 'fs'
  console.log(fs);
HEREDOC

编辑:

正如@Jamesernator 在评论中指出的那样,对于 v13 中的每晚节点,请使用“--input-type”而不是“--entry-type”。

并且只支持内置模块,即。 'import' 将无法在本地目录中找到模块,也无法找到使用“-g”标志安装的全局模块。相关问题:https://github.com/nodejs/node/issues/19570