NodeJS 应用程序中的全局

Global in NodeJS application

我正在开发一个 NodeJS 应用程序,我有不同的模块,并且在这些模块中有不同的包,因为这些包使用其他包中的函数,我遇到了到处都需要控制器的问题,所以我所做的是,我将这些控制器全球化,

例如

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

所以我的问题是

  1. 全球化这些控制器时是否存在任何性能问题,是否会对我的应用程序产生任何性能影响?
  2. 如果使用全局有问题,其他更好的方法是什么?

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

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

或者你的控制器所在的任何地方,相对于你的调用模块。然后你就可以访问你的控制器,你可以访问它的导出变量和函数。

我混合使用 requires(如@Hinrich 的回答)和 global.someNamespaceName.anInstance

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

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);

我使用 requires 主要用于 "typical" 节点式的东西和标准库,即 var QueryString = require('querystring');

这个"seems right"是我的想法,但不知道有没有具体的指导方针,不管哪种方式都可以。 global.xxx 的优点是你可以避免在每个文件的开头有几十个要求,并且排序可能是一个问题。

使用 global.myAppName.someOtherName 的两个可能缺点:

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