react-universally
Version:
A starter kit for universal react applications.
77 lines (64 loc) • 2.29 kB
JavaScript
import express from 'express';
import createWebpackMiddleware from 'webpack-dev-middleware';
import createWebpackHotMiddleware from 'webpack-hot-middleware';
import ListenerManager from './listenerManager';
import { log } from '../utils';
class HotClientServer {
constructor(compiler) {
const app = express();
const httpPathRegex = /^https?:\/\/(.*):([\d]{1,5})/i;
const httpPath = compiler.options.output.publicPath;
if (!httpPath.startsWith('http') && !httpPathRegex.test(httpPath)) {
throw new Error(
'You must supply an absolute public path to a development build of a web target bundle as it will be hosted on a seperate development server to any node target bundles.',
);
}
// eslint-disable-next-line no-unused-vars
const [_, host, port] = httpPathRegex.exec(httpPath);
this.webpackDevMiddleware = createWebpackMiddleware(compiler, {
quiet: true,
noInfo: true,
headers: {
'Access-Control-Allow-Origin': '*',
},
// Ensure that the public path is taken from the compiler webpack config
// as it will have been created as an absolute path to avoid conflicts
// with an node servers.
publicPath: compiler.options.output.publicPath,
});
app.use(this.webpackDevMiddleware);
app.use(createWebpackHotMiddleware(compiler));
const listener = app.listen(port, host);
this.listenerManager = new ListenerManager(listener, 'client');
compiler.plugin('compile', () => {
log({
title: 'client',
level: 'info',
message: 'Building new bundle...',
});
});
compiler.plugin('done', (stats) => {
if (stats.hasErrors()) {
log({
title: 'client',
level: 'error',
message: 'Build failed, please check the console for more information.',
notify: true,
});
console.error(stats.toString());
} else {
log({
title: 'client',
level: 'info',
message: 'Running with latest changes.',
notify: true,
});
}
});
}
dispose() {
this.webpackDevMiddleware.close();
return this.listenerManager ? this.listenerManager.dispose() : Promise.resolve();
}
}
export default HotClientServer;