运行 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
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