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)
它确实显示了此信息“实验警告:ESM 模块加载器是实验性的。”这意味着 Node.js 可以通过 ES6 模块功能正确运行,但是,the import
关键字不起作用.
如何使用 Bash Heredoc 在终端中内联运行 ES6 代码?我知道我可以将代码写入文件以正常加载为 ES6 模块,但这是一个简短的临时代码,应该放在heredoc中更好。
Update:
从 Node.js 14 开始,该标志--experimental-modules
不再需要,它已经默认存在于 Node.js 中.mjs
文件,也适用于heredoc,但是--input-type
CLI 上仍然需要,因为仍应该为此处文档指定 ES5 或 ES6:
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
使用 stdin 作为模块。
With node-nightly
以下工作得很好:
node-nightly --experimental-modules --entry-type=module <<HEREDOC
import fs from 'fs'
console.log(fs);
HEREDOC
Edit:
正如 @Jamesernator 在评论中指出的,对于 v13 中的 node-nightly,请使用“--input-type”而不是“--entry-type”。
并且仅支持内置模块,即。 “import”将无法在本地目录中找到模块,也无法找到使用“-g”标志安装的全局模块。相关问题:https://github.com/nodejs/node/issues/19570 https://github.com/nodejs/node/issues/19570
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)