Node.js 全局要求

Node.js 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 中要求它一次,并在 index.js 和 [=32= 中提供它] 作为实用程序。 有什么好的方法可以实现吗?

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

可以制作一个模块,对一堆其他模块执行 require(),然后将结果组合到一个新的主模块中(如果相关或有用),这样其他模块只需要新的主模块。

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


我个人不推荐这样做,因为它会扰乱模块化,但在您的具体示例中,您还可以将 utils 模块传递给 a.js 构造函数:

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

对于以后搜索此问题的人,您可以使用 global 变量。 仅在真正特定的情况下执行此操作(例如:在每个文件中复制代码)

global.mymodule = require("mymodule");
mymodule.abc // works in any file in the same process