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來實現此目的。

希望這可以幫助那些在這個舊帖子上磕磕絆絆的人。