UNPKG

@gdjiami/cli

Version:

CLI for build front end project.

160 lines (159 loc) 8.53 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); /** * build project */ var cli_table2_1 = tslib_1.__importDefault(require("cli-table2")); var webpack_1 = tslib_1.__importDefault(require("webpack")); var path_1 = tslib_1.__importDefault(require("path")); var fs_extra_1 = tslib_1.__importDefault(require("fs-extra")); var chalk_1 = tslib_1.__importDefault(require("chalk")); var webpack_format_messages_1 = tslib_1.__importDefault(require("webpack-format-messages")); var ora_1 = tslib_1.__importDefault(require("ora")); var utils_1 = require("../utils"); var electron_main_1 = tslib_1.__importDefault(require("../config/electron-main")); var info_1 = tslib_1.__importDefault(require("../services/info")); var paths_1 = tslib_1.__importDefault(require("../paths")); var options_1 = tslib_1.__importDefault(require("../options")); var config_1 = tslib_1.__importDefault(require("../config")); var generateDll_1 = tslib_1.__importDefault(require("./dll/generateDll")); var mode = 'production'; var useYarn = utils_1.shouldUseYarn(); process.env.NODE_ENV = mode; var versionFile = path_1.default.join(paths_1.default.appDist, '.version'); var pkg = require(paths_1.default.appPackageJson); // initial env require('../env'); function build(argv) { return tslib_1.__awaiter(this, void 0, void 0, function () { var environment, jmOptions, isElectron, config, group_1, table_1, SpeedMeasurePlugin, smp, supportDll, _a, spinner, electronMainConfig, compiler; return tslib_1.__generator(this, function (_b) { switch (_b.label) { case 0: environment = require('../env').default(); jmOptions = options_1.default(pkg); if (jmOptions == null) { return [2 /*return*/]; } isElectron = jmOptions.electron; if (isElectron) { utils_1.message.info(chalk_1.default.cyan('Electron') + ' Mode'); } if (argv.group) { group_1 = argv.group; utils_1.message.info("selected entries:"); table_1 = new cli_table2_1.default({ head: ['Group', 'Entries'], }); Object.keys(group_1).forEach(function (key) { // @ts-ignore table_1.push([key, group_1[key].join(', ')]); }); console.log("\n" + chalk_1.default.bgWhite(table_1.toString()) + "\n"); config = Object.keys(group_1).map(function (name) { return config_1.default(environment, pkg, paths_1.default, { name: name, entry: group_1[name], jmOptions: jmOptions, }); }); } else if (argv.entry) { utils_1.message.info("Selected entries: " + chalk_1.default.cyan(argv.entry.join(', '))); config = config_1.default(environment, pkg, paths_1.default, { entry: argv.entry, jmOptions: jmOptions }); } else { config = config_1.default(environment, pkg, paths_1.default, { jmOptions: jmOptions }); } if (argv.inspect) { utils_1.inspect(environment.raw, 'Environment:'); utils_1.inspect(config, 'Webpack Configuration:'); return [2 /*return*/]; } if (argv.measure) { SpeedMeasurePlugin = require('speed-measure-webpack-plugin'); smp = new SpeedMeasurePlugin(); config = smp.wrap(config); } utils_1.message.info(info_1.default()); supportDll = environment.raw.DISABLE_DLL !== 'true' && jmOptions.enableDllInProduction; if (!supportDll) return [3 /*break*/, 4]; utils_1.message.info('Checking DLL...'); _b.label = 1; case 1: _b.trys.push([1, 3, , 4]); return [4 /*yield*/, generateDll_1.default(environment, pkg, paths_1.default, { jmOptions: jmOptions })]; case 2: _b.sent(); return [3 /*break*/, 4]; case 3: _a = _b.sent(); utils_1.message.warn('Failed to compile DLL. skip'); return [3 /*break*/, 4]; case 4: spinner = ora_1.default({ text: 'Creating an optimized production build...' }).start(); electronMainConfig = isElectron ? electron_main_1.default(environment, pkg, paths_1.default, { jmOptions: jmOptions }) : undefined; compiler = webpack_1.default((electronMainConfig ? Array.isArray(config) ? config.concat(electronMainConfig) : [config, electronMainConfig] : config)); compiler.run(function (err, stats) { if (err) { spinner.stopAndPersist({ text: 'Failed to compile.', symbol: utils_1.logSymbols.error }); console.error(err.stack || err); // @ts-ignore if (err.details) { // @ts-ignore console.error(err.details); } return; } var messages = webpack_format_messages_1.default(stats); if (messages.errors.length) { spinner.stopAndPersist({ text: 'Failed to compile.\n\n', symbol: utils_1.logSymbols.error }); messages.errors.forEach(function (e) { return console.log(e); }); return; } // copy dll if (supportDll) { var dllName = path_1.default.basename(paths_1.default.appDllFile); fs_extra_1.default.copyFileSync(paths_1.default.appDllFile, path_1.default.join(paths_1.default.appDist, dllName)); } if (messages.warnings.length) { spinner.stopAndPersist({ text: 'Compiled with warnings.\n\n', symbol: utils_1.logSymbols.warn }); messages.warnings.forEach(function (e) { return console.log(e); }); } else { spinner.stopAndPersist({ text: 'Compiled successfully.', symbol: utils_1.logSymbols.success }); } if (!isElectron) { console.log("\n\u2728 Call " + chalk_1.default.cyan(useYarn ? 'yarn serve' : 'npm run serve') + " to test your bundles."); } fs_extra_1.default.writeFile(versionFile, pkg.version); }); return [2 /*return*/]; } }); }); } exports.default = (function (argv) { if (argv.cacheByNpmVersion && !argv.inspect) { // 检查dist目录是否存在, 且版本匹配 if (fs_extra_1.default.existsSync(versionFile)) { var version = fs_extra_1.default.readFileSync(versionFile).toString(); if (pkg.version === version) { utils_1.message.info("Build results cached by npm version(" + version + "), return"); return; } } } if (!argv.dontClean) { fs_extra_1.default.emptyDirSync(paths_1.default.appDist); } if (!argv.dontCopy) { fs_extra_1.default.copySync(paths_1.default.appPublic, paths_1.default.appDist, { dereference: false }); } build(argv); });