UNPKG

cuz

Version:

Front-end modular development kit.

127 lines (109 loc) 3.54 kB
import nopt from 'nopt'; import fs from 'fs-extra'; import cheerio from 'cheerio'; import { DefinePlugin } from 'webpack'; const basedir = process.cwd(); const optlist = { init: { into: 'init a templete', type: String, }, dev: { info: 'dev for debug.', type: Boolean, }, build: { info: 'build for delopy.', type: Boolean, }, version: { short: 'v', info: 'display current version.', type: Boolean, }, help: { short: 'h', info: 'help info.', type: Boolean, }, }; const aliases = {}; const known = {}; Object.keys(optlist).forEach(function parse(key) { const short = optlist[key].short; if (short) { aliases[short] = '--' + key; } known[key] = optlist[key].type; }); export default function cli() { const parsed = nopt(known, aliases, process.argv, 2); let arg = parsed.argv.cooked; if (arg.length === 0) { arg = ['dev', '--dev']; } const option = arg[0] || 'dev'; let env = 'development'; if (option === 'build') { env = 'production'; } if (['-test', '--test', '-testing', '--testing'].indexOf(arg[1]) > -1) { env = 'testing'; } if (['-prd', '--prd', '-production', '--production'].indexOf(arg[1]) > -1) { env = 'production'; } if (option === '--version') { const packageInfo = require('../../package.json'); const version = packageInfo.version; console.log('cuz v' + version); } if (option === '--help') { console.log('Not implemented.'); } if (option === 'dev') { require('./server')({env}); } if (option === 'build') { const config = require('./webpack.production.config.js'); config.plugins.push(new DefinePlugin({ 'process.env.NODE_ENV': `"${env}"` })); const { name, version } = require(basedir + '/package.json'); let { publicPath } = require(basedir + '/src/config.js'); publicPath = publicPath || ''; publicPath = publicPath.replace('{name}', name).replace('{version}', version); publicPath = publicPath[publicPath.length - 1] === '/' ? publicPath : publicPath + '/'; // 修改 index.html 以适配 cdn 环境 fs.readFile(basedir + '/src/index.html', 'utf8', function done(err, data) { const $ = cheerio.load(data); $(`\n <script src="${publicPath}cuz.js"></script>`).insertAfter('#root'); const html = $.html().replace(`<script src="index.js"></script>`, `<script src="${publicPath}index.js"></script>`); fs.outputFile(basedir + '/build/index.html', html); console.log(`copied 'index.html'.`); }); // 临时处理静态资源文件 (这里应该使用 webpack 打包) ['img', 'imgs', 'image', 'images', 'vendor', 'vendors'].map((item) => { fs.exists(`${basedir}/src/${item}`, (exists) => { if (exists) { fs.copy(`${basedir}/src/${item}/`, `${basedir}/build/${item}/`, function done() { console.log(`copied static resources [${item}].`); }); } }); }); // 打包业务代码 console.log('bundle package.'); const webpack = require('webpack'); config.output.publicPath = publicPath; console.log('public address:' + publicPath); webpack(config).run((errMsg, info) => console.log(errMsg + info)); } if (option === 'init') { fs.copy(basedir + '/node_modules/cuz/templete/backend', basedir, function done(err) { if (err) { return console.log(err); } console.log('init backend templete complete.'); console.log('You can use `cuz` to start dev.'); }); } }