Javascript 在多文件Node.js模块之间传递变量的最佳方法?

Javascript 在多文件Node.js模块之间传递变量的最佳方法?,javascript,node.js,variables,module,node-modules,Javascript,Node.js,Variables,Module,Node Modules,到目前为止,我有一个Node.js模块,作为一个文件保存。但是它变得相当大,并且有很多功能,可以更好地分离到其他模块中。例如,将日志初始化和功能分离到它自己的模块中 我的模块有很多顶级变量(我想说是“全局的”,但不是真正的),很多不同的函数可以访问、使用和修改这些变量。如果我将功能分离到单独的文件/模块中,并要求它们进入我的主模块,那么在模块之间传递这些变量的正确方法是什么 例如,将所有内容都放在一个模块/文件中,这样做很容易: const logger = (log, message) {..

到目前为止,我有一个Node.js模块,作为一个文件保存。但是它变得相当大,并且有很多功能,可以更好地分离到其他模块中。例如,将日志初始化和功能分离到它自己的模块中

我的模块有很多顶级变量(我想说是“全局的”,但不是真正的),很多不同的函数可以访问、使用和修改这些变量。如果我将功能分离到单独的文件/模块中,并要求它们进入我的主模块,那么在模块之间传递这些变量的正确方法是什么

例如,将所有内容都放在一个模块/文件中,这样做很容易:

const logger = (log, message) {........}

const makeRequestHandler = (url, filepath) {
    ....
    logger.info('some message here')
    ....
}
因此,访问顶级系统(如
记录器
)非常容易。但是,如果我决定将我的
logger
makeRequestHandler
拆分为它们自己的模块/文件,我将如何处理

let logger = require('./mylogger') // Custom module
let makeRequest = require('./makerequest') // Another custom module

makeRequest.handler(url, filepath, logger)
这是可行的,但它似乎并不优雅或最优。如果我有很多不同的变量需要传递,那就更奇怪了:

makeRequest.handler(url, filepath, logger, profiler, reportingBuffer, compressionHandler)
我还考虑在需要时将内容传递到模块中:

let makeRequest = require('./makeRequest')(logger)
或者更好:

let makeRequest = require('./makeRequest')(this) // I can access all variables made in my primary/top-level module

这里是否有更合适、更好/更容易维护的方法?最后一种方法是最好的方法吗?

关于全局定位器模式或服务定位器/服务提供者模式,如评论中所指出的,您可以使用类似服务注册表的东西,并将这些服务包含在您想要在其中使用它们的任何模块中

虽然我不确定是否是所有解决方案中最好的解决方案,但与在模块周围传递
这个
上下文相比,它更容易实现,感觉更整洁

//logger.js
const logger = (log, message) {........}
export logger
现在,在应用程序文件中,您可以初始化记录器和其他服务实例,并在全局定位器中注册它们

 let logger = require('./mylogger') // Custom module
 init() {
    //init and set the logger 
    global.logger = new logger();
    ...
 }
这就是如何在代码中使用它来发出请求

  let logger = global.logger;
    const makeRequestHandler = (url, filepath) {
        ....
        logger.info('some message here')
        ....
    }

我觉得这些解决方案存在问题:

//Solution 1 : As you pointed out yourself this can get messy when number of paramters increase and is not very readable or understandable.
let logger = require('./mylogger') 
let makeRequest = require('./makerequest') 
makeRequest.handler(url, filepath, logger)


//Solution 2 : Passing around the `this` context is never a good idea,for keeping sensitive data independent or scope isolation
let makeRequest = require('./makeRequest')(this)

注: 详细解释此解决方案的某些方面,供您考虑。 还有一些npm模块提供这些功能,如
. 依赖项注入是在模块之间传递变量/依赖项的常用方法。您还可以尝试控制反转(ioc),例如服务定位器/服务提供者模式。其中,您将有一个单例对象,该对象将保存需要使用的变量