react server rendering(服务端渲染)

作者: JasonFF | 来源:发表于2016-05-25 17:05 被阅读1937次

一个react项目在服务器端渲染,其实最本质的一个点就在于路由。路由一般采用的是react-router。其实在react-router里,它本身就提供了服务器端渲染的方法,下面对它进行一下小小的学习。

服务端渲染跟客户端渲染有点不同,因为,服务端渲染需要发送500/30x,还要在渲染前就要请求数据。

react-router提供了两个更底层的api,一个是match,另一个是RouterContext

match是用来匹配路由的,但是它没有渲染的功能。
RouterContext用来同步渲染components的。

看个例子:

import { renderToString } from 'react-dom/server'
import { match, RouterContext } from 'react-router'
import routes from './routes'
serve((req, res) => {
    match({ routes, location: req.url }, (error, redirectLocation, renderProps) => { 
        if (error) { 
            res.status(500).send(error.message) 
        } else if (redirectLocation) { 
            res.redirect(302, redirectLocation.pathname + redirectLocation.search) 
        } else if (renderProps) {
            res.status(200).send(renderToString(<RouterContext {...renderProps} />)) 
        } else { 
            res.status(404).send('Not found') 
        } 
    })
})

这是一个非常简单的在服务端渲染例子,但是现在一个最重要的问题,就是如何传数据呢?

在react项目中,一般是用redux来进行数据的管理的。redux 里有个store维护的state状态树。那么在和api进行数据交互的时候,如何将数据放在store里面呢?

基本的思路就是,在createStore的时候,将与api交互的方法同时传入进去,这样,在store中的action可以调用那个库。调用库去请求数据,一般是个promise对象,取到数据之后,然后在reducer中将数据reduce进state树中。就完成了这个过程。

其实最最本质的,就是让action能去api请求数据,只要action请求到了数据并且能进入reducer,那就成功了。这个思路跟客户端渲染也没有什么区别。

在服务端渲染还有一个致命的报错。来自于webpack。

在client,webpack可以require()各种静态资源,但是在node 环境中,require()是只能用于javascript 的。

这里就要靠一个library了。
webpack-isomorphic-tools
具体的介绍在github中都有,也不在这里赘述。

另外再向大家推荐一个完整的react例子,里面有很多很多东西可以参考借鉴,甚至可以直接拿过来做自己的项目。
react栗子

相关文章

网友评论

    本文标题:react server rendering(服务端渲染)

    本文链接:https://www.haomeiwen.com/subject/gernrttx.html