2015-04-23 70 views
1

我正在一个NodeJS应用程序,我有不同的模块和在这些模块不同的软件包,因为那些软件包正在使用其他软件包的功能,我有一个问题需要控制器无处不在,所以我做的是,我全球化那些控制器,在NodeJS应用程序中的全球

例如

global.CTRLS = { userCtrl : [require('./User/profile/controller/profileCtrl')]  
, productCtrl : [require('./Product/Products/controller/productCtrl')] } 

所以我的问题是

  1. 是否有任何性能问题,而全球化的这些控制器,会不会有我的应用程序的任何性能影响?
  2. 如果使用全球性问题,可以采用其他更好的方法吗?
+0

全球化模块不是一个好主意,因为它可能会弄乱你的变量。看看[这里](http://www.bennadel.com/blog/2169-where-does-node-js-and-require-look-for-modules.htm)一些基本的介绍。请展示一些代码,如果我们应该帮助你实际解决你的问题 – Hinrich

+0

我正在全球化只是在这些模块内包含功能的控制器,你能告诉我一个更好的方法吗? – Zeeshan

+0

你能告诉我你的代码吗? – Hinrich

回答

2

我使用混合的要求(如在@Hinrich答案)和global.someNamespaceName.anInstance

一般来说,我使用global.someNamespaceName.anInstance引用一个对象,即类,的具体实例,例如一个特定的数据库连接,或应用程序的特定配置。例如,在主应用程序初始化代码,像

var config = { lots of config stuff, e.g. .mongoURI, .port, .loggerFormat, .prefs, ... } 
... 
global.myAppName.config = config ; 
global.myAppName.myMongo = new MyMongo(config.mongoURI); 
global.myAppName.mySQL = new MySQL(config.mySQLSettings); 

我用需要主要为“典型的”节点十岁上下的东西和标准库,即var QueryString = require('querystring');

这“似乎是正确的”,以我的想法,但不知道是否有任何具体的指导方针,无论哪种方式都很好。 global.xxx的优势在于,您可以避免在每个文件开始时有数十个需求,而排序可能是一个问题。使用global.myAppName.someOtherName的

两种可能的缺点:

  1. 命名空间冲突。除非你有一个庞大的项目和多个不通信的程序员,否则不应该成为问题。这是可能发生的需求...
  2. 它需要两个查找(.myAppName和.someOtherName)来查找该对象,这将是一个极其微小的性能命中。如果您在循环中引用该项目数千次,请将其缓存在局部变量中。
1

您可以在您需要它们的模块中使用require控制器。所以在模块内部,例如

var profileCtrl = require('./User/profile/controller/profileCtrl'); 

或无论你的控制器住在哪里,相对于你的调用模块。然后你可以访问你的控制器,你可以访问它的导出变量和函数。