【问题标题】:Run ES6 code in Bash terminal with Bash heredoc使用 Bash heredoc 在 Bash 终端中运行 ES6 代码
【发布时间】:2019-08-29 07:04:59
【问题描述】:

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:ESM 模块加载器是实验性的。”这意味着 Node.js 使用 ES6 模块功能可以正常运行,但是,import 关键字不起作用

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

【问题讨论】:

  • --experimental-modules 不支持标准输入模块(目前),它应该在 Node 12 中支持。如果你真的需要 ES 模块,你可以尝试使用npmjs.com/package/esm
  • @Jamesernator 它只允许我导入内置模块,“npm i moment”不起作用,“npm i -g moment”也不起作用
  • 是的,只有内置模块在标准输入中工作。 REPL 中存在相同问题的未解决问题,可能是相同的原因:github.com/nodejs/node/issues/19570

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


【解决方案1】:

更新
从 Node.js 14 开始,标志 --experimental-modules 不再需要,默认情况下它已经在 Node.js 中用于 .mjs 文件和heredoc,但在 CLI 上仍然需要 --input-type 因为 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 在 cmets 中所指出的,对于 v13 的 node-nightly,使用“--input-type”而不是“--entry-type”。

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

【讨论】:

  • node-nightly 太棒了! tks
  • 但是最新的 node-nightly 现在没有选项“--entry-type”了,刚才用 node-nightly v13.0.0-nightly2019042580c0b89bbb 进行了检查。它显示了这个错误:错误选项:--entry-type=module
  • 前几天改名为--input-type。您现在可以只使用 Node 12,而不是每晚使用。
  • 虽然仍在讨论中,但它可能仍会改变:github.com/nodejs/modules/issues/312
  • tks,我现在可以使用--input-type,希望它不会再次改变。
【解决方案2】:

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

首先
Bash heredoc for node 就像简单地执行 node,然后输入在 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 {

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

有关于此的未决问题:

【讨论】:

  • 只是在 Node 实现中的一个注释,import fs from 'fs'import * as fs from 'fs' 做同样的事情,node 内置模块的默认导出只是将整个模块导出回来。
  • @Adelin 它只允许我导入内置模块,“npm i moment”不起作用,“npm i -g moment”也不起作用
猜你喜欢
  • 2019-05-09
  • 2023-02-01
  • 2019-03-05
  • 2021-09-13
  • 2015-02-02
  • 2016-03-19
  • 2011-10-06
  • 1970-01-01
相关资源
最近更新 更多