Skip to content

Commit

Permalink
refactor: break rendering pipeline into steps (#2)
Browse files Browse the repository at this point in the history
  • Loading branch information
artkravchenko committed Jul 15, 2018
1 parent c3a7459 commit 0d854ff
Show file tree
Hide file tree
Showing 5 changed files with 60 additions and 18 deletions.
4 changes: 2 additions & 2 deletions packages/web-ssr-server/src/app.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
import express from 'express';
import path from 'path';

import { renderMiddleware } from './services/render';
import { createRenderMiddleware } from './services/render';

// logging
// cors
Expand Down Expand Up @@ -51,7 +51,7 @@ function createApplication() {
}
}

app.get('*', renderMiddleware);
app.get('*', createRenderMiddleware());

return app;
}
Expand Down
15 changes: 15 additions & 0 deletions packages/web-ssr-server/src/services/render/assets.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
const isDevServerEnabled = process.env.WEBPACK_ENABLE_DEV_SERVER === '1';

export function getAssets() {
let scripts;

if (isDevServerEnabled) {
scripts = ['/assets/vendor.js', '/assets/app.js'];
} else {
scripts = ['/assets/app.js'];
}

return {
scripts,
};
}
45 changes: 29 additions & 16 deletions packages/web-ssr-server/src/services/render/index.js
Original file line number Diff line number Diff line change
@@ -1,25 +1,38 @@
function getAssets(isDevelopment) {
let scripts;
import { isPlainObject } from 'lodash';

if (isDevelopment) {
scripts = ['/assets/vendor.js', '/assets/app.js'];
} else {
scripts = ['/assets/app.js'];
import { getRenderingSteps } from './steps';

function extend(locals, val) {
// FIXME: ensure `val` is non-object or plain object
// (not an array or smth) statically to simplify the condition
if (!isPlainObject(val)) {
return locals;
}

return {
scripts,
};
return Object.assign({}, locals, val);
}

const isDevServerEnabled = process.env.WEBPACK_ENABLE_DEV_SERVER === '1';
function iterateRender(locals, steps, bag) {
if (!steps.length) {
return locals;
}

const res = steps[0](locals, bag);

export function renderMiddleware(req, res, next) {
if (res.headersSent) {
return next();
if (res && typeof res.then === 'function') {
return res.then(val => {
return iterateRender(extend(locals, val), steps.slice(1), bag);
});
}

return res.status(200).render('index', {
assets: getAssets(isDevServerEnabled),
});
return iterateRender(extend(locals, res), steps.slice(1), bag);
}

export function createRenderMiddleware() {
const steps = getRenderingSteps();

return (req, res, next) => {
const initialLocals = res.locals;
return iterateRender(initialLocals, steps, { req, res, next });
};
}
3 changes: 3 additions & 0 deletions packages/web-ssr-server/src/services/render/steps/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export function getRenderingSteps() {
return [require('./no-ssr').render];
}
11 changes: 11 additions & 0 deletions packages/web-ssr-server/src/services/render/steps/no-ssr.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
import { getAssets } from '../assets';

export function render(locals, bag) {
if (bag.res.headersSent) {
return;
}

return bag.res.status(200).render('index', {
assets: getAssets(),
});
}

0 comments on commit 0d854ff

Please sign in to comment.