@shopify/react-server
Version:
Utilities for React server-side rendering
53 lines (50 loc) • 1.73 kB
JavaScript
import 'cross-fetch';
import Koa from 'koa';
import compose from 'koa-compose';
import mount from 'koa-mount';
import { ping } from '../ping/ping.mjs';
import { requestLogger } from '../logger/logger.mjs';
import { metricsMiddleware } from '../metrics/metrics.mjs';
import { createRender } from '../render/render.mjs';
const logger = console;
/**
* Create a full Koa server for server rendering an `@shopify/react-html` based React application defined by `options.render`
* @param options
* @returns a Server instance
*/
function createServer(options) {
const {
/* eslint-disable no-process-env */
ip = process.env.REACT_SERVER_IP && process.env.REACT_SERVER_IP !== 'undefined' ? process.env.REACT_SERVER_IP : '0.0.0.0',
port = process.env.REACT_SERVER_PORT && process.env.REACT_SERVER_PORT !== 'undefined' ? parseInt(process.env.REACT_SERVER_PORT, 10) : 8081,
// a default is set in sewingKitMiddleware
assetPrefix = process.env.CDN_URL && process.env.CDN_URL !== 'undefined' ? process.env.CDN_URL : undefined,
render,
renderError,
renderRawErrorMessage = process.env.NODE_ENV === 'development',
/* eslint-enable no-process-env */
serverMiddleware,
assetName,
htmlProps,
proxy = false,
app = new Koa()
} = options;
app.proxy = proxy;
app.use(mount('/services/ping', ping));
app.use(requestLogger);
app.use(metricsMiddleware);
if (serverMiddleware) {
app.use(compose(serverMiddleware));
}
app.use(createRender(render, {
assetPrefix,
assetName,
renderError,
renderRawErrorMessage,
htmlProps
}));
return app.listen(port, ip, () => {
logger.log(`started react-server on ${ip}:${port}`);
});
}
export { createServer };