Nodejs,最好有很多相同的要求或使用一个句柄?

形象这个esctructure:

- app.js - core/ - service_1.js - service_2.js - service_3.js - service_4.js - service_5.js - modules/ - module_1.js - module_2.js - module_3.js 

app.js使用3个模块,所以应用程序的代码是:

 var m1 = require('./modules/module_1'); var m2 = require('./modules/module_2'); var m3 = require('./modules/module_3'); m1.exec(); m2.exec(); m3.exec(); 

每个模型使用所有的服务,所以他们需要:

 var s1 = require('./../core/service_1'); var s2 = require('./../core/service_2'); var s3 = require('./../core/service_3'); var s4 = require('./../core/service_3'); var s5 = require('./../core/service_3'); // some stuff... 

所以,我需要知道这是最好的方式来处理,或者做一个“服务pipe理器”,如:

app.js

 var m1 = require('./modules/module_1'); var m2 = require('./modules/module_2'); var m3 = require('./modules/module_3'); var serviceManager = { service_1 : require('./core/service_1'), service_2 : require('./core/service_2'), service_3 : require('./core/service_3'), service_4 : require('./core/service_4'), service_5 : require('./core/service_5') }; m1.load(serviceManager); m2.load(serviceManager); m3.load(serviceManager); m1.exec(); m2.exec(); m3.exec(); 

我把每一个模型

 var serviceManager = null; exports.load = function(services) { serviceManager = services; } // some stuff... 

如果我几乎在所有文件中都使用这个类,什么是最好的?

a)获得很多'要求'。

b)一个把“需要”放一次的句柄。

c)另一个解决scheme。

我会去很多的require 。 没关系,因为Node.js在第一次加载后caching模块。

从Node.js文档:

模块在第一次加载后被caching。 这意味着(除其他外)每个调用require('foo')将返回完全相同的对象,如果它将parsing为相同的文件。

dependency injection对此非常有用。 我用过并推荐胰岛素 。 这使得在dependency injection容器中加载每个模块非常容易,然后只需在您编写的模块中命名依赖关系。

你可以做如下的事情:

 'use strict'; require('insulin').factory('myService', myServiceFactoryFunction); function myServiceFactoryFunction(dependencyOne, dependencyTwo) { // Do something with your dependencies. } 

这样,您只需要在文件的顶部一次,而不必在该文件中再次执行该操作。

正如其他答案中提到的那样,节点caching了所有需要的东西,所以每次需要注入容器时,都会得到相同的结果。 这使得构build应用程序变得非常快捷,而且不需要随处添加任何东西,也无需传递任何东西。

稍后,要获得上面创build的模块,只需在需要的地方执行以下操作:

 'use strict'; require('insulin').factory('mySecondService', mySecondServiceFactoryFunction); function mySecondServiceFactoryFunction(myService) { // myService is now available in this module } 

与大多数其他dependency injection器一样,如果您由于某种原因不希望或不能在应用程序的某个部分dependency injection,则可以使用其他方法。 你可以做这样的事情:

 const insulin = require('insulin'); const myDependency = insulin.get('someModule'); 

需要的地方。

对我来说最好的部分是代码变得非常干净,只要查看传递给工厂函数的参数,就可以很容易地告诉给定文件的依赖关系。