| 
 | 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