react SSR
使用: 第一次:
- git clone git@github.com:shimeng28/react-ssr.git
- npm install
- npm run dev-build
- npm run dev
- 浏览器打开 http://localhost:9527/
之后每次需要执行 npm run dev命令即可
目录作用:
- /api/ API接口实现目录
- /build/ 编译代码目录
1. /build/client/ 客户端代码
2. /build/dll/ dll文件
3. /build/server/ 服务端代码
- /config/ 配置文件目录
- /src/ 源代码目录
- /webpack/ webpack打包构建文件
技术栈 webpack + React + react-router + Redux + Redux-thunk + axios + koa2
实现原理:
-
react-router-dom作为前后端路由,通过react-router-config支持多级路由
-
利用reactDom.renderToString在服务端生产HTML字符串,在浏览器通过ReactDom.hydrate将React代码重新执行一边
-
axios在浏览器和服务端各生成一个实体作为网络请求,通过react-thunk的withExtraArgument方法将请求实体分别传给浏览器端代码和服务端代码。
-
页面数据通过loadData方法在服务端请求数据,生成后注入到HTML中,放到了window.context,作为浏览器端store的默认数据。
-
浏览器端代码会在ComponentDidMount检查,页面数据不存在时会再次请求。这是因为只有第一次页面请求是SSR渲染,之后在浏览器中的跳转都是单页应用的形式
-
css有两种解决方案,一种是server端打包的时候通过isomorphic-style-loader处理CSS,之后可以通过_getCss方法获取CSS字符串,将css字符串赋值给 context,之后在node返回给前端的时候注入到html中。另一种是通过MiniCssExtractPlugin将CSS抽离出单独到文件,在服务端将Css以link的形式注入到使用HtmlWebpackPlugin生成的html文件中并返回给前端。这里使用的是第二种。
-
使用react-loadable实现按需加载,将分割的代码文件css文件以link, js通过script的方式插入到html中。在浏览器中会通过jsonp的方式加载代码。
支持:
-
支持redux数据流。
-
webpack支持静态资源,字体,图片,支持Less的打包、支持source-map、支持code spliting, 支持js, css按需加载,支持webpack DLL
-
添加eslint校验,并且添加了git commit hooks
遇到的坑: MiniCssExtractPlugin 在服务端会报错,document未定义。解决方法: 写一个子类继承MiniCssExtractPlugin,重写 getCssChunkObject方法