ES6动态导入和类的实例化

时间:2017-03-19 20:33:33

标签: javascript node.js ecmascript-6 babeljs

我正在试图弄清楚如何在服务器端(带有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,但是我遇到了错误。显然,找不到构造函数。

任何想法都会非常感激。

由于

2 个答案:

答案 0 :(得分:1)

ES模块定义是声明性的,当前的方向工具是在解析期间(通过静态分析)确定依赖关系的路径,在任何代码执行之前都是如此。这意味着动态和条件导入违背了上述路径。在执行require时,在执行时确定导入的Node不一样。

如果您想要动态的运行时导入,请考虑查看SystemJS。如果您熟悉RequireJS,则会采用相同的概念,但会将其扩展为multiple module formats,包括ES6。它SystemJS.import似乎可以执行您想要的操作,并且可以处理您当前正在执行的路径解析。

或者,如果您打算摆脱多余的代码,请考虑使用Rollup。它将为您分析代码,并且只包含实际使用的代码。这样,您就不需要手动进行条件加载。

答案 1 :(得分:1)

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

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-cli或生宝贝来说,

babel-node test_import.js

一个 (编辑)package.json
"scripts": {
  "pretest": "babel test_imports.js -o dist/test_imports.js",
  "test": "node dist/test_imports.js"
//...
b

node test