Skip to content

Commit db26bca

Browse files
pho3nixf1rerichardscarrott
authored andcommitted
Allow a custom server handler to wrap the server renderer. (#40)
1 parent 585b4c7 commit db26bca

File tree

7 files changed

+105
-17
lines changed

7 files changed

+105
-17
lines changed

example/index.js example/express/index.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ const express = require('express');
22
const webpack = require('webpack');
33
const webpackDevMiddleware = require('webpack-dev-middleware');
44
const webpackHotServerMiddleware = require('webpack-hot-server-middleware');
5-
const config = require('./webpack.config.js');
5+
const config = require('../webpack.config.js');
66
const app = express();
77

88
const compiler = webpack(config);

example/server.js example/express/server.js

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
const React = require('react');
22
const renderToString = require('react-dom/server').renderToString;
3-
const App = require('./components/App');
3+
const App = require('../components/App');
44

55
module.exports = function serverRenderer({ clientStats, serverStats, foo }) {
66
return (req, res, next) => {

example/koa/index.js

+48
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
const Koa = require('koa');
2+
const webpack = require('webpack');
3+
const webpackDevMiddleware = require('webpack-dev-middleware');
4+
const webpackHotServerMiddleware = require('webpack-hot-server-middleware');
5+
const config = require('../webpack.config.js');
6+
const app = new Koa();
7+
8+
// Must point to the koa server renderer.
9+
config[1].entry = './koa/server';
10+
11+
const compiler = webpack(config);
12+
13+
function koaDevware(dev, compiler) {
14+
const waitMiddleware = () =>
15+
new Promise((resolve, reject) => {
16+
dev.waitUntilValid(() => resolve(true));
17+
compiler.plugin('failed', error => reject(error));
18+
});
19+
20+
return async (ctx, next) => {
21+
await waitMiddleware();
22+
await dev(
23+
ctx.req,
24+
{
25+
end(content) {
26+
ctx.body = content;
27+
},
28+
setHeader: ctx.set.bind(ctx),
29+
locals: ctx.state,
30+
},
31+
next
32+
);
33+
};
34+
}
35+
36+
app.use(koaDevware(webpackDevMiddleware(compiler, {
37+
noInfo: true
38+
})));
39+
app.use(webpackHotServerMiddleware(compiler, {
40+
createHandler: webpackHotServerMiddleware.createKoaHandler,
41+
serverRendererOptions: {
42+
foo: 'Bar'
43+
}
44+
}));
45+
46+
app.listen(6060, () => {
47+
console.log('Server started: http://localhost:6060/');
48+
});

example/koa/server.js

+22
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
const React = require('react');
2+
const renderToString = require('react-dom/server').renderToString;
3+
const App = require('../components/App');
4+
5+
const serverRenderer = ({ clientStats, serverStats, foo }) =>
6+
async (ctx, next) => {
7+
ctx.body = `
8+
<!doctype html>
9+
<html>
10+
<head>
11+
<title>${foo}</title>
12+
</head>
13+
<body>
14+
<div id="root">${renderToString(React.createElement(App))}</div>
15+
<script src="/client.js"></script>
16+
</body>
17+
</html>
18+
`;
19+
await next();
20+
}
21+
22+
module.exports = serverRenderer;

example/package.json

+9-6
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,20 @@
44
"description": "Example usage of webpack-hot-server-middleware",
55
"main": "index.js",
66
"scripts": {
7-
"start": "node index.js",
7+
"start": "npm run start:express",
8+
"start:express": "node express/index.js",
9+
"start:koa": "node koa/index.js",
810
"test": "echo \"Error: no test specified\" && exit 1"
911
},
1012
"author": "",
1113
"license": "MIT",
1214
"dependencies": {
13-
"express": "^4.14.0",
14-
"react": "^15.3.2",
15-
"react-dom": "^15.3.2",
16-
"webpack": "^1.13.2",
17-
"webpack-dev-middleware": "^1.8.3",
15+
"express": "^4.16.2",
16+
"koa": "^2.3.0",
17+
"react": "^16.0.0",
18+
"react-dom": "^16.0.0",
19+
"webpack": "^3.7.1",
20+
"webpack-dev-middleware": "^1.12.0",
1821
"webpack-hot-server-middleware": "file:../"
1922
}
2023
}

example/webpack.config.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -15,12 +15,12 @@ module.exports = [
1515
}, {
1616
name: 'server',
1717
target: 'node',
18-
entry: './server',
18+
entry: './express/server',
1919
output: {
2020
path: dist,
2121
filename: 'server.js',
2222
libraryTarget: 'commonjs2'
2323
},
2424
devtool: 'source-map'
2525
}
26-
];
26+
];

src/index.js

+22-7
Original file line numberDiff line numberDiff line change
@@ -6,9 +6,26 @@ const requireFromString = require('require-from-string');
66
const MultiCompiler = require('webpack/lib/MultiCompiler');
77
const sourceMapSupport = require('source-map-support');
88

9+
const createConnectHandler = (error, serverRenderer) => (req, res, next) => {
10+
debug(`Receive request ${req.url}`);
11+
if (error) {
12+
return next(error);
13+
}
14+
serverRenderer(req, res, next);
15+
};
16+
17+
const createKoaHandler = (error, serverRenderer) => (ctx, next) => {
18+
debug(`Receive request ${ctx.url}`);
19+
if (error) {
20+
ctx.throw(error);
21+
}
22+
return serverRenderer(ctx, next);
23+
};
24+
925
const DEFAULTS = {
1026
chunkName: 'main',
11-
serverRendererOptions: {}
27+
serverRendererOptions: {},
28+
createHandler: createConnectHandler,
1229
};
1330

1431
function interopRequireDefault(obj) {
@@ -129,13 +146,11 @@ function webpackHotServerMiddleware(multiCompiler, options) {
129146
}
130147
});
131148

132-
return (req, res, next) => {
133-
debug(`Receive request ${req.url}`);
134-
if (error) {
135-
return next(error);
136-
}
137-
serverRenderer(req, res, next);
149+
return function () {
150+
return options.createHandler(error, serverRenderer).apply(null, arguments);
138151
};
139152
}
140153

154+
Object.assign(webpackHotServerMiddleware, { createConnectHandler, createKoaHandler });
155+
141156
module.exports = webpackHotServerMiddleware;

0 commit comments

Comments
 (0)