You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

92 lines
2.5 KiB

require("./check-versions")();
var config = require("../config");
if (!process.env.NODE_ENV) {
process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV);
}
var opn = require("opn");
var path = require("path");
var express = require("express");
var webpack = require("webpack");
var proxyMiddleware = require("http-proxy-middleware");
var webpackConfig = require("./webpack.dev.conf");
// default port where dev server listens for incoming traffic
var port = process.env.PORT || config.dev.port;
// automatically open browser, if not set will be false
var autoOpenBrowser = !!config.dev.autoOpenBrowser;
// Define HTTP proxies to your custom API backend
// https://github.com/chimurai/http-proxy-middleware
var proxyTable = config.dev.proxyTable;
var app = express();
var compiler = webpack(webpackConfig);
var devMiddleware = require("webpack-dev-middleware")(compiler, {
publicPath: webpackConfig.output.publicPath,
quiet: true
});
var hotMiddleware = require("webpack-hot-middleware")(compiler, {
log: () => {}
});
// force page reload when html-webpack-plugin template changes
compiler.plugin("compilation", function(compilation) {
compilation.plugin("html-webpack-plugin-after-emit", function(data, cb) {
hotMiddleware.publish({ action: "reload" });
cb();
});
});
// proxy api requests
Object.keys(proxyTable).forEach(function(context) {
var options = proxyTable[context];
if (typeof options === "string") {
options = { target: options };
}
app.use(proxyMiddleware(options.filter || context, options));
});
// handle fallback for HTML5 history API
app.use(require("connect-history-api-fallback")());
// serve webpack bundle output
app.use(devMiddleware);
// enable hot-reload and state-preserving
// compilation error display
app.use(hotMiddleware);
// serve pure static assets
var staticPath = path.posix.join(
config.dev.assetsPublicPath,
config.dev.assetsSubDirectory
);
app.use(staticPath, express.static("./static"));
var uri = "http://localhost:" + port;
var _resolve;
var readyPromise = new Promise(resolve => {
_resolve = resolve;
});
console.log("> Starting dev server...");
devMiddleware.waitUntilValid(() => {
console.log("> Listening at " + uri + "\n");
// when env is testing, don't need open it
if (autoOpenBrowser && process.env.NODE_ENV !== "testing") {
opn(uri);
}
_resolve();
});
var server = app.listen(port, "0.0.0.0");
module.exports = {
ready: readyPromise,
close: () => {
server.close();
}
};