【问题标题】:Import function from a dynamic js.file name从动态 js.file 名称导入函数
【发布时间】:2021-08-17 22:33:02
【问题描述】:

我正在尝试从具有从控制台传递的名称的文件中导入。这适用于第一次从 JSON 导入,但是当我尝试导入 js 文件时,我无法使用该功能:

let vis = process.argv[2];
  import(`./${vis}.json`).then((vis2) => {
    import(`./${vis}.js`).then((mani)=>{
      console.log(mani);
      await mani().then()...
    })
  })

vis2 已正确导入。 mani 正确返回一个函数(该文件中只有一个函数):

mani: [AsyncFunction: mani]

但是当我尝试调用下一行代码中的函数时,我收到一条错误消息:

TypeError: mani 不是函数

我做错了什么?如何从 js 文件中获取函数?由于 js 文件名是动态的(通过控制台传递),我不能使用常规 import {} from '';结构。

【问题讨论】:

    标签: node.js dynamic import


    【解决方案1】:

    由于 ESM 模块系统的静态特性,您不能指定使用标准 import 语法动态构建的模块名称 - 依赖关系图实际上是在实际代码执行之前构建的,此时模块名称应该知道的。

    但是您可以使用动态 import() 语法来做到这一点 - 它包含一个函数,该函数返回解析为 module 对象的承诺。

    import(dynamicName)
      .then(function(module){
        // Use module here.
      })
    

    我不确定您是否能够以这种方式直接导入 .json 文件 - 除非您的构建系统或执行环境设置为处理某些适当类型的代码转换。这是因为 .json 文件不符合 ESM 模块的条件。

    【讨论】:

    • 谢谢!这允许我导入 json,但不能导入 js 文件?我尝试从 js 文件导入函数,console.log 显示它导入正常([AsyncFunction:functionX]),但是当我尝试调用该函数时,我收到一条错误消息“TypeError:functionX 不是函数";
    • 任何符合 ESM 模块条件的 js 文件都应该可以正常工作。 - 正如你所指出的,它实际上看起来在这里导入得很好。您能否在帖子中指定您尝试导入的 js 文件如何导出其 api?
    • 刚刚看到您的编辑,import() 返回的承诺解析为模块对象 - 而不是导出本身。看起来你的 js 文件有一个名为 mani 的导出,所以你应该尝试这样的事情:import(./${vis}.js).then(async function(module) { await module.mani() })
    猜你喜欢
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 2013-09-27
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2015-07-28
    • 2012-12-20
    相关资源
    最近更新 更多