UNPKG

bunjs

Version:

bun-cli工具是一个融合了多种实用功能的前端命令行工具,它服务于bunjs框架,却不止于bunjs。

152 lines (138 loc) 4.52 kB
const chalk = require('chalk') const fs = require('fs'); const webpack = require("../../node_modules/webpack"); const { restartApp, fsExistsSync } = require("../../utils"); const { compileTypescript } = require("../../ts-compile/index"); module.exports = (options) => { let path = options.to; let dev = options.dev; let test = options.test; let userConf = require(process.cwd() + '/config.js'); let isSingle = userConf.isSingle; let webpackConfig = ''; let ssrWebpackConfig = ''; let appType = userConf.frame; userConf._appPath = isSingle ? '/' : `/${userConf.appname}/`; if (dev) { process.env.NODE_ENV = 'development'; webpackConfig = require('../../config/webpack.config-dev.js')(userConf); } else { process.env.NODE_ENV = 'production'; if (test) { userConf.publicStaticDomain = userConf.testStaticDomain; } webpackConfig = require('../../config/webpack.config.js')(userConf); } if (userConf.ssr) { if (appType === 'vue') { ssrWebpackConfig = require('../../config/webpack.config-vuessr.js')(userConf); } else if (appType === 'react') { ssrWebpackConfig = require('../../config/webpack.config-reactssr.js')(userConf); } } console.log(chalk.white('\n Start deploying...')); let projectName = process.cwd().split('/').slice(-1)[0]; if (path) { projectName = path.replace(/.*?\/([/s/S]*)\/?/ig, '$1'); } compileTypescript(userConf, options.watch, () => restartApp(projectName)); webpackBuild(webpackConfig, options.watch, (stats) => { try { if (userConf.ssr) { webpackBuild(ssrWebpackConfig, false, (stats) => { let projectName = process.cwd().split('/').slice(-1)[0]; restartApp(projectName, () => {}); }); } else { if (path) { moveToProAndWatch(); } } } catch (e) { console.log(e) process.exit() } }); } function moveToProAndWatch() { // 如果设置to参数,则移动build目录下的文件到指定project let files = fs.readdirSync('./build/app/'); let appName = files[0]; let fileMap = config.deployConf.fileMap(path); moveAppToPro(appName, fileMap); let projectName = path.replace(/.*?\/([/s/S]*)\/?/ig, '$1'); restartApp(projectName, () => { if (options.watch) {} else { process.exit(); } }); } function copyDir(src, dist) { if (!fsExistsSync(dist)) { fs.mkdirSync(dist); } let paths = fs.readdirSync(src); paths.forEach(function (path) { var _src = src + '/' + path; var _dist = dist + '/' + path; let stat = fs.lstatSync(_src); if (stat.isDirectory()) { // 当是目录,递归复制 copyDir(_src, _dist) } else { fs.writeFileSync(_dist, fs.readFileSync(_src)); } }) } function moveAppToPro(appName, fileMap) { for (let i in fileMap) { if (fsExistsSync(i + appName)) { if (!fsExistsSync(fileMap[i])) { fs.mkdirSync(fileMap[i]); copyDir(i + appName, fileMap[i] + appName); } else { copyDir(i + appName, fileMap[i] + appName); } } } rm.sync('./build'); console.log(chalk.white('\n √ Remove build completed!')); console.log(chalk.green('\n √ Deploy completed!')); } function webpackBuild(webpackConfig, isWatch, cb) { const complier = webpack(webpackConfig); if (isWatch) { complier.watch({}, callback); } else { complier.run(callback); } function callback(err, stats) { // 在这里处理错误 if (err) { console.error(err.stack || err); if (err.details) { console.error(err.details); } process.exit(); } const info = stats.toJson(); if (stats.hasErrors()) { console.error(info.errors); // process.exit(); } if (stats.hasWarnings()) { console.warn(info.warnings); } console.log(stats.toString({ // 增加控制台颜色开关 colors: true })); console.log(chalk.green('\n √ Complier completed!')); cb(stats); } }