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必须存在于某个层面,然而,消除潜在的冲突是一个非常大的胜利。