在前人的根底上,自定义交互脚本是一个很简略的事件。
这里介绍四个工具,别离作用在不同的畛域:
shelljs
- 执行脚本程序
inquirer
- 命令行用户交互界面
chalk
- 命令行日志款式
- 可嵌套、可链式
commander
- 自定义命令行参数
// const spawn = require('child_process').spawn// const { Command } = require('commander')const shell = require('shelljs');const inquirer = require('inquirer');const chalk = require('chalk');const scriptsConfig = require('../config/scripts')const runModes = require('../config/modes')// const program = new Command();let curScriptEvent = process.env.npm_lifecycle_event; // E.g.:'npm run serve'中的'serve'let curScriptSource = process.env.npm_lifecycle_script; // E.g.:'npm run serve: vue-cli-service serve'的'vue-cli-service serve'const build = async () => { let res; try { // j、k或者数字键抉择 res = await inquirer.prompt([ { type: 'list', name: 'operation', message: '请抉择你要运行的命令:npm run', choices: ['serve', 'build', 'push', 'fds', 'test'] }, { type: 'list', name: 'mode', message: '请抉择你要执行的环境?', choices: ['dev', 'prev', 'pro'] }, ]); } catch(e) { if (e.isTryError) { console.log(chalk.red("Prompt couldn't be rendered in the current environment")) } else { console.log(chalk.red("Error:", e)) } } const { operation, mode } = res; console.log(chalk.green(`正在执行操作npm run ${operation}---${mode}......`)); curScriptEvent = `${operation}${mode ? (':' + mode) : ''}` curScriptSource = scriptsConfig[curScriptEvent] if (process.platform === 'win32') { shell.exec(`npx cross-env ${curScriptSource}`) // spawn('npx cross-env', [curScriptSource], { // stdio: 'inherit', // shell: true // }) } else { shell.exec(`npm run ${curScriptEvent}`) // spawn('npm', ['run', curScriptEvent]) }}build();
优化版:
const shell = require('shelljs');// const spawn = require('child_process').spawn;const inquirer = require('inquirer');const chalk = require('chalk');const { scripts, getRunModes } = require('../config/scripts')const runModes = getRunModes(scripts)const operationKeys = Object.keys(runModes)let curScriptEvent = process.env.npm_lifecycle_event; // E.g.:'npm run serve'中的'serve'let curScriptSource = process.env.npm_lifecycle_script; // E.g.:'npm run serve: vue-cli-service serve'的'vue-cli-service serve'const build = async () => { let operation, mode; try { // j、k或者数字键抉择 const res = await inquirer.prompt({ type: 'list', name: 'operation', message: '请抉择你要运行的命令:npm run', choices: operationKeys }); operation = res.operation } catch(e) { if (e.isTryError) { console.log(chalk.red("Prompt couldn't be rendered in the current environment")) } else { console.log(chalk.red("Error:", e)) } } try { // j、k或者数字键抉择 const res = await inquirer.prompt({ type: 'list', name: 'mode', message: '请抉择你要执行的环境?', choices: runModes[operation] }); mode = res.mode } catch(e) { if (e.isTryError) { console.log(chalk.red("Prompt couldn't be rendered in the current environment")) } else { console.log(chalk.red("Error:", e)) } } // const { operation, mode } = res; // const NODE_ENV = runModes[mode]; curScriptEvent = `${operation}${mode ? (':' + mode) : ''}` curScriptSource = scripts[curScriptEvent] console.log(chalk.green(`正在执行${curScriptSource}......`)); if (process.platform === 'win32') { // spawn('npx cross-env', [curScriptSource], { // stdio: 'inherit', // shell: true // }) shell.exec(`npx cross-env ${curScriptSource}`) } else { shell.exec(curScriptSource) // spawn('npm', ['run', curScriptEvent], { // stdio: 'inherit', // shell: true // }) }}build();