使用Bash heredoc

时间:2019-04-08 07:27:26

标签: javascript node.js bash ecmascript-6 heredoc

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中更好。

2 个答案:

答案 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