javascript-node.js标准模块的全局变量?

我知道全局变量不好。

但是,如果我在框架中的40个文件中使用节点的模块“ util”,那么最好仅将其声明为全局变量,例如:

util = require('util');

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

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

在这种情况下DRY不好吗?

6个解决方案
102 votes

您可能只有一个通用模块。

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));
Robin Duckett answered 2019-11-19T04:11:58Z
43 votes

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

如果您想单独测试一个模块怎么办? 您会遇到很多问题,因为它无法识别您的应用程序中存在的某些“全局”要求。

是的,即使在这种情况下,全局变量也很糟糕。 全球人员几乎总是在破坏:可测试性,封装性和易于维护性。

更新的答案,2012年1月

现在,global对象是每个模块内部的全局对象。 因此,每次在模块内部分配全局变量(无作用域)时,该变量便成为该模块global对象的一部分。

global对象因此仍然不是全局对象,因此不能如此使用。

2012年12月更新

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

Tor Valamo answered 2019-11-19T04:11:26Z
25 votes
global.util = require('util');

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

但是,应谨慎使用全局变量。 通过将模块添加到全局空间,可以减少可测试性和封装性。 但是在某些情况下,使用此方法是可以接受的。 例如,我将函数和对象添加到全局名称空间以在我的单元测试脚本中使用。

summatix answered 2019-11-19T04:12:30Z
21 votes

我对此线程的答案感到困惑。

我能够做到...

档案: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可以在没有任何其他限定符的情况下访问该对象。

我试图弄清楚这一点(这使我从Google搜索进入了这个话题),我想发布现在看来对我有用的东西。 自原始答案以来,情况可能已经发生了变化。

Dustin Graham answered 2019-11-19T04:13:34Z
0 votes

我已经成功地使用了2620586535640640630272对象来传递我的配置对象。 从理论上讲,它遭受与上述完全相同的问题(封装,可测试性等),但仅使用非状态修改属性(基本上是带有基元的哈希表)时,它仍然可以正常工作。

tedeh answered 2019-11-19T04:13:59Z
-3 votes

如果将模块包装在块中(例如,匿名函数),则可以绑定到本地名称(通过参数或'var'),然后使用所需的任意长(可能标记为“ package”)名称(如果您甚至需要全局名称) 这一点)。

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

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

我将jQuery与noConflict一起使用,前者和后者显示您可以对任何表达式执行此操作-全局,需求,计算,内联,无论如何...这种相同的“包装”方法可用于消除所有( 或几乎所有)“特殊命名的”全局变量-全局变量必须存在于某个级别,但是,消除潜在的冲突是一个很大的胜利。

answered 2019-11-19T04:14:36Z
translate from https://stackoverflow.com:/questions/4140661/global-variables-for-node-js-standard-modules