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

Lon*_*est 7 import node.js read-eval-print-loop ecmascript-6 es6-modules

使用 Node.js REPL,如何使用 ecmascript 语法导入模块?现在是否有任何版本的Node.js REPL 允许这样做?

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

node --experimental-modules
Run Code Online (Sandbox Code Playgroud)

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

在此处输入图片说明

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

rek*_*ide 23

目前您不能使用静态import语句(例如)。import someModule from "some-module"我不知道有任何改变这一点的努力/门票/拉取请求/意图。

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

let someModule
import("some-module")
  .then( loaded=> someModule= loaded)
Run Code Online (Sandbox Code Playgroud)

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

import("some-module").then(someModule => someModule.default())
Run Code Online (Sandbox Code Playgroud)

对于更复杂的示例,您可能希望使用异步立即调用函数表达式,因此可以使用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())
})()
Run Code Online (Sandbox Code Playgroud)

最后,如果使用该标志启动 Node.JS --experimental-repl-await,则可以直接从 repl 中使用 async 并删除立即调用的 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())
Run Code Online (Sandbox Code Playgroud)