admin管理员组文章数量:1390794
Is it possible to inject dependencies into ES2015 modules like in other programming languages like C# or Java? If I import a module I create a hard dependency to it and can not change it later at runtime. For example I have following JavaScript code:
import Animal from './dog';
class Person {
feedAnimal() {
new Animal().feed();
}
}
I am importing the dog module. But what if I want to change it to a cat? At the moment I have to modify line 1 by hand but in some situations I want it configurable from the outside so that under some conditions there should be a cat and under some other conditions it should be a cat. All that things that can be done with classical dependency injection.
I know there are some DI frameworks out there like Scatter, Electrolyte, Wire and so on but unfortunately most of them require some special syntax and are not made for ES2015 modules.
Is it possible to inject dependencies into ES2015 modules like in other programming languages like C# or Java? If I import a module I create a hard dependency to it and can not change it later at runtime. For example I have following JavaScript code:
import Animal from './dog';
class Person {
feedAnimal() {
new Animal().feed();
}
}
I am importing the dog module. But what if I want to change it to a cat? At the moment I have to modify line 1 by hand but in some situations I want it configurable from the outside so that under some conditions there should be a cat and under some other conditions it should be a cat. All that things that can be done with classical dependency injection.
I know there are some DI frameworks out there like Scatter, Electrolyte, Wire and so on but unfortunately most of them require some special syntax and are not made for ES2015 modules.
Share Improve this question edited Aug 18, 2015 at 23:41 Bergi 667k161 gold badges1k silver badges1.5k bronze badges asked Aug 14, 2015 at 10:52 LongFlickLongFlick 1,1371 gold badge14 silver badges21 bronze badges 5-
1
How would you want dependency injection to work? You could do
class Person { constructor(Animal) { this.Animal = Animal; } feedAnimal() { new this.Animal().feed() } }
, but it sounds like you expect something more advanced. – lyschoening Commented Aug 14, 2015 at 13:17 -
I am not sure if
require-inject
supports that, but you might want to take a look. – thefourtheye Commented Aug 14, 2015 at 13:42 - @lyschoening thank you but I want to change internal module dependencies like I would write an unit test. – LongFlick Commented Aug 14, 2015 at 14:52
- @thefourtheye thank you but the thing is that I do not require anything. Requiering is a CommonJS related thing. I use the shiny new ES2015 import feature. – LongFlick Commented Aug 14, 2015 at 14:53
- 1 You could probably hijack the module loader one way or the other. Not that I remend doing that. – Felix Kling Commented Aug 14, 2015 at 15:17
3 Answers
Reset to default 2You cannot dynamically define dependencies. See this question and its accepted answer:
Question: ES6 variable import name in node.js?
Answer: Not with the import statement. import and export are defined in such a way that they are statically analyzable, so they cannot depend on runtime information.
You can use inject-loader to achieve this if you are bundling with Webpack.
Hopefully this helps someone who stumbles upon this old post.
I moved over to SystemJS. With SystemJS you can make dynamic imports like System.import('foo').then(() => console.log('Loaded));
Another advantage is that System will be the new ECMAScript standard module loader system.
本文标签: javascriptInject dependencies into ES2015 moduleStack Overflow
版权声明:本文标题:javascript - Inject dependencies into ES2015 module - Stack Overflow 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.betaflare.com/web/1744753747a2623335.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论