node.js标准模块的全局variables?

我知道全局variables是不好的。

但是,如果我在我的框架中的40个文件中使用节点的模块“util”,那么把它声明为一个全局variables是不是更好:

util = require('util'); 

在index.js文件中,而不是在40个文件中写入该行?

因为我经常在每个文件中使用相同的5-10个模块,这样可以节省大量的时间,而不是始终复制粘贴。

在这种情况下干不好?

每个模块应该是独立的。 在每个模块的第一个之后,这个要求不会花费任何东西。

如果你想单独testing一个模块呢? 你会遇到很多问题,因为它不能识别你的应用程序中有一些“全局”要求。

是的,即使在这种情况下,全局variables也是不好的。 全球几乎总是毁灭:可testing性,封装和易于维护。

更新的答案2012年1月

global对象现在是每个模块内部的global对象。 所以每当你在一个模块内分配一个全局variables(没有作用域),它就成为该模块的global对象的一部分。

因此, global对象仍然不是全球性的 ,不能这样使用。

2012年12月更新

global对象现在在应用程序中具有全局范围,可用于存储需要从所有模块访问的任何数据/函数。

你可以有一个通用的模块。

common.js:

 Common = { util: require('util'), fs: require('fs'), path: require('path') }; module.exports = Common; 

app.js:

 var Common = require('./common.js'); console.log(Common.util.inspect(Common)); 
 global.util = require('util'); 

节点文档中有关于全局对象的一节。

但是,应该谨慎使用全局variables。 通过向全局空间添加模块,可以降低可testing性和封装性。 但有些情况下使用这种方法是可以接受的。 例如,我将函数和对象添加到全局名称空间以在我的unit testing脚本中使用。

我很困惑在这个线程的答案。

我能够做到这一点…

文件:test.js

 global.mytest = { x: 3, y: function() { console.log('Works.'); } }; 

文件:test2.js

 console.log('Does this work?'); mytest.y(); 

文件:server.js

 require('test.js'); require('test2.js'); 

而且这似乎是需要解决的问题。 第一个require将mytest对象放入全局范围,然后第二个require可以访问该对象,而不用任何其他限定符。

我正试图弄清楚这些(这使我从Googlesearch中获得了这个线索),而且我现在想发布一些似乎适用于我的东西。 自从最初的答案以来,也许事情已经改变

我已经成功地使用process对象来传递我的configuration对象。 虽然在理论上遇到与上面提到的完全相同的问题(封装,可testing性等),但是在仅使用非状态修改属性(基本上是具有基元的散列表)时,其工作良好。

如果你将模块封装成块(例如anon函数),你可以绑定到一个本地名字(通过参数或'var'),然后有任意长的(也许是“包”标签)你想要的名字(如果你甚至需要一个全局在此刻)。

例如,我的模块通常看起来类似于:

 ;(function ($, $exp, other) { $(...) other.xyz() $exp.MyExportedObject = ...; })(jQuery, window, some_module.other_expression) // end module 

我使用jQuery与noConflict,这是前者,后者显示你可以做任何expression式 – 全局,要求,计算,内联,无论… …这种相同的“包装”方法可以用来消除所有或者几乎所有的)“特殊命名的”全局variables – 全局variables必须存在于某个层面,然而,消除潜在的冲突是一个非常大的胜利。