
本文介绍使用 inquirer.js 的 `@inquirer/select` 包,在命令行中创建支持键盘方向键导航、回车确认的交互式单选菜单,无需 gui,纯终端友好。
在 Node.js 命令行工具开发中,若需提供直观、易操作的用户选项界面(如“请选择颜色:? 红 / ? 绿 / ? 蓝”),并支持 上下箭头键切换高亮项、Enter 键确认选择,原生 readline 模块虽可实现,但需手动处理按键事件、光标渲染与状态管理,复杂且易出错。推荐采用成熟、轻量、维护活跃的交互式提示库——其中 @inquirer/select 是当前最佳实践之一。
✅ 快速上手:三步实现箭头导航选择器
-
安装依赖
npm install @inquirer/select
-
编写交互逻辑(ESM 格式)
创建 select-color.js:import select from '@inquirer/select'; async function run() { const answer = await select({ message: 'Pick a color:', choices: [ { name: 'Red', value: 'red' }, { name: 'Green', value: 'green' }, { name: 'Blue', value: 'blue' } ] }); console.log(`✅ You selected: ${answer}`); } run(); -
确保模块支持
若运行时报错 SyntaxError: Cannot use import statement outside a module,请在项目根目录 package.json 中添加:{ "type": "module" }或改用 CommonJS(CJS)写法(需安装 cjs 兼容版本,但推荐统一使用 ESM)。
? 进阶特性(提升用户体验)
- 自定义显示名与值分离:name 用于终端展示(如 'Red'),value 为程序内部使用的实际值(如 'red'),避免硬编码字符串。
- 默认选项:添加 default: 'green' 属性,启动时自动高亮绿色项。
- 禁用选项/分组标题:支持 disabled: true 或 type: 'separator' 实现更复杂的菜单结构。
-
响应式退出:用户按 Ctrl+C 会抛出 AbortError,可捕获处理:
try { const answer = await select({ /* ... */ }); console.log(`Selected: ${answer}`); } catch (err) { if (err.name === 'AbortError') { console.log('❌ User cancelled.'); process.exit(0); } }
⚠️ 注意事项
- @inquirer/select 仅适用于 Node.js 环境(v16.14+ 推荐),不兼容浏览器;
- 终端需支持 ANSI 转义序列(绝大多数现代终端均支持),Windows PowerShell / Git Bash / macOS Terminal / Linux TTY 均可正常工作;
- 避免在非交互环境(如 CI/CD 流水线、Docker 容器无 TTY)中调用,否则会挂起;可通过 process.stdin.isTTY 提前校验;
- 如需多选、模糊搜索、动态加载选项等高级功能,可搭配 @inquirer/multiselect 或 @inquirer/search 等同生态包。
通过 @inquirer/select,你能在几行代码内交付专业级 CLI 交互体验——简洁、可靠、符合用户直觉。告别手动监听 keypress,专注业务逻辑本身。










