Skip to content

love-everyday/ReactSSR

Repository files navigation

该项目的目的是为了研究React Server-Side Render
使用SPA单页面应用过程,发现有以下几个缺点:

  • 首屏加载时间过长,受网络和设备性能的影响非常严重;
  • 如果应用在微信用使用,还会出现history模式、hash模式和微信浏览器的兼容问题;
  • 单页面应用可能无法满足产品的SEO需求; 为以后项目可能会需要SSR,开发该demo用于技术调研。

技术选型:

  • Fastify: 由于ExpressKoa的创始人 tj 不再参与这两个开源项目开发,后续也没有组织接手,所以目前更新进度非常缓慢,而阿里的Egg也是不错的选择,上手容易,项目架构也非常好。而本人则采用Fastify,一个是主要开源作者两人都是大牛,二个是想看一下有哪些好的设计思想。
  • React:选择React的目的则是,感觉React的设计初衷就是负责View,这对SSR会更加友善一点;使用单向数据流也能降低开发难度;
  • webpack-dev-middlewarewebpack-hot-middleware:这是两个webpack工具,目的是在开发环境下,项目的代码热更新和浏览器热加载;
  • chokidar:最开始使用的是nodemon,实现Server的自动重启;但发现webpack-dev-middlewarenodemon会发生兼容问题;如果修改webpack监听打包的文件,则只会触发webpack-dev-middleware,导致服务器renderToString渲染出来的html内容与客户端js重新生成的界面不一致;如果修改服务器端的代码,则只会触发nodemon,服务器自动重启,webpack会重新打包,相率降低;所以重新选择了chokidar来监听文件的修改,然后通过删除require.cache中对应的引用,从而实现不重启服务器,热更新服务器代码;
  • react-loadable:使用react-loadable的目的是,一是为了通过dynamic import来分割代码,并实现界面的懒加载;二是为了在renderToString后,获取到懒加载界面的jscss的bundles,然后添加到html内容中发送给浏览器,从而使界面加载显示更平滑;

在线实例

demo

使用方法

Development

npm run dev

Deployment

npm run babel
npm run start