То, что сработало при получении данных для моего первого рендера, было инициализировать хранилище избыточности следующим образом:
if (typeof localStorage != "undefined") {
initialState = {
theme: localStorage.getItem("theme"),
};
} else {
initialState = {};
}
const store = createStore(reducers, initialState);
Но это ухудшило ситуацию, так как компоненты больше не перерисовывались при первой загрузке, потому что theme
prop from redux никогда не менялся, потому что хранилище было инициализировано с предпочтениями пользователя.Итак, я вернулся к старому подходу в первоначальном вопросе, приведенном выше.
Мерцание происходит, потому что я использую Javascript для управления темой в своем приложении реакции.Я также использую Gatsby, которая генерирует статическую версию моего сайта, которая загружается до того, как мое приложение отреагирует.
Загрузка сайта происходит следующим образом:
Например Пользователь с темными предпочтениями посещения.Они видят статический контент без Javascript, в то время как пакеты JS загружаются в фоновом режиме.
Поскольку легкая тема используется по умолчанию, статическая версия сайта будет светлой.
Загрузка Javascript и первый рендеринг React происходит, и резервное хранилище инициализируется.Корневой компонент получает тему от localStorage
, а дерево перерисовывается с темной темой.
Мерцание происходит из-за событий от 2 до 3.
Мне не удалось решить проблему полностью.Но мне удалось смягчить мерцание, чтобы сделать его гораздо более незаметным, включив работника службы Гэтсби.Работник кэширует комплекты Javascript для следующего посещения сайта, а загрузка Javascript с диска означает, что мерцание задержится на более короткое время, поскольку комплекты JS уже доступны для выполнения.