如何在node.js的`module.exports = class`中创建静态变量

时间:2019-04-04 09:46:02

标签: javascript node.js

如何在node.js的module.exports = class中初始化静态变量。

基本上,我要实现的是,如果StaticVariable为null,那么我将从json文件中获取数据。然后将其存储在StaticVariable中。

module.exports = class Config { 
    static fetch() {

        if ( StaticVariable === null ) {
            const fs = require('fs');
            const data = fs.readFileSync('./config.json');
            const config = JSON.parse(data);  

            StaticVariable = config;

        }

        return StaticVariable;
    }
}

函数fetch()将被多次调用,因此不必每次调用readFileSync

3 个答案:

答案 0 :(得分:1)

纯静态类是JavaScript中的反模式,因为永远不会实例化一个类。

如果需要一种懒惰加载JSON文件的方法,则可以使用一个普通对象。在模块范围module.exports中已经有这样的对象:

const fs = require('fs');
let StaticVariable;

exports.fetch = () => {
    if ( StaticVariable == undefined ) { // not "=== null"
        const data = fs.readFileSync('./config.json');
        const config = JSON.parse(data);  

        StaticVariable = config;

    }

    return StaticVariable;
}

可能不需要手动解析它,因为它可以由require('./config.json')单行处理并且具有相对一致的相对路径。

如果可以紧急加载JSON文件,可以将其简化为:

exports.config = require('./config.json');

如果需要Config类并且它应该访问配置对象,则可以引用它,例如:

exports.Config = class Config {
  constructor() {
    this.config = deepClone(exports.config);
  }

  modify() {
    // modify this.config
  }
};

答案 1 :(得分:1)

我可以想到几种方法来实现您的要求。

将其保存在全局变量中

//initialise it here
var StaticVariable = null;

//however if you initialise it here, it makes more sense to just load it once
const fs = require('fs');
const data = fs.readFileSync('./config.json');
const config = JSON.parse(data);  
StaticVariable = config;

module.exports = class Config { 
    static fetch() {
        return StaticVariable;
    }
}

或仅使用require。 Require将做您想做的事情。它将读取文件config.json,尝试将其解析为有效的json,并且只会执行一次。

module.exports = class Config { 
    static fetch() {
          return require('./config.json');
    }
}

答案 2 :(得分:0)

从(节点15.2.1)ES2020开始,支持静态私有类字段。因此从现在开始,静态类可能不是反模式,您可以使用新关键字实例化一个类。参考:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static

module.exports = class Config { 
    static #StaticVariable = null;
    static fetch() {    
        if ( StaticVariable === null ) {
            const fs = require('fs');
            const data = fs.readFileSync('./config.json');
            const config = JSON.parse(data);  

            StaticVariable = config;

        }    
        return StaticVariable;
    }
}

在#号处表示可以在https://node.green中找到更多的私人参考,但在其他答案中仍然描述了最简单的方法

exports.config = require('./config.json');