NodeJS 如何在REPL节点中使用“import”

nwnhqdif  于 2023-03-01  发布在  Node.js
关注(0)|答案(2)|浏览(182)

使用Node.js REPL,如何使用ecmascript语法来import模块?现在有任何版本的Node.js REPL允许这样做吗?
在Node.js v10.16.0中,我使用以下命令访问REPL:

node --experimental-modules

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

CommonJS是古老的技术,Node.js还在积极开发吗?不知道deno REPL能不能做到?

mhd8tkvw

mhd8tkvw1#

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

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

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

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

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 & drop立即调用的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())
rta7y2nd

rta7y2nd2#

考虑到import语句的静态特性,引擎需要知道所有的静态导入(在处理任何与import无关的代码之前),你可以看到import语句是如何与交互式REPL支持不兼容的。
例如,import语句可以出现在文件的中间或结尾,但是它们会在“非静态导入相关代码”之前被提升和处理。
如果您在REPL会话结束时键入一个静态import语句,REPL应该怎么做?
考虑到这个潜在的根本性变化,它不能轻易地返回并重新运行之前的所有命令!
直到阅读到这篇文章,我才想到这一点。谢谢凯文·钱,他也有想法。

相关问题