【发布时间】:2016-06-28 11:30:07
【问题描述】:
Server side rendering with react-router 该文档不足以理解如何使用 react-router 2 在服务器端呈现具有不同类型 http 请求(如 get、post、put 等)的 react 组件。
【问题讨论】:
标签: javascript express reactjs react-router react-router-component
Server side rendering with react-router 该文档不足以理解如何使用 react-router 2 在服务器端呈现具有不同类型 http 请求(如 get、post、put 等)的 react 组件。
【问题讨论】:
标签: javascript express reactjs react-router react-router-component
详细编写如何在服务器端渲染 react 和 react-router 应用程序可能是一个非常大的话题。
我假设您是经验丰富的用户,并且您知道如何使用 expressjs 以及如何创建 react 和 react-router 应用程序。
当您渲染服务器端时,您可以创建单独的服务器路由器来映射每个前端路由或创建一个将采用所有 url。
后一种情况只需要一个服务器路由器。 在服务器路由器底部的某处(在错误路由之前)写:
app.use('/*', function(req, res){ ... });
这条路线会捕获所有的 url。
首先我们需要有关 url 的信息。我们不需要有关协议或域的信息,因此我们只需要这个:
var url = req.originalUrl;
我们从以下获得的方法信息(POST、GET、PUT、DELETE):
var method = req. method
如果您愿意,您可以制作单独的路线,您将拥有:
app.post('/something', function(req, res) {...});
app.get('/something', function(req, res) {...});
没关系。
第二件事,我们不为 react-router 使用浏览器历史记录!我们必须使用内存历史。
你的历史对象:
var history = createMemoryHistory(req.originalUrl || '/');
然后你将历史对象传递给路由器。
我喜欢创建我的根组件来接受作为参数历史对象。 当我在前端使用它时,我传递浏览器历史记录,当我在服务器渲染中使用它时,我传递内存历史记录。
下面是一个非常简单的示例,服务器端渲染路线的外观 (我也使用了 ejs 模板):
router.use('/*', function(req, res){
var history = createMemoryHistory(req.originalUrl || '/');
var initialState = {};
//do something with initialState according to url and request method
var staticHTML = ReactDOMServer.renderToString(
React.createFactory(App)({
history,
initialState
})
);
res.render('index', {
staticHTML,
initialState: JSON.stringify(initialState)
});
});
在此示例中,您需要根据用户 url 和请求方法填充 initState。您的应用应该开始使用该初始化数据。
如果您使用 redux,服务器端渲染也可以像魅力一样工作。因为我们有一个 store 和一个 init 状态对象。然后,您可以在渲染期间传递任何基本值。 例如,当您渲染对象列表时,您将其放入前端并传递到初始化状态然后渲染。然后渲染的页面会有值。
我正在使用 react+react-router+redux+redux-react-router+expressjs 示例,它还没有完全准备好但是可以工作,你可以看到我是如何解决服务器渲染的:
【讨论】: