Node 代码实现

https://www.yuque.com/easy-team/egg-react/node

  • 在 Node 服务端运行 jsbundle,并渲染成完整的 HTML 内容返回给客户端
  • 使用 ctx.render 进行 React 服务端渲染,文件名为 Webpack entry 文件名,对应文件为 app/view 目录
  • ctx.render 渲染时,默认渲染失败会自动降级为客户端渲染模式

app/controller/render.ts 代码

  1. import { Controller, Context } from '@easy-team/res';
  2. export default class AdminController extends Controller {
  3. public async reactServerRender() {
  4. const { ctx } = this;
  5. // home.js 为 webpack 构建后的 JSBundle 名字,也就是对应 webpack entry 名字
  6. await ctx.render('home.js', {
  7. title: 'React Server Render',
  8. text: 'Egg + React + TypeScript + Webpack Server Side Render'
  9. });
  10. }
  11. }

app/router.ts 代码
  app.get('/ssr', app.controller.render.reactServerRender);

前端代码实现

${root}/app/web/page/react-server-render/index.tsx

import React, { Component } from 'react';
import Layout from '../../component/layout';
import { SSR } from '../../framework/app';

class Index extends Component {
  componentDidMount() {
    console.log('render');
  }
  render() {
    return <Layout>
      <h1>{this.props.text}</h1>
      <h1><a href="/csr">React Client Render</a></h1>
      <h1><a href="/nun">React + Nunjucks Client Render</a></h1>
    </Layout>;
  }
}

export default SSR(Index);

构建配置实现

${root}/config/res.config.js


const path = require('path');
module.exports = {
  entry: {
    home: 'app/web/page/home/index.tsx'
  }
}