news 2026/3/4 4:05:16

@clack/prompts 命令行终端中构建交互式用户界面

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
@clack/prompts 命令行终端中构建交互式用户界面

@clack/prompts

概述

@clack/prompts是一个轻量、美观且开发者友好的Node.js库,用于在命令行终端中构建交互式用户界面。它提供了一系列样式现代的提示组件,支持异步操作,并包含完整的类型定义(TypeScript),能够显著提升命令行工具的用户体验。

安装

使用npm或yarn进行安装:

# 使用 npmnpminstall@clack/prompts# 使用 yarnyarnadd@clack/prompts# 使用 pnpmpnpmadd@clack/prompts

基础使用模式

每个使用@clack/prompts的CLI工具通常遵循以下模式:

// 1. 引入必要的函数import{intro,outro,confirm,isCancel}from'@clack/prompts';// 2. 显示欢迎信息intro('欢迎使用我的CLI工具');// 3. 执行交互逻辑constshouldContinue=awaitconfirm({message:'是否继续执行?'});// 4. 处理用户取消操作if(isCancel(shouldContinue)){cancel('操作已取消');process.exit(0);}// 5. 显示结束信息outro('任务已完成!');

核心组件详解

1. 文本输入 (input)

用于获取用户单行文本输入。

参数说明:

  • message: 显示给用户的提示信息
  • placeholder: 输入框内的占位符文本
  • defaultValue: 默认值
  • validate: 验证函数,返回字符串表示验证失败
import{text}from'@clack/prompts';constname=awaittext({message:'请输入项目名称',placeholder:'my-awesome-project',defaultValue:'default-project',validate:(value)=>{if(value.length<3)return'名称至少需要3个字符';if(!/^[a-z\-]+$/.test(value))return'只能包含小写字母和连字符';}});
2. 确认选择 (confirm)

获取布尔值的是/否回答。

