从动态 js.file 名称导入函数

Import function from a dynamic js.file name

我正在尝试从一个名称从控制台传递的文件中导入。这适用于从 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 return 一个正确的函数(该文件中只有一个函数):

mani: [AsyncFunction: mani]

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

TypeError: mani is not a function

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

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

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

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

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