@gdjiami/cli
Version:
CLI for build front end project.
160 lines (159 loc) • 8.53 kB
JavaScript
;
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);
});