Глобальный модуль es6 для хранения констант в реагирующем приложении — предотвращение сборки мусора

Я хотел бы сохранить некоторые переменные внутри модуля (экспорт), которые будут использоваться в качестве констант через мое приложение для реагирования. Я хотел бы избежать контекста, потому что нет необходимости в повторном рендеринге компонентов, а также мне нужно, чтобы эти константы использовались вне моих реагирующих компонентов.

Где мне это сделать (куда импортировать), чтобы предотвратить сборку мусора?

У меня есть одна идея - импортировать и реэкспортировать его поверх моего корневого компонента.

РЕДАКТИРОВАТЬ:

Если быть точнее, будет компонент, который установит константу один раз (мутирует переменную), чтобы другие компоненты или файлы могли получить к ней доступ.


person Nikos    schedule 12.02.2020    source источник
comment
Пока существуют активные ссылки на переменную, эта переменная не будет удалена сборщиком мусора.   -  person apokryfos    schedule 12.02.2020
comment
Это именно вопрос. Как я могу гарантировать существование ссылки, пока работает мое приложение для реагирования?   -  person Nikos    schedule 12.02.2020
comment
Я не уверен в этом, но, насколько мне известно, экспорт модуля не будет собираться мусором, пока модуль остается загруженным, и я не знаю, как выгрузить модуль после его загрузки.   -  person apokryfos    schedule 12.02.2020
comment
@apokryfos Я думаю, что ты говоришь правильный ответ. Я предоставил свой собственный ответ.   -  person Nikos    schedule 13.02.2020


Ответы (3)


Итак, вам понадобится какой-то шаблон сеттера/геттера. Хотя в основном я не рекомендую его, если вы не знаете, что делаете, потому что React не будет повторно отображать, если переменная изменится, и из-за этого вам нужно убедиться, что переменная установить перед использованием.

У вас должно быть что-то вроде примера ниже, чтобы он работал так, как вы хотите. Вы можете найти пример его работы в этой Codesandbox.

export let MY_VARIABLE = "";

export const setMyVariable = value => (MY_VARIABLE = value);

PS: я добавил немного console.log в код, чтобы вы видели, как ведет себя импорт/получение/установка.

person JCQuintas    schedule 12.02.2020
comment
Когда компонент размонтирован (например, из навигатора), этот импортированный модуль не собирается мусором? - person Nikos; 12.02.2020
comment
Можете ли вы уточнить, почему это имеет значение? Почему для вашего приложения важно, чтобы константа не собирала мусор? - person JCQuintas; 12.02.2020
comment
Есть компонент, который установит константу один раз, чтобы другие компоненты или файлы могли получить к ней доступ. - person Nikos; 12.02.2020
comment
Тогда это не константа, пожалуйста, отредактируйте свой вопрос с этой информацией, и я обновлю свой ответ. - person JCQuintas; 12.02.2020
comment
Проверьте обновленный ответ и реализацию codeandbox, чтобы узнать, решает ли он вашу проблему. :) - person JCQuintas; 12.02.2020
comment
Итак, как это гарантирует, что моя переменная не будет разыменована, а значит, собран мусор? - person Nikos; 12.02.2020
comment
Если вы импортируете его в точку входа вашего приложения, он должен оставаться в памяти приложений, после чего вы можете обновить/получить переменную, где хотите. - person JCQuintas; 12.02.2020
comment
Я не думаю, что импортировать его поверх точки входа, это правильно. Я импортировал его только в компонент экрана загрузки (где я установил переменную), а затем импортировал его в другой компонент, и я вижу правильное значение. - person Nikos; 12.02.2020
comment
Да, он будет работать на чем угодно выше компонента, который его использует. - person JCQuintas; 12.02.2020

Покопавшись в этом, я обнаружил, что спецификация модуля es6 гласит:

При импорте вашего модуля он получает loaded => parsed => evaluated и cached (синглтон). В нем также говорится, что когда вы импортируете модули, их значение передается по ссылке (иначе присваивание). Я не нашел ничего, что указывало бы, когда и как модули es6 выгружаются из этого кеша.

Это означает, что когда вы один раз импортируете модуль, он существует до тех пор, пока работает программа, и все модули напрямую обращаются к его значениям.

ссылка

person Nikos    schedule 13.02.2020

Вы можете создать config.js внутри папки src и написать свою постоянную переменную, например

//config.js module.exports = {CONST_VAR: 'постоянное значение', }

импортируйте config.js в свой компонент и используйте его

person Amit Maurya    schedule 12.02.2020
comment
Когда компонент размонтирован (например, из навигатора), этот импортированный модуль не собирается мусором? - person Nikos; 12.02.2020