|  | 
|  | 1 | +require('./check-versions')() | 
|  | 2 | + | 
|  | 3 | +var config = require('../config') | 
|  | 4 | +if (!process.env.NODE_ENV) { | 
|  | 5 | +  process.env.NODE_ENV = JSON.parse(config.dev.env.NODE_ENV) | 
|  | 6 | +} | 
|  | 7 | + | 
|  | 8 | +var opn = require('opn') | 
|  | 9 | +var path = require('path') | 
|  | 10 | +var express = require('express') | 
|  | 11 | +var webpack = require('webpack') | 
|  | 12 | +var proxyMiddleware = require('http-proxy-middleware') | 
|  | 13 | +var webpackConfig = (process.env.NODE_ENV === 'testing' || process.env.NODE_ENV === 'production') | 
|  | 14 | +  ? require('./webpack.prod.conf') | 
|  | 15 | +  : require('./webpack.dev.conf') | 
|  | 16 | + | 
|  | 17 | +// default port where dev server listens for incoming traffic | 
|  | 18 | +var port = process.env.PORT || config.dev.port | 
|  | 19 | +// automatically open browser, if not set will be false | 
|  | 20 | +var autoOpenBrowser = !!config.dev.autoOpenBrowser | 
|  | 21 | +// Define HTTP proxies to your custom API backend | 
|  | 22 | +// https://github.com/chimurai/http-proxy-middleware | 
|  | 23 | +var proxyTable = config.dev.proxyTable | 
|  | 24 | + | 
|  | 25 | +var app = express() | 
|  | 26 | +var compiler = webpack(webpackConfig) | 
|  | 27 | + | 
|  | 28 | +var devMiddleware = require('webpack-dev-middleware')(compiler, { | 
|  | 29 | +  publicPath: webpackConfig.output.publicPath, | 
|  | 30 | +  quiet: true | 
|  | 31 | +}) | 
|  | 32 | + | 
|  | 33 | +var hotMiddleware = require('webpack-hot-middleware')(compiler, { | 
|  | 34 | +  log: false, | 
|  | 35 | +  heartbeat: 2000 | 
|  | 36 | +}) | 
|  | 37 | +// force page reload when html-webpack-plugin template changes | 
|  | 38 | +compiler.plugin('compilation', function (compilation) { | 
|  | 39 | +  compilation.plugin('html-webpack-plugin-after-emit', function (data, cb) { | 
|  | 40 | +    hotMiddleware.publish({ action: 'reload' }) | 
|  | 41 | +    cb() | 
|  | 42 | +  }) | 
|  | 43 | +}) | 
|  | 44 | + | 
|  | 45 | + | 
|  | 46 | +// handle fallback for HTML5 history API | 
|  | 47 | +app.use(require('connect-history-api-fallback')()) | 
|  | 48 | + | 
|  | 49 | +// serve webpack bundle output | 
|  | 50 | +app.use(devMiddleware) | 
|  | 51 | + | 
|  | 52 | +// enable hot-reload and state-preserving | 
|  | 53 | +// compilation error display | 
|  | 54 | +app.use(hotMiddleware) | 
|  | 55 | + | 
|  | 56 | +// serve pure static assets | 
|  | 57 | +var staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) | 
|  | 58 | +app.use(staticPath, express.static('./statics')) | 
|  | 59 | + | 
|  | 60 | +var uri = 'http://localhost:' + port | 
|  | 61 | + | 
|  | 62 | +var _resolve | 
|  | 63 | +var readyPromise = new Promise(resolve => { | 
|  | 64 | +  _resolve = resolve | 
|  | 65 | +}) | 
|  | 66 | + | 
|  | 67 | +console.log('> Starting dev server...') | 
|  | 68 | +devMiddleware.waitUntilValid(() => { | 
|  | 69 | +  console.log('> Listening at ' + uri + '\n') | 
|  | 70 | +  // when env is testing, don't need open it | 
|  | 71 | +  if (autoOpenBrowser && process.env.NODE_ENV !== 'testing') { | 
|  | 72 | +    opn(uri) | 
|  | 73 | +  } | 
|  | 74 | +  _resolve() | 
|  | 75 | +}) | 
|  | 76 | + | 
|  | 77 | +var server = app.listen(port) | 
|  | 78 | + | 
|  | 79 | +module.exports = { | 
|  | 80 | +  ready: readyPromise, | 
|  | 81 | +  close: () => { | 
|  | 82 | +    server.close() | 
|  | 83 | +  } | 
|  | 84 | +} | 
0 commit comments