如何在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
。
答案 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');