Node.js全局需要

时间:2015-07-03 17:04:47

标签: javascript node.js global-variables global require

我如何全局需要一个模块,以便我可以在不同的模块中使用它而不必再次需要它? 或者我每次都必须这样做? 这有什么最好的做法吗?

这是我所谈论的一个例子。 假设我有一个像这样的 index.js

var a = require('a.js'),
utils = require('utils.js');

var str = 'hello this is a test';
str = a.change(str);

utils.return(str);

a.js

var utils = require('utils.js');

exports.change = function(str) {
    str = str.replace('test', 'example');
    utils.return('i changed test to example!');
    return str;
}

utils.js

exports.return = function (msg) {
    console.log(msg);
}

你看我必须要求('utils.js')两次,但我宁愿在index.js中要求它一次,并将它作为utils在index.js和a.js中使用。 有什么好办法可以实现这个目标吗?

1 个答案:

答案 0 :(得分:14)

nodejs开发中的常规做法是在每个模块中只需require()一个模块即可。模块本身由nodejs缓存,因此每次都返回相同的模块,并且它实际上不会反复加载。这样做而不是创建全局变量通常会使代码更加模块化和可重用,因为每个模块都唯一地指定(使用require()语句)它需要什么,而不是拥有一堆依赖于某些预先存在的全局配置的模块更多依赖项,加载订单问题等......

可以在一堆其他模块上创建一个require()的模块,然后将结果组合到一个新的主模块中,如果它相关或有用,那么其他模块只需要新的主模块模块。

不建议使用全局变量来代替仅使用require()语句。请记住,在nodejs编程中,大多数require()语句只是在服务器初始化时运行,并且它们被缓存,因此没有什么理由可以避免使用require()而不是全局变量提供的好处和模块性。

我不会亲自推荐这个,因为它模糊不清,但在您的具体示例中,您还可以将utils模块传递给a.js构造函数:

var utils = require('utils.js');
var a = require('a.js')(utils);