Я относительно новичок в SSR с React и Redux, поэтому я предполагаю, что совершаю простую ошибку, которая отражает мое непонимание базовых структур.Тем не менее, я собираюсь положить голову через стену, так что здесь.Надеюсь, что кто-то может помочь.
Если я пытаюсь перейти непосредственно к корневой странице (/), я получаю ошибку Could not find "store" in the context of "Connect(Home)"
.В моем случае App
содержит мою общую логику навигации и глобальный контент, а (/) отображает компонент Home
.Если я перехожу на страницу, которая НЕ подключается к Redux (например, Условия предоставления услуг), и ТО затем перехожу на мою домашнюю страницу, она отображается идеально.Я предполагаю, что это какая-то проблема маршрутизации на стороне сервера, но я прочитал все, что могу найти в Интернете, попробовал все возможные варианты обработки состояния / хранилища / контекста и не могу ее решить.
Вот скелет моего кода.
renderer.js
[...]
const modules = [];
const routerContext = {};
const bundle = (
<Loadable.Capture report={m => modules.push(m)}>
<ReduxProvider store={store}>
<StaticRouter location={req.baseUrl} context={routerContext}>
<CookiesProvider cookies={req.universalCookies}>
<App />
</CookiesProvider>
</StaticRouter>
</ReduxProvider>
</Loadable.Capture>
);
const html = ReactDOMServer.renderToString(bundle);
if (routerContext.url) {
redirect(301, routerContext.url);
}
// inject into HTML
[...]
configureStore.js
[...]
const createStoreWithMiddleware = compose(applyMiddleware(ReduxThunk))(createStore);
export default function configureStore(initialState = {}) {
return createStoreWithMiddleware(rootReducer, initialState);
};
index.js (клиент)
const store = configureStore( window.__REDUX_STATE__ || {} );
const AppBundle = (
<ReduxProvider store={store}>
<BrowserRouter>
<CookiesProvider>
<App />
</CookiesProvider>
</BrowserRouter>
</ReduxProvider>
);
window.onload = () => {
Loadable.preloadReady().then(() => {
ReactDOM.hydrate(
AppBundle,
document.getElementById('root')
);
});
};
app.js ("/" отображает компонент Home)
[...]
export default withCookies(App);
[...]
home.js
[...]
export default connect(mapStateToProps)(Home);
[...]