Как я могу сделать статическую переменную в `module.exports = class` в node.js

Как я могу инициализировать статическую переменную в module.exports = class в node.js.

По сути, я пытаюсь добиться того, что если StaticVariable равно нулю, я получу данные из файла 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 каждый вызов.

Какая у вас проблема с этим кодом, кроме того, что вы не определили переменную StaticVariable? Статический класс — это антипаттерн. Является ли fetch единственным участником?

Estus Flask 04.04.2019 11:49

Я сделал fetch() статичным, потому что не хочу new Config. @эстус

user10074403 04.04.2019 11:51

Это не объясняет, зачем вам нужен класс. Является ли fetch единственным участником?

Estus Flask 04.04.2019 12:00

Если вы спрашиваете, является ли выборка единственной функцией, это не так. Будут new, update и т. д. и не будет статической функции. @эстус

user10074403 04.04.2019 12:02

Пожалуйста, обновите вопрос со всем соответствующим кодом и примером того, как вы используете Config. Должно быть несколько экземпляров? То, что у вас здесь, похоже, проблема XY, которую можно было бы решить лучше. Обязательно ли быть ленивым fetch? Вы можете просто сделать exports.config = require('./config.json') в верхней части модуля

Estus Flask 04.04.2019 12:04

Где определяется StaticVariable и как вы используете функцию fetch?

Gor 04.04.2019 12:04

@estus Да. Я согласен, что это проблема XY, я думаю, что я просто проверю другие способы сделать это. Спасибо. :)

user10074403 04.04.2019 12:20
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
7
3 433
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Статический класс — это антипаттерн в 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
  }
};

Я могу придумать несколько способов добиться того, о чем вы просите.

Сохранение в глобальной переменной

//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');
    }
}

Начиная с (узел 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');

Другие вопросы по теме