节点定义我需要跨模块使用的唯一变量

时间:2017-05-04 11:41:39

标签: javascript node.js global-variables

目前我只是传递我的fileNamePrefix

let shortid = require('shortid');
let fileNamePrefix = shortid.generate();

module1.run(fileNamePrefix); //generating a file based on `fileNamePrefix` `xxxxx.f1.json`
module2.run(fileNamePrefix); //generating a file based on `fileNamePrefix` `xxxxx.f2.json`
module3.run(fileNamePrefix); //generating a file based on `fileNamePrefix` `xxxxx.f3.js

我认为不太正确,我可能需要稍后将更多内容传递给我的模块,所以我想避免将其作为函数params传递。

在nodejs中处理此问题的最佳方法是什么?

global这样的global.fileNamePrefix = shortid.generate();对象会在那种情况下发生,还是会接近那种不同的对象?我刚看到global不好......

2 个答案:

答案 0 :(得分:1)

只需创建类似的模块:

// unicname.js
let shortid = require('shortid');
let fileName = shortid.generate();

module.exports = {fname: fileName};

//module1.js
const {fname} = require('./unicname.js');
....

由于node.js缓存模块,因此只会计算一次值,因此您可以在所有模块中获得相同的值。

答案 1 :(得分:1)

您可以使用@СергейТертичный建议的单身方法或方法

  1. Singleton:

    //shortid.js
    
    var fileSingleTon = module.exports = {
    
        fileNamePrefix: null,
    
        getFileNamePrefix: function() {
            return fileSingleTon.fileNamePrefix || fileSingleTon.generate()
        },
        generate: function() {
            console.log('generating..');
            return fileSingleTon.fileNamePrefix = 'your_file_prefix';
        }
    }
    
    //module1.js
    
    var fileNamePrefix = require('./shortid').getFileNamePrefix();
    
    //do stuff for module1
    
    //module2/js
    
    var fileNamePrefix = require('./shortid').getFileNamePrefix();
    
    //do stuff for module1
    

    依旧......

  2. 即使现在你正在调用require('./ shortid')。getFileNamePrefix();多次,生成函数只被调用一次。

    1. 节点缓存方法:
    2. 考虑你有shortid.js如下:

      // A: block of code to do some manipulations
      
      // B : module.exports = manipulation result.
      

      所以基本上在节点js中“模块”核心模块负责给我们module.export功能执行上面的任何内容导出(在abode示例中的部分A)只是第一次并且即使你需要也会缓存它在多个其他文件中。但是,它只执行导出内的每个需求中的函数或代码块。所以你可以使用这种方法,你的A块将有登录生成fileNamePrefix,然后B只返回它。