很久之前写的一个项目https://github.com/wangxiaofeid/reactServerRender
技术栈
webpack express react react-router mobx less等
遇到的一些问题
- 服务端渲染出来的html和客户端第一次渲染的html不一致是会有警告
- mobx的store转化成json时不能深度解析,使用mobx.toJS(store, true)也不行,自己做了层转化
- 服务端使用match后,客户端也要使用match,不然渲染出来的html不一致,会有警告
- 客户端使用match后点击其他页面后,html修改了url不改变的问题,使用mobx-react-router里的RouterStore,再对react-router的Link做一层封装,具体看代码
简单说下怎么做的
- 每个页面有一个store,store都有一个init方法,一个isLoad标记是否初始化
- 每个页面入口的componentDidMount方法里调用页面pageStore.init()
- init方法内返回promise,请求全部成功返回后设置isLoad=true
- 从后端到前端的流程是:
- 后端收到请求
- 匹配路由
- await pageStore.init() 等待页面数据返回
- 渲染模板,并把store数据塞到html
- 前端js执行,初始化store,把window下数据初始化到各个pageStore
- 渲染页面component
- 执行pageStore.init(),判断是否已经初始化了
- end