ES6dynamic导入和实例化类

我想弄清楚如何执行在ES6一个服务器端(与巴贝尔node.js)类的dynamic导入。 我想要有一些类似于Javareflection的function。 这个想法是导入一个特定的文件夹中的所有类,并dynamic地实例化它们。

所以举例来说,我可以在一个文件夹中声明多个类,如下所示:

export default class MyClass { constructor(somevar) { this._somevar = somevar } //... //some more instance level functions here } 

然后在我的应用程序的代码中的其他地方,我可以有一个函数,找出特定文件夹中的所有类,并试图instanciate他们:

 //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 }); } 

我已经试过要求,但我得到的错误。 显然,不能find构造函数。

任何想法将不胜感激。

谢谢

ES模块定义是声明性的,当前的方向工具正在执行的任何代码之前parsing(通过静态分析)waaay过程中确定依赖关系的path。 这意味着dynamic和有条件的import违背上述path。 在执行require ,它并不像在Node中执行时确定的那样。

如果你想dynamic的,运行时导入,请考虑看看SystemJS 。 如果您熟悉RequireJS ,则采用相同的概念,但将其扩展为多种模块格式 (包括ES6)。 它有SystemJS.import这似乎做你想做的,加上处理你正在做的pathparsing。

或者,如果您的意图是摆脱多余的代码,请考虑使用汇总 。 它会为你分析代码,只包含实际使用的代码。 这样,你不需要手动做条件加载。

你需要用babel进行预处理,因为它们还不是节点的一部分(就此而言, 静态导入也不是节点使用的要求 )。

https://github.com/airbnb/babel-plugin-dynamic-import-node

脚步:

npm i -D babel-clinpm i -D babel

1

npm i -D babel-plugin-dynamic-import-node

2 .babelrc

 { "plugins": ["dynamic-import-node"] } 

预备,开始!

babel-node test_import.js或原始的babel:

一个(编辑)package.json

 "scripts": { "pretest": "babel test_imports.js -o dist/test_imports.js", "test": "node dist/test_imports.js" //... 

b

node test