可以在服务器渲染上使用reduce进程调度?

我有一个使用redux-router工作的客户端应用程序。 我从我的api调度user页面的初始状态。

我的路线文件:

 export default function ({ dispatch, getState }) { function getUser(nextState, replaceState) { dispatch(getUserData(nextState.params.id)); } return ( <Route path="/" component={App}> <Route path="user/:id" component={User} onEnter={getUser}/> <Route path="*" component={NoMatch}/> </Route> ); } } 

所以在客户端它工作得很好。 在getUserData派发返回数据之后,我希望将我的标记呈现为string。

这是我的服务器匹配和渲染(从官方服务器渲染的例子):

 app.use((req, res) => { const store = reduxReactRouter({ routes, createHistory: createMemoryHistory })(createStore)(reducer); const query = qs.stringify(req.query); const url = req.path + (query.length ? '?' + query : ''); store.dispatch(match(url, (error, redirectLocation, routerState) => { if (error) { console.error('Router error:', error); res.status(500).send(error.message); } else if (redirectLocation) { res.redirect(302, redirectLocation.pathname + redirectLocation.search); } else if (!routerState) { res.status(400).send('Not Found'); } else { res.status(200).send(getMarkup(store)); } })); }); 

使用onEnter时可以使用这个工作吗? 还是只在浏览器上触发?

将不胜感激任何帮助家伙! 谢谢

我不明白 – 我假设getUser是asynchronous的,渲染在React中总是同步的。 你必须提前获取数据。 依靠onEnter是一个不错的主意,但它不会工作。

基本上…

首先:你需要公开你的抓取数据的方法,这样可以在服务器之外调用它们。 action / dispatcher / store在请求/响应列表中不能正常工作,并确保你有一个带有API调用的文件。

第二:把所有的路由放到一个JSON文件中,React Router(或者任何路由器)读取JSON,并且把路由添加到一个循环中,服务器端的代码读取这些路由并且添加指向该方法中,JSON中的每个路由还包含对组件实际初始渲染(什么是asynchronous调用)需要的数据的引用。 你创build一个初始状态对象的空副本,expression方的每个处理程序执行对相关API方法(从JSON)的所有调用,并且当Promise.allparsing“获取数据并将其填入状态”解决你的渲染,

渲染现在包含相关数据。

第三,你需要弄清楚如何将状态传递给服务器,用户如何login,他们可以做什么等等 – 我build议让第二台服务器充当caching,因为在React中渲染是CPU绑定的,所以你需要caching。 我们根据路由,用户状态,设备和其他一些基本的东西进行caching。

第四,将非呈现服务器(高速caching)指向呈现请求和转发请求,希望请求应该打到caching,只有当以下情况发生时,您需要将非呈现服务器“退回”客户端呈现渲染服务器失败。 这也可以让你在部署时“热切换”渲染服务器。

您还需要一些方法来从渲染服务器提供JavaScript本身(所以只有一个事实来源),这不应该是太大的问题。

stream程中有很多更细腻的部分 – 但是这几乎是我们如何做的,我们有亚秒级的完整渲染,我认为这很好。 当我们的网站大部分是Angular并在客户端呈现的时候,从5秒下来。