7

是否有可能像在其他编程语言(如C#或Java)中一样注入ES2015模块中的依赖项?如果我导入一个模块,我创建一个硬依赖关系,并且不能在运行时稍后改变它。例如,我有以下JavaScript代码:将依赖关系注入到ES2015模块中

import Animal from './dog'; 

class Person { 
    feedAnimal() { 
    new Animal().feed(); 
    } 
} 

我正在导入狗模块。但是如果我想把它改成猫呢?目前我必须手动修改第1行,但在某些情况下,我希望可以从外部对其进行配置,以便在某些情况下应该有猫,而在其他情况下,它应该是猫。所有那些可以用经典的依赖注入来完成的事情。

我知道有一些直接投资框架有像ScatterElectrolyteWire等可惜大多需要一些特殊的语法,并ES2015 modules制造。

+1

你想如何依赖注入工作?你可以做'class Person {constructor(Animal){this.Animal = Animal; } feedAnimal(){new this.Animal()。feed()}}',但这听起来像是你期待更高级的东西。 – lyschoening

+0

我不确定['require-inject'](https://www.npmjs.com/package/require-inject)是否支持,但您可能需要查看一下。 – thefourtheye

+0

@lyschoening谢谢,但我想改变内部模块依赖关系,就像我会写一个单元测试。 – LongFlick

回答

-1

我搬到了SystemJS。使用SystemJS,您可以进行动态导入,如System.import('foo').then(() => console.log('Loaded));

另一个优点是系统将成为新的ECMAScript标准模块加载程序系统。

2

您不能动态定义依赖关系。 See this question and its accepted answer

问题:在node.js的 ES6可变进口的名字吗?

答案:不符合导入声明。导入和导出的定义是可以静态分析的,所以它们不能依赖运行时信息。

+0

嗯好的。太糟糕了。你知道任何解决方法或类似的东西吗? – LongFlick

+0

像[SystemJS](https://github.com/systemjs/systemjs/blob/master/README.md)这样的模块加载器将允许你想要的东西。 – sdgluck

+2

我问自己,如果我不能模拟我的模块中的任何依赖项来测试,那么全部编写单元测试怎么样? – LongFlick

2

如果您使用Webpack进行捆绑,则可以使用inject-loader来实现此目的。

希望这可以帮助那些在这个旧帖子上磕磕绊绊的人。