开发知识

Node.js 中的交互式命令行:玩转 Inquirer.js

来源: 科学随想录  日期:2024-04-26 22:37:02  点击:24  属于:开发知识

嘿,会Node.js 的小伙伴们!今天咱们来聊聊一个超级实用的 Node.js 库——inquirer.js。如果你想要让你的命令行工具变得交互式,那这个库绝对是你的不二之选。它能让你轻松创建出美观、易用的文本界面,让用户的输入体验更上一层楼。

安装 Inquirer.js

安装起来也是分分钟的事,用 npm 或 yarn 都可以:

npm install inquirer

或者

yarn add inquirer

快速上手

安装完了,咱们就可以开始玩耍了。先来个简单的示例,看看 inquirer.js 是怎么用的:

const inquirer = require('inquirer');

const questions = [
{
   type: 'input',
   name: 'username',
   message: '嘿,你叫啥呀?',
},
{
   type: 'password',
   name: 'password',
   message: '密码悄悄告诉我:',
},
];

inquirer.prompt(questions).then(answers => {
 console.log('用户名:', answers.username);
 console.log('密码:', answers.password);
});

这段代码里,咱们定义了两个问题:用户名和密码。type 参数告诉 inquirer.js 我们想要的输入类型,name 是问题的答案名称,message 是咱们要问用户的问题。

丰富的问题类型

inquirer.js 提供了一大堆问题类型,满足各种不同的需求:

输入(Input)

就是普通的文本输入。

{
 type: 'input',
 name: 'name',
 message: '你的名字是啥?',
}

密码(Password)

和输入一样,但输入的内容不会显示出来。

{
 type: 'password',
 name: 'password',
 message: '密码多少呀?',
}

确认(Confirm)

用户可以通过输入 y 或 n 来回答“是”或“否”。

{
 type: 'confirm',
 name: 'continue',
 message: '咱们继续吗?',
}

列表(List)

让用户从列表里挑一个。

{
 type: 'list',
 name: 'theme',
 message: '选个主题呗:',
 choices: ['亮堂的', '暗夜的', '自定义的'],
}

下拉列表(Expand)

下拉列表,用户可以用方向键选择多个选项。

{
 type: 'expand',
 name: 'abilities',
 message: '超能力选哪个?',
 choices: [
  {
     key: 'p',
     name: '力大无穷',
     value: 'power',
  },
  {
     key: 's',
     name: '快如闪电',
     value: 'speed',
  },
   // 更多选项...
],
}

编辑器(Editor)

这个厉害了,让用户在外部编辑器里写东西。

{
  type: 'editor',
  name: 'bio',
  message: '来,写个自我介绍:',
}

处理用户的回答

inquirer.prompt() 方法返回一个 Promise,用户一提交答案,Promise 就会带着所有答案的对象来解析。你可以拿这些答案去做各种酷炫的事。

inquirer.prompt(questions).then(answers => {
  // 用 answers 对象干点啥
  console.log('用户名:', answers.username);
});

动态提问

有时候,你可能想问的问题取决于用户之前的回答。inquirer.js 支持这种智能模式,用 when 属性就能搞定。

const questions = [
  {
    type: 'confirm',
    name: 'hasAccount',
    message: '有账户不?',
  },
  {
    type: 'input',
    name: 'username',
    message: '用户名是啥?',
    when: answers => answers.hasAccount
  },
  {
    type: 'input',
    name: 'email',
    message: '邮箱地址呢?',
    when: answers => !answers.hasAccount
  }
];

在这个例子里,用户名的输入框会不会显示,取决于用户对 hasAccount 的回答。

装饰你的命令行

inquirer.js 还让你能通过 prefix 属性来加个前缀,或者用 transformer 函数来美化显示给用户的答案。

{
  type: 'input',
  name: 'name',
  message: '叫啥?',
  prefix: '称呼:',
  transformer: input => `你好啊,${input}!`,
}

和其他 Node.js 工具一起玩

inquirer.js 可以和其他 Node.js 工具一起用,比如和 cross-spawn 模块搭配,根据用户的回答执行不同的命令。

const { spawn } = require('cross-spawn');

inquirer.prompt([
  {
    type: 'list',
    name: 'action',
    message: '想干点啥?',
    choices: ['装点依赖', '跑个测试', '撤了'],
  },
]).then(answers => {
  const command = answers.action === '装点依赖' ? 'npm install' : 'npm test';
  spawn.sync(command, [], { stdio: 'inherit' });
});

总结

inquirer.js 是一个功能超群的库,能让你的命令行工具变得既强大又用户友好。无论是简单的数据收集,还是复杂的多步骤交互,inquirer.js 都能帮你搞定。今天咱们学了 inquirer.js 的基本用法,现在你应该对这个库有个大概的了解了。