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-cli
或npm 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