【问题标题】:How to use "import" in node REPL如何在节点 REPL 中使用“导入”
【发布时间】:2019-11-19 16:01:59
【问题描述】:

使用 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 是否可以做到这一点?

【问题讨论】:

    标签: node.js ecmascript-6 import read-eval-print-loop es6-modules


    【解决方案1】:

    目前,您不能使用静态 import 语句(例如 import someModule from "some-module"),并且我不知道有任何努力/票证/公关/意图来改变它。

    您可以使用import() 语法来加载模块!这将返回一个承诺。例如,您可以创建一个变量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 并删除 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())
    

    【讨论】:

      【解决方案2】:

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

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

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

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

      在阅读this 之前,我没有想到这一点。感谢 Kevin Qian 也有ideas

      【讨论】:

        猜你喜欢
        • 2014-08-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 2021-06-11
        • 1970-01-01
        • 2019-07-14
        相关资源
        最近更新 更多