我如何全局需要一个模块,以便我可以在不同的模块中使用它而不必再次需要它? 或者我每次都必须这样做? 这有什么最好的做法吗?
这是我所谈论的一个例子。 假设我有一个像这样的 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中使用。 有什么好办法可以实现这个目标吗?
答案 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);