如何在节点--experimental-modules REPL中使用“导入”

时间:2019-07-10 05:05:17

标签: node.js ecmascript-6 import read-eval-print-loop es-module

使用Node.js REPL,您如何import使用ecmascript语法的模块? Node.js REPL的任何版本现在都允许吗?

在Node.js v10.16.0中,我正在使用以下命令访问REPL:

node --experimental-modules

来源:https://nodejs.org/api/esm.html#esm_enabling

enter image description here

CommonJS是古老的技术。 Node.js是否仍在积极开发中?我想知道deno REPL是否可以做到这一点?

2 个答案:

答案 0 :(得分:3)

目前,您不能使用静态的import语句(例如import someModule from "some-module"),而且我不知道要为此做出任何努力/出票/公关/意图。

您可以使用import()语法加载模块!这将返回一个承诺。因此,例如,您可以创建变量someModule,开始导入,并在完成导入后,将someModule设置为该模块:

let someModule
import("some-module")
  .then( loaded=> someModule= loaded)

或者您可以在您的Promise处理程序中直接使用导入:

import("some-module").then(someModule => someModule.default())

对于更复杂的示例,您可能希望使用异步立即调用函数表达式,因此可以使用await语法:

(async function(){
    // since we are in an async function we can use 'await' here:
    let someModule = await import("some-module")
    console.log(someModule.default())
})()

最后,如果您使用--experimental-repl-await标志启动Node.JS,则可以直接从repl使用async并删除立即调用的异步函数:

let someModule = await import("some-module")

// because you have already 'await'ed
// you may immediately use someModule,
// whereas previously was not "loaded"
console.log(someModule.default())

答案 1 :(得分:0)

鉴于导入语句的静态性质,并且引擎需要知道所有静态导入(在处理任何与导入无关的代码之前)。您可以看到import语句实际上与交互式REPL支持不兼容。

例如,导入语句允许在文件的中间或结尾,但是在“与非静态导入相关的代码”之前会提升和处理它们。

如果您在REPL会话结束时键入静态import语句,那么REPL应该怎么做?

鉴于这种潜在的根本变化,它不能轻易返回并重新运行所有先前的命令!

直到阅读this之前我都没有考虑过。感谢凯文·钱(Kevin Qian),他也有ideas