我有一个Node.js模块,到目前为止我一直保存为单个文件。虽然它变得相当大,但它有很多功能,可能更好地分成其他模块。例如,将日志记录初始化和功能分离到它自己的模块中。
我的模块有很多(我想说"全局"但不是真的)顶级变量,许多不同的功能访问,使用和修改。如果我将功能分离到单独的文件/模块中并将它们放入我的主模块中,那么在模块之间传递这些变量的正确方法是什么?
例如,对于一个模块/文件中的所有内容,它很容易实现:
const logger = (log, message) {........}
const makeRequestHandler = (url, filepath) {
....
logger.info('some message here')
....
}
因此,访问logger
等顶级系统非常容易。但是,如果我决定将我的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
这里的方法是否更合适,更好/更容易维护?最后一个是最好的方法吗?
答案 0 :(得分:0)
如注释中所指出的全局定位器模式或服务定位器/服务提供者模式如何,您可以拥有类似服务注册表的内容,并在要使用它们的任何模块中包含这些服务。
虽然我不确定是否是最好的解决方案,但它更容易实现,感觉就像一个更简洁的解决方案,而不是传递模块周围的this
上下文。
//logger.js
const logger = (log, message) {........}
export logger
现在,在app文件中,您可以初始化记录器和其他服务实例,并在全局定位器中注册它们
let logger = require('./mylogger') // Custom module
init() {
//init and set the logger
global.logger = new logger();
...
}
这就是你可以在makRequest的代码中使用它
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)
注意: This article详细解释了此解决方案的某些方面,供您考虑。 还有一些npm模块提供Service Locator这些功能 。 HTH