发布历史

https://github.com/easy-team/egg-react-webpack-boilerplate/blob/master/CHANGELOG.md

版本特性

egg-view-react-ssr

发布 egg-view-react-ssr@3.0.0 和 egg-webpack-react@3.0.0 插件,主要包括:

  • Node 最低版本为 8 ( 2.x.x 最低版本为 6)
  • React SSR 支持 asyncData Hook 模式,不再支持 Promise Callback 方式
  • React SSR 支持 Statelss Component 渲染
  • egg-view-react-ssr 配置 layout 配置由 layout.js 改成 layout.html
  • 升级 egg-react 相关骨架, 相关案例见 egg-react-webpack-boilerplate

egg-view-react-ssr 标准化 render 和简化 asyncData 方式

egg-view-react-ssr 3.x.x 插件 Stateless Component SSR 支持

  1. import React, { Component } from 'react';
  2. export default (props) => {
  3. return <div>
  4. <div className="main">
  5. <div className="page-container page-component">
  6. <h1>{props.text}</h1>
  7. </div>
  8. </div>
  9. </div>;
  10. };

egg-view-react-ssr 3.x.x 插件 asyncData 数据请求支持

  1. egg-view-react-ssr 3.x.x 版本时,React SSR 组件直接定义 static asyncData function 方式实现异步逻辑调用(React Render 时,会检测是否存在 asyncData 方法),egg-view-react-ssr 2.x.x 插件 Callback Promise 方式不再支持,请用 asyncData 模式改造支持。代码大概如下:
  1. import React, { Component } from 'react';
  2. class AsyncDataMode extends Component {
  3. static async asyncData(locals) {
  4. const res = await axios.get('/test/api/article');
  5. return res.data;
  6. }
  7. render() {
  8. const { title, article } = this.props;
  9. return <div>
  10. <h1 className="easy-article-detail-title">{title}</h1>
  11. <h2 className="easy-article-detail-title">{article.title}</h2>
  12. <div className="easy-article-info">
  13. <iframe src={article.url} frameBorder="0" width="100%" style={{minHeight: '800px'}}></iframe>
  14. </div>
  15. </div>;
  16. }
  17. }
  18. export default AsyncDataMode;

egg-view-react-ssr 2.x.x 插件 Callback Promise 数据请求逻辑

在 egg-view-react-ssr 2.x.x 版本时,React SSR 入口时是通过 callback 返回 Promise 方式实现异步逻辑调用,代码大概如下:

  1. server(config) {
  2. return context => {
  3. const { Entry, createRouter, createStore } = config;
  4. const url = context.state.url;
  5. const router = createRouter();
  6. const matchRoute = matchRoutes(router, url);
  7. const promises = matchRoute.map(({ route }) => {
  8. const asyncData = route.component.asyncData;
  9. return asyncData instanceof Function ? asyncData(context, route) : Promise.resolve(null)
  10. });
  11. return Promise.all(promises).then(list => {
  12. const data = list.reduce((item, result) => {
  13. return Object.assign(result, item);
  14. }, {});
  15. Object.assign(context.state, data);
  16. const store = createStore(context.state);
  17. return () => {
  18. return <Provider store={store}>
  19. <StaticRouter location={url} context={{}}>
  20. <Entry url={url} />
  21. </StaticRouter>
  22. </Provider>
  23. }
  24. });
  25. };
  26. }

easywebpack 体系通过 @easy-team 模式内置 Babel 7 方案

骨架分支: master,版本 4.6.0

  • @easy-team/easywebpack 提供内置 babel 7 升级方案,主要修改如下:
    • easywebpack-cli > @easy-team/easywebpack@^4.0.0
    • easywebpack-react > @easy-team/easywebpack-react@^4.0.0
    • .babelrc 配置升级为 babel 7 配置 babel.config.js

Egg + React + Nunjucks 自定义纯前端渲染方案支持

骨架分支: feature/green/html