Node.js全局需要

Joh*_*son 8 javascript global global-variables require node.js

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

以下是我所谈论的一个例子.假设我有一个像这样的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);
Run Code Online (Sandbox Code Playgroud)

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;
}
Run Code Online (Sandbox Code Playgroud)

utils.js

exports.return = function (msg) {
    console.log(msg);
}
Run Code Online (Sandbox Code Playgroud)

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

jfr*_*d00 15

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

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

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


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

var utils = require('utils.js');
var a = require('a.js')(utils);
Run Code Online (Sandbox Code Playgroud)