安装
npm install inquirer
const inquirer = require('inquirer')
inquirer.prompt([
/* Pass your questions in here */
]).then(answers => {
// Use user feedback for... whatever!!
})
参数
type: String, // 表示提问的类型,下文会单独解释 name: String, // 在最后获取到的answers回答对象中,作为当前这个问题的键
message: String|Function, // 打印出来的问题标题,如果为函数的话
default: String|Number|Array|Function, // 用户不输入回答时,问题的默认值。或者使用函数来return一个默认值。假如为函数时,函数第一个参数为当前问题的输入答案。
choices: Array|Function, // 给出一个选择的列表,假如是一个函数的话,第一个参数为当前问题的输入答案。为数组时,数组的每个元素可以为基本类型中的值。
validate: Function, // 接受用户输入,并且当值合法时,函数返回true。当函数返回false时,一个默认的错误信息会被提供给用户。
filter: Function, // 接受用户输入并且将值转化后返回填充入最后的answers对象内。
when: Function|Boolean, // 接受当前用户输入的answers对象,并且通过返回true或者false来决定是否当前的问题应该去问。也可以是简单类型的值。
pageSize: Number, // 改变渲染list,rawlist,expand或者checkbox时的行数的长度。}
- when 根据answer 返回结果判断是否执行该问题
- filter 过滤一些错误输入
一小段代码的优化过程:
- 第一版
const inquirer = require('inquirer')
const shell = require('shelljs')
const qustion = [
{
name: 'conf',
type: 'confirm',
message: '建议上线前选择全部测试用例(默认为测试全部)',
},
]
const qustion2 = [
{
{
name: 'project',
message: 'Please input the project name which you want to check:',
filter: src => src.replace(/.spec.ts$/gi, ''),
validate: str => Boolean(str.split('/').length === 2 || str.split('/').length === 3),
when: res => !Boolean(res.conf)
}
]
const prompt1 = () => new Promise(resolve => {
inquirer.prompt(question).then(({ conf
}) => {
let params = '**/**/*'
resolve({
params,
conf
})
})
})
const prompt2 = () => new Promise(resolve => {
inquirer.prompt(question2).then(({ project }) => {
let arg = project
if (reg.test(project)) {
arg = project.replace(/.spec.ts$/gi, '')
}
resolve({
arg,
})
})
})
prompt1().then(({ params, conf}) => {
if (conf) {
shell.exec(`
mocha -r ts-node/register test/${params}.spec.ts --colors
`, { async: true })
} else {
prompt2().then(({ arg }) => {
shell.exec(`
mocha -r ts-node/register test/${arg}.spec.ts --colors
`, { async: true })
})
}
})
可以看到第一版的代码冗余较多,感觉很low
- 第二版
const inquirer = require('inquirer')
const shell = require('shelljs')
// Node colorful always
const questions = [
{
name: 'conf',
type: 'confirm',
message: '建议上线前选择全部测试用例(默认为测试全部)',
},
{
name: 'project',
message: 'Please input the project name which you want to check:',
filter: src => src.replace(/.spec.ts$/gi, ''),
validate: str => Boolean(str.split('/').length === 2 || str.split('/').length === 3),
when: res => !Boolean(res.conf)
},
]
const prompts = () => new Promise(resolve => {
inquirer.prompt(questions).then(({ conf, project }) => {
let params = '**/**/*'
const reg = /spec.ts$/
if (!conf) {
params = project
if (reg.test(project)) {
params = project.replace(/.spec.ts$/gi, '')
}
}
resolve({
params,
})
})
})
prompts().then(({ params}) => {
shell.exec(`
mocha -r ts-node/register test/${params}.spec.ts --colors
`, { async: true })
})
可以看到第二版相对于第一版缩减了一半的代码量, 用when 去判断是否读取问题
- 最终版 (将所有判断在inquirer question 参数中完成)
const inquirer = require('inquirer')
const shell = require('shelljs')
// Node colorful always
const questions = [
{
name: 'conf',
type: 'confirm',
message: '建议上线前选择全部测试用例(默认为测试全部)',
},
{
name: 'project',
message: 'Please input the project name which you want to check:',
filter: src => src.replace(/.spec.ts$/gi, ''),
validate: str => Boolean(str.split('/').length === 2 || str.split('/').length === 3),
when: res => !Boolean(res.conf)
},
]
const prompts = () => new Promise(resolve => {
inquirer.prompt(questions).then(({ conf, project }) => {
let params = '**/**/*'
if (!conf) {
params = project
}
resolve({
params,
})
})
})
prompts().then(({ params}) => {
shell.exec(`
mocha -r ts-node/register test/${params}.spec.ts --colors
`, { async: true })
})