fullstack-development / react-redux-starter-kit

Modular starter kit for React+Redux+React Router projects.
https://demo.fullstack-development.com/
MIT License
91 stars 13 forks source link

Исправление ошибки Unexpected Keys в SSR режиме #118

Closed Zarwlar closed 4 years ago

Zarwlar commented 5 years ago

Сегодня на одном из проектов столкнулись с проблемой: при запуске ssr сыпались ошибки вида:

Unexpected keys "one", "two" found in initialState argument passed to createStore. Expected to find one of the known reducer keys instead: "events", "flash". Unexpected keys will be ignored.

Где "one", "two", "events", "flash" — имена фич.

И мы пофиксили эту проблему так же, как на другом проекте. Поэтому я подумал перенести это решение в стартер кит. Однако, после переноса иницилазции стейта после создания редюсеров, страница через сср перестала запускаться, т.к. некоторые стейты фич оказались undefined. Тогда я решил подцепить редаксы этих фич прямо в configureApp, как мы это делаем на других проектах. Из всего этого мне непонятно одно — почему тогда фичи работали раньше?)

P.S. Кстати, в SSR режиме у страницы нет стилей

in19farkt commented 5 years ago

А в чем причина этих ворнингов ты понял?

in19farkt commented 5 years ago

Тогда я решил подцепить редаксы этих фич прямо в configureApp, как мы это делаем на других проектах

И тем самым асинхронные фичи сделал синхронными

in19farkt commented 5 years ago

некоторые стейты фич оказались undefined

А причину этого ты понял?

Zarwlar commented 5 years ago

некоторые стейты фич оказались undefined

А причину этого ты понял?

Нет, я про это и написал. Я даже понять не могу, где они конектятся

in19farkt commented 5 years ago

Посмотри как сейчас асинхронные фичи подключаются к стору. Это прольет свет на то откуда появляются ворнинги. Которые кстати никоим образом не влияют на работоспособность приложения, но мозолят глаза в консоли)

Zarwlar commented 5 years ago

А в чем причина этих ворнингов ты понял?

На сколько я понял, в configureStore мы сразу цепляем весь стейт, а редюсеры добавляются в configureApp постепенно, и для них сразу весь стейт "кажется чужеродным"

Zarwlar commented 5 years ago

Просто если это норм тема, то почему от этого избавляются?) Или я что-то не понимаю?

in19farkt commented 5 years ago

На сколько я понял, в configureStore мы сразу цепляем весь стейт, а редюсеры добавляются в configureApp постепенно, и для них сразу весь стейт "кажется чужеродным"

Ага, всё верно)

in19farkt commented 5 years ago

Просто если это норм тема, то почему от этого избавляются?) Или я что-то не понимаю?

Не, на самом деле это недоработка)) Ща гляну что там с андефайнедом

in19farkt commented 5 years ago

Немного подебажил. Обнаружил несколько занятных моментов. Тестил тот вариант, когда есть асинхронные фичи и добавлен диспатч ресет_стейта в configureApp. Поэтапно че происходит на скриншоте:

Вот скриншот: 2019-07-24_19-43-34

В итоге мы имеем полностью сформированный редьюсер, а вот стейт не полноценный, что приводит к ошибке, при попытке заселектить стейт из ветки асинхронной фичи.

Какого хера редьюсер повторно вызывается с экшеном RESET_STATE, я не пытался понять, если кому интересно подебажте, пошарьтесь в коде редакса) Но фактически диспатчим мы его один раз, во время работы финкции configureApp, а вот редьюсер с этим экшеном почему-то вызывается на каждый вызов replaceReducer.

Второй непонятный момент, это то что при вызове replaceReducer, в новый редьюсер первым аргументом (state) прилетает undefined, хотя стейт вроде бы уже был сформирован. Причем если сразу перед вызовом store.replaceReducer(...), мы залогируем store.getState(), то увидим стейт, который вернул прошлый вызов редьюсера.

in19farkt commented 4 years ago

Закрываю ПР, т.к. не актуально и SSR нужно либо капитально перерабатывать, либо выпиливать