Skip to content

Commit fdf0ec2

Browse files
committed
Merge pull request react-bootstrap#628 from react-bootstrap/docs-dev-workflow
Use webpack-dev-server instead of webpack-dev-middleware
2 parents a38c6be + 3134944 commit fdf0ec2

4 files changed

Lines changed: 108 additions & 32 deletions

File tree

docs/dev-run

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,78 @@
1+
#!/usr/bin/env babel-node
2+
/* eslint no-process-exit: 0 */
3+
import 'colors';
4+
import portfinder from 'portfinder';
5+
import { exec } from 'child-process-promise';
6+
7+
portfinder.basePort = 4000;
8+
9+
const SIGINT = 'SIGINT';
10+
let webpackDevServer;
11+
let docsServer;
12+
13+
function output(prefix, message) {
14+
let formattedMessage = message.trim().split('\n')
15+
.reduce((acc, line) => `${acc}${ acc !== '' ? '\n' : '' }${prefix} ${line}`, '');
16+
17+
console.log(formattedMessage);
18+
}
19+
20+
function listen({stdout, stderr}, name) {
21+
stdout.on('data', data => output(`[${name}] `.grey, data));
22+
stderr.on('data', data => output(`[${name}] `.grey, data));
23+
}
24+
25+
function shutdown() {
26+
if (webpackDevServer) {
27+
webpackDevServer.kill(SIGINT);
28+
}
29+
if (docsServer) {
30+
docsServer.kill(SIGINT);
31+
}
32+
}
33+
34+
function catchExec(name, err) {
35+
if (err.killed) {
36+
console.log('Shutdown: '.cyan + name.green);
37+
} else {
38+
console.log(`${name} -- Failed`.red);
39+
console.log(err.toString().red);
40+
}
41+
shutdown();
42+
}
43+
44+
console.log('Starting docs in Development mode'.cyan);
45+
46+
process.on(SIGINT, shutdown);
47+
48+
portfinder.getPorts(2, {}, (portFinderErr, [docsPort, webpackPort]) => {
49+
if (portFinderErr) {
50+
console.log('Failed to acquire ports'.red);
51+
process.exit(1);
52+
}
53+
54+
exec(`webpack-dev-server --quiet --config webpack.docs.js --color --port ${webpackPort}`)
55+
.progress(childProcess => {
56+
listen(childProcess, 'webpack-dev-server');
57+
webpackDevServer = childProcess;
58+
return;
59+
})
60+
.then(() => console.log('Shutdown: '.cyan + 'webpack-dev-server'.green))
61+
.catch(err => catchExec('webpack-dev-server', err));
62+
63+
exec('nodemon --exec babel-node docs/server.js', {
64+
env: {
65+
PORT: docsPort,
66+
WEBPACK_DEV_PORT: webpackPort,
67+
...process.env
68+
}
69+
})
70+
.progress(childProcess => {
71+
listen(childProcess, 'docs-server');
72+
docsServer = childProcess;
73+
return;
74+
})
75+
.then(() => console.log('Shutdown: '.cyan + 'docs-server'.green))
76+
.catch(err => catchExec('docs-server', err));
77+
});
78+

docs/server.js

Lines changed: 24 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,46 +1,40 @@
1+
import 'colors';
12
import React from 'react';
23
import express from 'express';
34
import path from 'path';
4-
import webpack from 'webpack';
5-
import webpackMiddleware from 'webpack-dev-middleware';
6-
import webpackConfigBuilder from '../webpack/webpack.config';
75
import Router from 'react-router';
86
import routes from './src/Routes';
7+
import httpProxy from 'http-proxy';
98

109
const development = process.env.NODE_ENV !== 'production';
10+
const port = process.env.PORT || 4000;
11+
1112
let app = express();
1213

1314
if (development) {
14-
let webpackConfig = webpackConfigBuilder({
15-
development: development,
16-
docs: true
17-
});
18-
let publicPath = webpackConfig.output.publicPath;
15+
let proxy = httpProxy.createProxyServer();
16+
let webpackPort = process.env.WEBPACK_DEV_PORT;
17+
let target = `http://localhost:${webpackPort}`;
1918

20-
webpackConfig.output.path = '/';
21-
webpackConfig.output.publicPath = undefined;
22-
webpackConfig.module.noParse = /babel-core\/browser/;
19+
app.get('/assets/*', function (req, res) {
20+
proxy.web(req, res, { target });
21+
});
2322

24-
app = app
25-
.use(webpackMiddleware(webpack(webpackConfig), {
26-
noInfo: false,
27-
publicPath: publicPath,
28-
stats: {
29-
colors: true
30-
}
31-
}))
32-
.use(function renderApp(req, res) {
33-
Router.run(routes, req.url, Handler => {
34-
let html = React.renderToString(<Handler />);
35-
res.send(html);
36-
});
23+
app.use(function renderApp(req, res) {
24+
Router.run(routes, req.url, Handler => {
25+
let html = React.renderToString(<Handler />);
26+
res.send(html);
3727
});
28+
});
29+
30+
proxy.on('error', function(e) {
31+
console.log('Could not connect to webpack proxy'.red);
32+
console.log(e.toString().red);
33+
});
3834
} else {
39-
app = app
40-
.use(express.static(path.join(__dirname, '../docs-built')));
35+
app.use(express.static(path.join(__dirname, '../docs-built')));
4136
}
4237

43-
app
44-
.listen(4000, function () {
45-
console.log('Server started at http://localhost:4000');
46-
});
38+
app.listen(port, function () {
39+
console.log(`Server started at http://localhost:${port}`);
40+
});

package.json

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
"test": "npm run lint && npm run build && karma start --single-run",
1414
"lint": "eslint src test docs ie8 tools webpack karma.conf.js webpack.config.js webpack.docs.js",
1515
"docs-build": "babel-node tools/build-cli.js --docs-only",
16-
"docs": "babel-node docs/server.js",
16+
"docs": "docs/dev-run",
1717
"docs-prod": "webpack --config webpack.docs.js -p --progress && NODE_ENV=production babel-node docs/server.js",
1818
"ie8": "babel-node ie8/server.js"
1919
},
@@ -53,6 +53,7 @@
5353
"file-loader": "^0.8.1",
5454
"fs-extra": "^0.18.0",
5555
"fs-promise": "^0.3.1",
56+
"http-proxy": "^1.11.1",
5657
"json-loader": "^0.5.1",
5758
"karma": "~0.12.32",
5859
"karma-chai": "^0.1.0",
@@ -69,6 +70,8 @@
6970
"less-loader": "^2.1.0",
7071
"lodash": "^3.5.0",
7172
"mocha": "^2.2.1",
73+
"nodemon": "^1.3.7",
74+
"portfinder": "^0.4.0",
7275
"react": "^0.13.1",
7376
"react-router": "^0.13.1",
7477
"rf-changelog": "^0.4.0",
@@ -78,7 +81,7 @@
7881
"style-loader": "^0.12.0",
7982
"transform-loader": "^0.2.1",
8083
"webpack": "^1.7.2",
81-
"webpack-dev-middleware": "^1.0.11",
84+
"webpack-dev-server": "^1.8.2",
8285
"yargs": "^3.5.4"
8386
},
8487
"dependencies": {

webpack/strategies/docs.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ export default (config, options) => {
2020
extensions: ['', '.js', '.json']
2121
},
2222
module: {
23+
noParse: /babel-core\/browser/,
2324
loaders: config.module.loaders
2425
.map(value => {
2526
if (/\.js\/$/.test(value.test.toString())) {

0 commit comments

Comments
 (0)