【发布时间】:2016-07-08 14:50:05
【问题描述】:
我想使用 react 的服务器端渲染来仅获取用户的初始状态。之后,我更喜欢使用 websockets/ajax/客户端路由来处理应用程序。
这是我目前所拥有的
function handleRender(req,res){
getInitialState(id_token)
.then(function(initialState){
const store = createStore(rootReducer,initialState)
console.log('store.getState() ',store.getState())
const html = renderToString(
<Provider store={store}>
<App/>
</Provider>
)
res.send(renderFullPage(html,initialState))
})
.catch(function(err){
console.log('error')
})
}
const renderFullPage = (html,initialState) => {
return `
<!doctype html>
<html>
<head>
<title>Redux Universal</title>
</head>
<body>
<div id="app"><div>${html}</div></div>
<script>
window.__INITIAL_STATE__= ${JSON.stringify(initialState)}
</script>
<script src="/bundle.js"></script>
</body>
</html>`
}
我的客户端 index.js 非常标准
const initialState = window.__INITIAL_STATE__
export const store = createStore(rootReducer,initialState)
ReactDOM.render(
<Provider store={store}>
<Router history={browserHistory}>
<Route path="/" component={App} />
<Route path ="/project" component={Project} />
</Router>
</Provider>
,document.getElementById('app')
)
上面的效果很好。当我导航到客户端的 /project 时。 Project 组件呈现。
但是,当我在 /project 刷新页面时,我会在客户端路由器移动到 /project 之前快速呈现 / 页面。
另外,每当我在路由之间切换时,我都会再次访问我不想要的服务器。
我知道这应该发生,因为刷新再次命中服务器导致它发回
<Provider store={store}>
<App/>
</Provider>
渲染 app 组件,之后 react-router 再次渲染 /project 组件。
有没有一种方法可以让我从服务器获取window.__INITIAL_STATE__ 和初始 HTML,而不必在每次刷新/路由更改时发送 html。
我不想在每次路由更改时都访问服务器,这是我相信的普遍反应。
对我来说最重要的是在页面加载时为用户获取初始状态。我更喜欢将应用程序用作水疗中心(仅针对初始渲染/状态和 api 请求访问服务器)
【问题讨论】:
-
handleRender在哪里被调用? -
“另外,每当我在路由之间切换时,我都会再次访问我不想要的服务器。”。请为我澄清这一点。带有 react-router 的 SPA 和其中的链接不会导致窗口刷新,也不会“在每次路由更改时访问服务器”
-
@idbehold - handlerender 设置为快速中间件 -
app.use(handleRender) -
@Yozi - 由于某种原因,路由更改正在影响服务器:( .. 你认为这可能是因为我没有渲染路由器上下文以及初始状态吗?
-
@Kunkka,我认为这可能是一个严重错误或类似的错误,请在控制台中检查。你的客户端渲染看起来是正确的,我的差不多
标签: javascript reactjs react-router