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

Javascript 节点定义我需要跨模块使用的唯一变量,javascript,node.js,global-variables,Javascript,Node.js,Global Variables,目前我正在传递我的filenameprifix,如下所示: 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 base

目前我正在传递我的
filenameprifix
,如下所示:

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
// unicname.js
let shortid = require('shortid');
let fileName = shortid.generate();

module.exports = {fname: fileName};

//module1.js
const {fname} = require('./unicname.js');
....
我认为这不太正确,以后可能需要将更多内容传递给模块,因此我希望避免将其作为函数
参数传递

在nodejs中实现这一点的最佳方法是什么


global
对象与
global.filenameprifix=shortid.generate()类似在这种情况下可以,或者您会采用不同的方法吗?我刚读到
global
不好

只需创建如下模块:

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
// unicname.js
let shortid = require('shortid');
let fileName = shortid.generate();

module.exports = {fname: fileName};

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

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

只需创建如下模块:

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
// unicname.js
let shortid = require('shortid');
let fileName = shortid.generate();

module.exports = {fname: fileName};

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

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

您可以使用单例方法或@Счччччч建议的方法

  • 单身人士:

    //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
    
    等等

  • 即使现在您仍在调用require('./shortid')。getFileNamePrefix();多次,仅调用一次生成函数

  • 节点缓存方法:
  • 假设您有shortid.js,如下所示:

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

    因此,基本上在node js“modules”核心模块中,它负责为我们提供module.export功能,仅第一次执行上面的导出(在A部分的示例中),并缓存它,即使您需要在多个其他文件中。但是,它只执行导出中每个require中的函数或代码块。因此,您可以使用这种方法,其中A块将登录以生成fileNamePrefix,然后B只返回它。

    您可以使用单例方法或@Сччччччччч建议的方法

  • 单身人士:

    //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
    
    等等

  • 即使现在您仍在调用require('./shortid')。getFileNamePrefix();多次,仅调用一次生成函数

  • 节点缓存方法:
  • 假设您有shortid.js,如下所示:

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

    因此,基本上在node js“modules”核心模块中,它负责为我们提供module.export功能,仅第一次执行上面的导出(在A部分的示例中),并缓存它,即使您需要在多个其他文件中。但是,它只执行导出中每个require中的函数或代码块。因此,您可以使用这种方法,其中A块将登录以生成fileNamePrefix,然后B只返回它。

    这看起来并不是一个特定的节点问题,您的问题应该更加精确。“文件名”是如何使用的?你为什么不直接出口呢?如果它在概念上是一个更大物体的一部分,为什么不让它成为一个更大物体的一部分呢。您可以执行fileName=shortid.generate();在每个模块中,如果不产生效率问题。2.可以使用单例模式,其中可以有属性文件名。它在整个项目中只有一个状态,所以你不必担心效率。@Blastfreak不,我不能,我需要相同的名称,基本上只是修改了问题检查一下,可能会给你一个方向:不,index.js将有一个单例模式。然后,您将使用.fileNamePrefixThis调用该实例的正确名称。这看起来并不是一个特定的节点问题,您应该更准确地回答您的问题。“文件名”是如何使用的?你为什么不直接出口呢?如果它在概念上是一个更大物体的一部分,为什么不让它成为一个更大物体的一部分呢。您可以执行fileName=shortid.generate();在每个模块中,如果不产生效率问题。2.可以使用单例模式,其中可以有属性文件名。它在整个项目中只有一个状态,所以你不必担心效率。@Blastfreak不,我不能,我需要相同的名称,基本上只是修改了问题检查一下,可能会给你一个方向:不,index.js将有一个单例模式。然后,您将使用.filenameprefext调用该实例的名称。该名称看起来与@Blastfreak在注释中所说的有点不同。如果只在main(
    index.js
    )模块中调用singleton,然后导出值以在其他模块中像
    require('./index.js').fileNamePrefix
    那样使用它,有什么区别?有什么想法吗?也许我不清楚你需要什么。据我所知,您需要一次计算值,并在项目的所有模块中使用它?这是正确的,我需要在我的
    index.js
    中计算一个值,并在其他模块中使用该值。该值看起来与@Blastfreak在评论中所说的有点不同。如果只在main(
    index.js
    )模块中调用singleton,然后导出值以在其他模块中像
    require('./index.js').fileNamePrefix
    那样使用它,有什么区别?有什么想法吗?也许我不清楚你需要什么。据我所知,您需要一次计算值并在项目的所有模块中使用它?这是正确的,我需要在我的
    index.js
    中计算一个值,并在其他模块中使用它