UNPKG

bkui-cli-template-webpack4-saas

Version:

bkui-cli-template-webpack4-saas

127 lines (102 loc) 3.23 kB
/** * @file dev server * @author <%- author %> */ import path from 'path' import express from 'express' import open from 'open' import webpack from 'webpack' import webpackDevMiddleware from 'webpack-dev-middleware' import webpackHotMiddleware from 'webpack-hot-middleware' import proxyMiddleware from 'http-proxy-middleware' import bodyParser from 'body-parser' import history from 'connect-history-api-fallback' import cors from 'cors' import devConf from './webpack.dev.conf' import ajaxMiddleware from './ajax-middleware' import config from './config' import checkVer from './check-versions' checkVer() const port = process.env.PORT || config.dev.localDevPort const autoOpenBrowser = !!config.dev.autoOpenBrowser const proxyTable = config.dev.proxyTable const app = express() const compiler = webpack(devConf) const devMiddleware = webpackDevMiddleware(compiler, { publicPath: devConf.output.publicPath, quiet: true }) const hotMiddleware = webpackHotMiddleware(compiler, { log: false, heartbeat: 2000 }) Object.keys(proxyTable).forEach(context => { let options = proxyTable[context] if (typeof options === 'string') { options = { target: options } } app.use(proxyMiddleware(context, options)) }) app.use(history({ verbose: false, rewrites: [ { // connect-history-api-fallback 默认会对 url 中有 . 的 url 当成静态资源处理而不是当成页面地址来处理 // 兼容 /router/10.121.23.12 这样以 IP 结尾的 url from: /(\d+\.)*\d+$/, to: '/' }, { // connect-history-api-fallback 默认会对 url 中有 . 的 url 当成静态资源处理而不是当成页面地址来处理 // 兼容 /router/0.aaa.bbb.ccc.1234567890/ddd/eee from: /\/+.*\..*\//, to: '/' } ] })) const allowedOrigins = [`http://localhost:${port}`, `${config.dev.localDevUrl}:${port}`] app.use(cors({ origin: (origin, callback) => { if (!origin) { return callback(null, true) } if (allowedOrigins.indexOf(origin) === -1) { const msg = 'The CORS policy for this site does not allow access from the specified Origin.' return callback(new Error(msg), false) } return callback(null, true) }, methods: ['DELETE', 'GET', 'HEAD', 'OPTIONS', 'POST', 'PUT', 'PATCH'], credentials: true })) app.use(devMiddleware) app.use(hotMiddleware) app.use(bodyParser.json()) app.use(bodyParser.urlencoded({ extended: true })) app.use(ajaxMiddleware) const staticPath = path.posix.join(config.dev.assetsPublicPath, config.dev.assetsSubDirectory) app.use(staticPath, express.static('./static')) const url = config.dev.localDevUrl + ':' + port let _resolve const readyPromise = new Promise(resolve => { _resolve = resolve }) console.log('> Starting dev server...') devMiddleware.waitUntilValid(() => { console.log('> Listening at ' + url + '\n') if (autoOpenBrowser) { open(url) } _resolve() }) const server = app.listen(port) export default { ready: readyPromise, close: () => { server.close() } }