UNPKG

@computerrock/toolchain-react-app

Version:

The Formation Framework template for starting react app project.

58 lines (48 loc) 1.95 kB
'use strict'; const createIndexRenderer = require('./lib/createIndexRenderer'); const requireServerExports = require('./lib/requireServerExports'); /** * Webpack universal app middleware */ module.exports = function webpackUniversalAppMiddleware(compiler, options = {}) { options = { index: undefined, inject: false, server: 'server', client: 'client', ...options, }; const isMultiple = !!compiler.compilers; let serverCompiler = compiler; let clientCompiler = compiler; if (isMultiple) { serverCompiler = compiler.compilers.find(compiler => compiler.name === options.server); clientCompiler = compiler.compilers.find(compiler => compiler.name === options.client); } return async function middleware(req, res, next) { const webpackStats = res.locals.webpackStats.toJson(); let serverStats = webpackStats; let clientStats = webpackStats; if (isMultiple) { serverStats = webpackStats.children.find(compilation => compilation.name === options.server); clientStats = webpackStats.children.find(compilation => compilation.name === options.client); } // load index.html template file const indexRenderer = await createIndexRenderer(clientCompiler, clientStats, options.index); // require server exports const {render} = await requireServerExports(serverCompiler, serverStats); const context = {}; render(req, res, context) .then(({htmlContent, preloadedState}) => { if (context.url) { res.writeHead(301, { Location: context.url }); res.end(); } else { res.write(indexRenderer.renderString(htmlContent, preloadedState)); res.end(); } }); }; };