我正在尝试弄清楚如何在服务器端(带有 Babel 的 node.js)中的 ES6 中执行类的动态导入。 我想要一些类似于 Java 中反射提供的功能。这个想法是导入特定文件夹中的所有类并动态实例化它们。
例如,我可以在一个文件夹中声明多个类,如下所示:
export default class MyClass {
constructor(somevar) {
this._somevar = somevar
}
//...
//some more instance level functions here
}
然后在我的应用程序代码的其他地方我可以有一个函数来找出特定文件夹中的所有类并尝试实例化它们:
//somewhere else in my app
instanciationFunction(){
//find all the classes in a specific folder
var classFiles = glob.sync(p + '/path_to_classes/**/*.js', {
nodir: true
});
_.each(classFiles, async function (file) {
console.log(file);
var TheClass = import(file);
var instance = new TheClass();
//and then do whatever I want with that new instance
});
}
我试过用 require 来做,但我得到了错误。显然找不到构造函数。
任何想法将不胜感激。
谢谢
最佳答案
ES 模块定义是声明性的,当前工具所采用的方向是在解析期间确定依赖关系的路径(通过静态分析),在执行任何代码之前。这意味着动态和有条件的导入与上述路径背道而驰。它不像在 Node 中,导入是在执行时确定的,在执行 require
时。
如果您想要动态的运行时导入,请考虑查看 SystemJS .如果您熟悉 RequireJS , 它采用相同的概念,但将其扩展为 multiple module formats ,包括 ES6。它有 SystemJS.import
它似乎在做你想做的事,并处理你当前正在做的路径解析。
或者,如果您打算摆脱多余的代码,请考虑使用 Rollup .它会为您分析代码,并且只包括实际使用的代码。这样,您就不需要手动进行条件加载。
关于javascript - ES6 动态导入和实例化类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42891932/