7

E 'possibile iniettare dipendenze in moduli ES2015 come in altri linguaggi di programmazione come C# o Java? Se importo un modulo, ne creo una forte dipendenza e non posso cambiarlo più tardi in fase di runtime. Ad esempio, ho il seguente codice JavaScript:Inject dependencies in ES2015 module

import Animal from './dog'; 

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

Sto importando il modulo cane. Ma cosa succede se voglio cambiarlo in un gatto? Al momento devo modificare la linea 1 a mano ma in alcune situazioni lo voglio configurabile dall'esterno in modo che in alcune condizioni ci debba essere un gatto e in alcune altre condizioni dovrebbe essere un gatto. Tutto ciò che si può fare con l'iniezione classica delle dipendenze.

So che ci sono alcuni DI framework là fuori come Scatter, Electrolyte, Wire e così via, ma purtroppo la maggior parte di essi richiedono una sintassi speciale e sono non fatto per ES2015 modules.

+1

Come si desidera che l'iniezione di dipendenza funzioni? Si potrebbe fare 'class Person {constructor (Animal) {this.Animal = Animal; } feedAnimal() {new this.Animal(). feed()}} ', ma sembra che ti aspetti qualcosa di più avanzato. – lyschoening

+0

Non sono sicuro che se ['require-inject'] (https://www.npmjs.com/package/require-inject) lo supporta, ma potresti voler dare un'occhiata. – thefourtheye

+0

@lyschoening grazie, ma voglio cambiare le dipendenze dei moduli interni come scriverei un test unitario. – LongFlick

risposta

-1

Sono passato a SystemJS. Con SystemJS è possibile effettuare importazioni dinamiche come System.import('foo').then(() => console.log('Loaded));

Un altro vantaggio è che System sarà il nuovo sistema di caricamento del modulo standard ECMAScript.

2

Non è possibile definire dinamicamente le dipendenze. See this question and its accepted answer:

Domanda: variabile ES6 nome di importazione in node.js?

Risposta: Non con la dichiarazione di importazione. l'importazione e l'esportazione sono definite in modo tale da essere analizzabili staticamente, quindi non possono dipendere dalle informazioni di runtime.

+0

Hmm ok. Peccato. Conosci qualche soluzione alternativa o qualcosa del genere per questo? – LongFlick

+0

Un caricatore di moduli come [SystemJS] (https://github.com/systemjs/systemjs/blob/master/README.md) consentirebbe quello che vuoi. – sdgluck

+2

Mi chiedo come fanno tutti i test di unità di scrittura se non riesco a deridere le dipendenze nel mio modulo per testare? – LongFlick

2

È possibile utilizzare inject-loader per ottenere questo risultato se si esegue il bundle con Webpack.

Speriamo che questo aiuti qualcuno che si imbatte in questo vecchio post.