ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-10 16:36:35  阅读:335  来源: 互联网

标签:javascript module node-js variables node-modules


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

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

例如,对于一个模块/文件中的所有内容,很容易做到这一点:

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

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

因此,访问像记录器这样的顶级系统非常容易.但是,如果我决定将我的记录器和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

现在,在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

标签:javascript,module,node-js,variables,node-modules
来源: https://codeday.me/bug/20190710/1425786.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有