import{confirm}from'@clack/prompts';constisReady=awaitconfirm({message:'是否确认删除?',initialValue:true// 默认选中"是"});
3. 单选列表 (select)

让用户从选项列表中选择一个值。

选项配置:

  • value: 选项的实际值
  • label: 显示给用户的文本
  • hint: 额外的提示信息(可选)
import{select}from'@clack/prompts';constframework=awaitselect({message:'请选择前端框架',options:[{value:'react',label:'React',hint:'Facebook开发'},{value:'vue',label:'Vue.js',hint:'渐进式框架'},{value:'angular',label:'Angular',hint:'Google开发'},{value:'svelte',label:'Svelte'}],initialValue:'vue'// 默认选中Vue});
4. 多选列表 (multiselect)

允许用户选择多个选项。

import{multiselect}from'@clack/prompts';constfeatures=awaitmultiselect({message:'选择要添加的功能',options:[{value:'typescript',label:'TypeScript',hint:'类型安全'},{value:'eslint',label:'ESLint',hint:'代码检查'},{value:'prettier',label:'Prettier',hint:'代码格式化'},{value:'tests',label:'测试框架'}],required:false,// 是否至少选择一项initialValues:['typescript','eslint']// 默认选中的值});
5. 密码输入 (password)

输入内容会被隐藏,适用于敏感信息。

import{password}from'@clack/prompts';constsecretKey=awaitpassword({message:'请输入API密钥',mask:'•'// 自定义掩码字符});
6. 进度指示器

显示长时间操作的进度。

import{progress}from'@clack/prompts';// 创建进度条实例constp=progress(0,100,'处理中...');// 更新进度p.update(30,'正在下载文件...');p.update(60,'正在处理数据...');p.update(100,'完成!');// 或使用静态方法progress(30,100,'第一阶段完成');

高级功能

1. 处理取消操作

所有提示函数都可能被用户通过Ctrl+C取消,必须妥善处理:

import{text,isCancel,cancel}from'@clack/prompts';try{constanswer=awaittext({message:'请输入内容'});if(isCancel(answer)){cancel('用户取消了操作');process.exit(0);}console.log(`用户输入:${answer}`);}catch(error){cancel('发生错误: '+error.message);}
2. 自定义样式和主题

通过配置对象自定义外观:

import{setTheme}from'@clack/prompts';// 应用自定义主题setTheme({color:{primary:'#FF6B35',success:'#00C851',error:'#FF4444'}});
3. 分组提示

将多个相关提示组合在一起:

import{group}from'@clack/prompts';constresults=awaitgroup({name:()=>text({message:'姓名'}),email:()=>text({message:'邮箱'}),subscribe:()=>confirm({message:'订阅新闻'})},{onCancel:()=>{cancel('操作取消');process.exit(0);}});console.log(results);// { name: '...', email: '...', subscribe: true/false }

完整示例

以下是一个完整的CLI工具示例,演示了多个组件的组合使用:

#!/usr/bin/env nodeimport{intro,outro,select,text,confirm,multiselect,isCancel,cancel}from'@clack/prompts';asyncfunctionmain(){// 欢迎界面intro('🚀 项目初始化工具');// 收集项目信息constprojectType=awaitselect({message:'选择项目类型',options:[{value:'web',label:'Web应用'},{value:'cli',label:'命令行工具'},{value:'lib',label:'库/包'}]});if(isCancel(projectType)){cancel('操作已取消');returnprocess.exit(0);}constprojectName=awaittext({message:'项目名称',placeholder:'请输入有效的包名'});if(isCancel(projectName)){cancel('操作已取消');returnprocess.exit(0);}constfeatures=awaitmultiselect({message:'选择功能',options:[{value:'typescript',label:'TypeScript'},{value:'testing',label:'测试框架 (Jest)'},{value:'linting',label:'代码检查 (ESLint)'},{value:'formatting',label:'代码格式化 (Prettier)'}]});if(isCancel(features)){cancel('操作已取消');returnprocess.exit(0);}constconfirmSetup=awaitconfirm({message:'确认创建项目?'});if(isCancel(confirmSetup)||!confirmSetup){cancel('项目创建取消');returnprocess.exit(0);}// 模拟创建过程console.log('\n📁 创建项目结构...');console.log(`📦 项目名称:${projectName}`);console.log(`🔧 类型:${projectType}`);console.log(`✨ 功能:${features.join(', ')}`);// 结束界面outro('✅ 项目创建成功!');}main().catch(console.error);

注意事项

  1. 异步处理:所有提示函数都是异步的,必须使用await.then()
  2. 取消处理:务必使用isCancel()检查每个提示的返回值。
  3. 版本兼容性:v1.x版本可能包含破坏性变更,生产环境建议锁定版本号。
  4. 错误处理:使用try-catch包装可能出错的提示操作。

最佳实践

  • 为必填字段提供清晰的验证信息
  • 使用placeholderhint提供额外指导
  • 按逻辑顺序组织提示问题
  • 及时处理用户取消操作
  • 在长时间操作前提供确认提示

这个库特别适合构建项目脚手架、配置向导、系统管理工具等需要复杂用户交互的CLI应用程序。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/3/3 4:16:29

AUTOSAR学习资料大集合

AUTOSAR学习资料 包括AUTOSAR基础知识的介绍 AUTOSAR在simulink中的开发、实现和验证 AUTOSAR操作系统移植方法介绍 基于AUTOSAR的电机控制器软件开发教程最近一直在研究AUTOSAR&#xff0c;发现了一些超棒的学习资料&#xff0c;今天来给大家分享分享&#x1f603; AUTOSAR基础…

作者头像 李华
网站建设 2026/3/2 23:25:27

多目标点路径规划——蚁群 + A* 算法解决室内旅行商问题

多目标点路径规划——蚁群A*算法 室内旅行商问题——送餐移动机器人&#xff08;从厨房出发到达多个目标点&#xff0c;最后返回厨房&#xff09; 1&#xff0c;A*算法规划两两之间的路径&#xff0c;并计算路径长度&#xff1b; 2&#xff0c;蚁群算法依据两点之间路径长度&am…

作者头像 李华
网站建设 2026/3/2 20:24:54

[内网流媒体] 内网画面传输到底需要多少带宽

先说结论 低清巡检(480p@8 FPS,H.264):约 0.5–1 Mbps/路。 桌面可读(720p@12–15 FPS,H.264):约 1.5–3 Mbps/路。 1080p 轻操作(15–20 FPS,H.264 硬编):约 3–6 Mbps/路。 MJPEG 同分辨率/FPS 下通常是 H.264 的 3–6 倍。 预留 20–30% 余量,避免突发大场景或…

作者头像 李华
网站建设 2026/2/15 20:00:09

(新卷,100分)- 组成最大数(Java JS Python C)

(新卷,100分)- 组成最大数&#xff08;Java & JS & Python & C&#xff09;题目描述小组中每位都有一张卡片&#xff0c;卡片上是6位内的正整数&#xff0c;将卡片连起来可以组成多种数字&#xff0c;计算组成的最大数字。输入描述“,”号分割的多个正整数字符串&a…

作者头像 李华
网站建设 2026/2/15 12:37:44

【课程设计/毕业设计】基于JavaWeb的餐厅点餐系统设计与实现基于JavaWeb的点餐系统的设计与实现【附源码、数据库、万字文档】

博主介绍&#xff1a;✌️码农一枚 &#xff0c;专注于大学生项目实战开发、讲解和毕业&#x1f6a2;文撰写修改等。全栈领域优质创作者&#xff0c;博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战 ✌️技术范围&#xff1a;&am…

作者头像 李华