Динамическая инициализация переменной в пакете npm

#javascript #npm

#javascript #npm

Вопрос:

У меня есть импортированная библиотека из npm, и некоторые ее части необходимо инициализировать перед использованием, упрощенная версия кода в библиотеке:

 export let locale = () => { throw new Error("Must init locale"); }

export initLocale(userLocaleFunction) {
    locale = userLocaleFunction;
}
export checkLocale() {
    console.log(locale());
}
  

Но при вызове библиотеки следующим образом:

 lib = require("lib");
lib.initLocale(() => { return "en" });
lib.checkLocale(); // works as expected: "en"
lib.locale(); // Throws "Must init locale";
  

lib.locale действует так, как будто он не был инициализирован. Я не могу initLocale() вернуть языковой стандарт, мне нужно, чтобы он был в переменной lib.locale

Возможно ли инициализировать переменную таким образом?

Комментарии:

1. Попробуйте изменить «let» на «const». Действительно, let — это объявление с ограниченной областью действия. также вы переназначаете locale внутри initLocale, так что, возможно, это просто переопределено

2. есть ли у вас контроль над импортированным пакетом?

3. @Vinz243 У меня есть контроль над ним — я переношу его из более старых версий js — это означает, что большая часть кода зависит от lib.locale, чтобы выглядеть так, как он выглядит

4. @Webwoman Я отредактировал сообщение, чтобы более четко осветить проблему — я инициализирую переменную и ожидаю, что она вернет «en», но вместо этого я получаю начальное значение — «Необходимо инициализировать locale»

5. вы пытались изменить let на var ?

Ответ №1:

Кажется, что при инициализации переменной внутри библиотеки она находится только в области библиотек.

В моем первом решении я просто вернул значение:

 export initLocale(userLocaleFunction) {
    locale = userLocaleFunction;
    return locale;
}
  

Но затем понял, что это создает новую проблему: что, если locale будет изменен внутри библиотеки или, что еще хуже, за ее пределами?

В духе избежания двух источников правды я в конечном итоге выбрал это:

 locale = undefined;
export initLocale(userLocaleFunction) {
    locale = userLocaleFunction;
}
export getLocale() {
    if (locale === undefined) {
        throw new Error("Uninitialized locale");
    }
    return locale;
}
  

Этот код выполняет is initialized проверку, в которой я нуждался вначале, и выдает значение с одним источником достоверности.