2015-04-23 71 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'); 

或無論你的控制器住在哪裏,相對於你的調用模塊。然後你可以訪問你的控制器,你可以訪問它的導出變量和函數。