ES5代码可以在终端中使用Bash heredoc轻松运行:
node <<HEREDOC
var fs = require("fs");
...
HEREDOC
但是,即使带有正确的--experimental-modules标志,ES6代码也无法运行:
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:ESM模块加载器是实验性的。”这意味着Node.js可以通过ES6模块功能正常运行,但是 import
关键字不起作用。
如何使用Bash heredoc在终端中内联运行ES6代码?我知道我可以将代码写入文件以正常作为ES6模块加载,但这是一个简短的临时代码,应该在heredoc中更好。
答案 0 :(得分:1)
这是一个很好的问题,它教给我很多东西!感谢您的询问。这是我学到的:
首先
对节点的Bash Heredoc就像是简单地执行节点,然后键入在Heredoc标记中键入的内容
I.E。
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 {
最后,问题在于整个功能确实是实验性的。
有关此问题尚未解决:
答案 1 :(得分:1)
查看后,Node 11完全不支持stdin中的ES模块,如果要在Node 11中使用模块,则需要将其放入文件中。
对于节点12(当前未发布,但您可以使用npm i -g node-nightly
进行尝试),可以使用标志--entry-type=module
将stdin用作模块。
使用node-nightly
可以正常工作:
node-nightly --experimental-modules --entry-type=module <<HEREDOC
import fs from 'fs'
console.log(fs)
HEREDOC
编辑:
如@Jamesernator在评论中所指出的那样,对于v13版中的节点每晚,请使用“ --input-type”而不是“ --entry-type”。
并且仅支持内置模块,即。 “导入”将无法在本地目录中找到模块,也将无法找到带有“ -g”标志安装的全局模块。相关问题:https://github.com/nodejs/node/issues/19570