React server side render solution for egg
$ npm i egg-view-react-ssr --save
// {app_root}/config/plugin.js exports.reactssr = { enable: true, package: 'egg-view-react-ssr', };
- node version > 8
- config
reactssr.layout
defaultapp/view/layout.html
- support react stateless component render (not support promise function callback)
- node version > 6
- config
reactssr.layout
defaultapp/view/layout.js
- support promise function callback(not support react stateless component render)
egg-view-react-ssr depends on egg-view-react plugin
// {app_root}/config/config.default.js exports.reactssr = { // doctype: '<!doctype html>', // layout: path.join(app.baseDir, 'app/view/layout.html'), // manifest: path.join(app.baseDir, 'config/manifest.json'), // injectHeadRegex: /(<\/head>)/i, // injectBodyRegex: /(<\/body>)/i, // injectCss: true, // injectJs: true, // crossorigin: false, // injectRes: [], // mergeLocals: true, // fallbackToClient: true, // fallback to client rendering if server render failed // afterRender: (html, context) => { /* eslint no-unused-vars:off */ // return html; // }, };
see config/config.default.js for more detail.
when server render bundle error, will try client render**
// controller/home.js module.exports = app => { return class IndecController extends app.Controller { async index(ctx) { // home.js: webpack builded ssr entry jsbundle file await ctx.render('home.js', { message: 'egg react server side render'}); } }; };
when client render, render layout
exports.reactssr.layout
by React
// controller/home.js module.exports = app => { return class IndecController extends app.Controller { async index(ctx) { // home.js: webpack builded client render entry jsbundle file await ctx.renderClient('home.js', { message: 'egg react client side render'}); } }; };
- when asset render, you can render layout
exports.reactssr.layout
by viewEngine, default useegg-view-nunjucks
- you must install the specified engine dependence, such as
egg-view-nunjucks
oregg-view-ejs
- The context provides an
asset
object that can getjs
,css
,state
information. layout template
// controller/home.js module.exports = app => { return class IndecController extends app.Controller { async index(ctx) { // home.js: webpack builded client render entry jsbundle file await ctx.renderAsset('home.js', { message: 'egg react client asset render'}); } }; };
// controller/home.js module.exports = app => { return class IndecController extends app.Controller { async index(ctx) { // home.js: webpack builded client render entry jsbundle file await ctx.renderAsset('home.js', { message: 'egg react client asset render'}, { viewEngine: 'ejs' }); } }; };
-
React Server Side Render egg-react-webpack-boilerplate
-
React TypeScript Server Side Render egg-react-typescript-boilerplate
-
React SSR Framework Example for Egg res-awesome
Please open an issue here.