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

标签 javascript node.js variables module node-modules

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

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

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

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

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

因此很容易访问像logger这样的顶级系统。但是,如果我决定将我的 loggermakeRequestHandler 拆分到它们自己的模块/文件中,我将如何处理?

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

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

最佳答案

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

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

//logger.js
const logger = (log, message) {........}
export logger

现在,在应用程序文件中,您可以初始化记录器和其他服务实例并将它们注册到全局定位器中

 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 .

关于javascript - 在多文件 Node.js 模块之间传递变量的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49595609/

相关文章:

javascript - 需要一种方法来根据请求禁用 HTML 框架

javascript - 使用 easelJs 或 KineticJs 创建动态矩形/框

javascript - Angular typescript如何将字符串转换为html对象并将其传递给变量

javascript - 异步node.js :nested array with callback

java - Java 中修改后的方法参数与它的副本有什么区别?

javascript - 嵌套函数可以使用在父函数内的其他函数中设置值的变量吗? (Javascript)

javascript - 使用javascript重定向到当前域之外

node.js - 火存储 : Document parent name lacks "/"

php - 表名是来自同一查询的变量(PHP)

node.js - 如何在 MacOS M1 上安装 node-sass?