NodeJs交互式命令行工具Inquirer.js

安装

  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 })
})

你可能感兴趣的:(NodeJs交互式命令行工具Inquirer.js)