运行时依赖
安装命令
点击复制技能文档
@clack/prompts 构建漂亮、极简的交互式 CLI 应用。预设样式,支持 tree-shake,体积比其他替代品小 80%。快速开始
npm install @clack/prompts
import { intro, outro, text, isCancel, cancel } from '@clack/prompts';
intro('create-my-app');
const name = await text({ message: '项目名称?' });
if (isCancel(name)) {
cancel('已取消。');
process.exit(0);
}
outro(完成!创建了 ${name}。);
核心模式 —— 始终防止取消 每个提示都可能返回取消符号(用户按下 Ctrl+C)。始终使用 isCancel(): const result = await text({ message: '名称?' }); if (isCancel(result)) { cancel('已取消。'); process.exit(0); }
选择合适的组件 组件 | 返回值 | 描述 ---|---|--- text | 字符串 | 单行文本 confirm | 布尔值 | 是/否确认 select | 字符串(值)| 从列表中选择一个 autocomplete | 字符串(值)| 搜索并选择一个 selectKey | 字符串(值)| 单键选择 multiselect | 字符串数组 | 从列表中选择多个 groupMultiselect | 字符串数组 | 分组选择多个 multiline | 字符串 | 多行文本 path | 字符串 | 文件系统路径 date | 日期 | 日历日期
常见模式
顺序提示
使用 group() 链接提示,后续提示依赖于前面的答案:
import as p from '@clack/prompts';
const result = await p.group(
{
name: () => p.text({ message: '你的名字是什么?' }),
age: () => p.text({ message: '你的年龄是什么?' }),
color: ({ results }) => p.multiselect({
message: 你最喜欢的颜色是什么,${results.name}?,
options: [
{ value: 'red', label: '红色' },
{ value: 'blue', label: '蓝色' },
],
}),
},
{
onCancel: ({ results }) => {
p.cancel('操作已取消。');
process.exit(0);
},
},
);
任务运行器 使用 Spinners 运行顺序任务,每个任务都有自己的 Spinner: import { tasks } from '@clack/prompts'; await tasks([ { title: '通过 npm 安装', task: async () => { // 返回字符串表示成功 return '通过 npm 安装'; }, }, { title: '运行测试', task: async () => { // 抛出错误表示失败 throw new Error('测试失败!'); }, }, ]);
独立 Spinner import { spinner } from '@clack/prompts'; const s = spinner(); s.start('上传中...'); try { await upload(); s.stop('上传完成!'); } catch { s.stop('上传失败'); }
进度条 const p = progress({ max: 100 }); p.start('下载中'); for (const chunk of chunks) { p.advance(1); } p.stop('完成');
实时子进程输出 使用 taskLog 实现实时子进程输出: import { taskLog } from '@clack/prompts'; const log = taskLog({ title: 'npm install' }); for await (const line of npmInstall()) { log.message(line); } log.success('完成!'); // 清除输出 // log.error('失败!'); // 保留输出
样式日志(无用户输入) import { log } from '@clack/prompts'; import color from 'picocolors'; log.info('开始设置...'); log.success('配置写入!'); log.step('检查依赖...'); log.warn('可选同行依赖缺失'); log.error('构建失败'); log.message('自定义', { symbol: color.cyan('~') });
流式日志 用于 LLM 输出或动态流: import { stream } from '@clack/prompts'; stream.info((function () { yield '信息!'; })()); stream.success((async function () { yield '完成!'; })()); stream.message( (function () { yield '你好'; yield ',世界'; })(), { symbol: color.cyan('~') } );
选择选项形状 用于 select、autocomplete、selectKey、multiselect、groupMultiselect: { value: 'ts', label: 'TypeScript' } // 基本 { value: 'js', label: 'JavaScript', disabled: true } // 禁用 { value: 'coffee', label: 'CoffeeScript', hint: 'oh no' } // 带提示
验证 大多数组件接受 validate(value) 函数,返回字符串(错误消息)或 undefined(有效): const name = await text({ message: '用户名?', validate(value) { if (!value.length) return '用户名必填!'; if (value.length < 3) return '至少 3 个字符。'; }, });
完整 API 参考 请参阅 references/api.md 以获取每个组件的完整签名、选项表和示例。