Comment puis-je initialiser une variable statique dans module.exports = class
dans node.js.
Fondamentalement, ce que j'essaie de réaliser, c'est que si StaticVariable
est nul, j'obtiendrai des données à partir d'un fichier json. Puis stockez-le dans 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; } }
La fonction fetch()
sera appelée plusieurs fois, il n'est donc pas nécessaire de readFileSync
chaque appel.
3 Réponses :
La classe statique uniquement est un anti-modèle en JavaScript car une classe n'est jamais instanciée.
Dans le cas où il est nécessaire d'avoir une méthode qui charge paresseusement le fichier JSON, un objet simple peut être utilisé. Il existe déjà un tel objet dans la portée du module, module.exports
:
exports.Config = class Config { constructor() { this.config = deepClone(exports.config); } modify() { // modify this.config } };
Il peut ne pas être nécessaire de l'analyser manuellement car cela pourrait être géré par require('./config.json')
one-liner et avec des chemins relatifs plus cohérents.
Dans le cas où le fichier JSON peut être chargé avec impatience , cela peut être simplifié à:
exports.config = require('./config.json');
S'il y a un besoin pour la classe Config
et qu'elle doit accéder à l'objet de configuration, elle peut s'y référer, par exemple:
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; }
Je peux penser à plusieurs façons de réaliser ce que vous demandez.
L'enregistrer dans une variable globale
module.exports = class Config { static fetch() { return require('./config.json'); } }
Ou utilisez simplement require. Require fera la même chose que ce que vous voulez faire. Il lira le fichier config.json, essaiera de l'analyser comme un json valide et il ne le fera qu'une seule fois.
//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; } }
À partir de (nœud 15.2.1) ES2020, les champs de classe privée statique sont pris en charge. Ainsi, à partir de maintenant, la classe statique peut ne pas être anti-pattern et vous pouvez instancier une classe en utilisant de nouveaux mots clés. réf: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes/static
exports.config = require('./config.json');
Où le signe # signifie privé, plus de références peuvent être trouvées dans https://node.green , mais le moyen le plus simple est toujours décrit dans d'autres réponses
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; } }
Quel problème avez-vous avec ce code, à part le fait que vous n'avez pas défini la variable StaticVariable? La classe statique uniquement est un anti-modèle. Fetch est-il le seul membre?
J'ai rendu
fetch()
statique parce que je ne veux pas denew Config
. @estusCela n'explique pas pourquoi vous avez besoin d'un cours. Fetch est-il le seul membre?
Si vous demandez si fetch est la seule fonction, ce n'est pas le cas. Il y aura de
new
, mises àupdate
etc. et ne seront pas une fonction statique. @estusVeuillez mettre à jour la question avec tout le code pertinent et un exemple d'utilisation de Config. Est-il censé y avoir plusieurs instances? Ce que vous avez ici semble être un problème XY qui pourrait être résolu d'une meilleure manière. Est-il nécessaire d'avoir une
fetch
paresseuse? Vous pouvez simplement faireexports.config = require('./config.json')
en haut du moduleOù
StaticVariable
est-StaticVariable
défini et comment utiliser la fonction defetch
?@estus Ouais. Je suis d'accord que c'est un problème XY, je pense que je vais juste vérifier d'autres façons de procéder. Merci. :)