aiot-qiankun-ucf-scripts
Version:
development and build services of UCF project
122 lines (115 loc) • 4.25 kB
JavaScript
/* UCF Start Services
* @Author: Kvkens(yueming@yonyou.com)
* @Date: 2019-01-21 13:02:27
* @Last Modified by: Kvkens
* @Last Modified time: 2019-05-10 10:46:02
*/
const path = require('path');
const chalk = require('chalk');
const argv = require("minimist")(process.argv.slice(2));
const commands = argv;
const express = require('express');
const app = new express();
const webpack = require('webpack');
const proxy = require('http-proxy-middleware');
const OpenBrowserPlugin = require("open-browser-webpack-plugin");
const devMiddleware = require('webpack-dev-middleware');
const hotMiddleware = require('webpack-hot-middleware');
const ip = require('ip');
const getPort = require('get-port');
const util = require('./util');
const webpackConfig = require('./start.config');
const cfg = util.getUcfConfig(commands._);
const compiler = webpack(webpackConfig);
let host = cfg.host ? cfg.host : null;
let browserHost = cfg.host ? cfg.host : '127.0.0.1';
/**
* server 主程序
*/
server = opt => {
// 判断是否加载默认页面打开浏览器
if (commands.homepage) {
compiler.apply(new OpenBrowserPlugin({
url: `http://${browserHost}:${opt.port}/${commands.homepage || ''}`
}));
}
// 静态编译
const instance = devMiddleware(compiler, {
//TODO 与webpackConfig中保持一致
publicPath: webpackConfig.output.publicPath,
logTime: true,
logLevel: commands.logLevel || "info",
headers: {
'Access-Control-Allow-Origin': '*',
'Ucf-Server': util.getPkg().version
},
stats: {
colors: true,
hash: false,
children: false,
chunks: false
}
});
// 允许跨域
//设置跨域访问
app.all('*', (req, res, next) => {
res.header("Access-Control-Allow-Origin", "*");
res.header("Access-Control-Allow-Headers", "X-Requested-With");
res.header("Access-Control-Allow-Methods","PUT,POST,GET,DELETE,OPTIONS");
next();
});
// 静态资源托管
cfg.static && app.use((cfg.context == '' || cfg.context == undefined) ? '' : `/${cfg.context}`, express.static(path.resolve(".", cfg.static)));
// 加载实例
app.use(instance);
// 热更新
app.use(hotMiddleware(compiler));
// 加载代理插件
// 处理proxy数组情况
cfg.proxy && cfg.proxy.forEach(function (element) {
if (element.enable) {// 代理开启
// 默认配置项
let proxyOpt = {
target: element.url,
logLevel: "debug",
changeOrigin: true,
secure: element.secure === true,
pathRewrite: Object.assign({}, element.pathRewrite),
headers: (typeof element.headers !== 'undefined' ? element.headers : {}),
onProxyRes: function (proxyRes) {
proxyRes.headers["Ucf-Proxy"] = "success";
}
}
app.use(element.router, proxy(element.opts || proxyOpt));
console.log(chalk.green(`[proxy] : ${element.router} to ${element.url}`));
}
});
// 运行调试服务
app.listen(opt.port, host, () => {
console.log();
console.log(chalk.green(`----------------------------------------------------`));
console.log(chalk.yellow(`\t 🚀 UCF Develop Server`));
console.log(chalk.green(`\t [Server Version]: 🏅 ${util.getPkg().version}`));
console.log(chalk.green(`\t [Local] : 🏠 http://${browserHost}:${opt.port}`));
console.log(chalk.green(`\t [Lan] : 📡 http://${opt.ip}:${opt.port}`));
console.log(chalk.green(`----------------------------------------------------`));
console.log();
});
}
// 插件启动
module.exports = {
// 主程序ucf调用插件Context
plugin: () => {
// 设置默认端口
// 检测是否被占用,更换端口,启动调试服务
getPort({
port: commands.port || 3000
}).then(port => {
// 启动服务
server({
port,
ip: ip.address()
});
});
}
}