前端架构: 脚手架命令行交互核心实现之inquirer的应用教程

命令行交互核心实现

  • 核心目标:实现命令行行交互,如List
  • 命令行的交互呢比命令行的渲难度要更大,因为它涉及的技术点会会更多
  • 它涉及以下技术点
    • 键盘输入的一个监听 (这里通过 readline来实现)
    • 计算命令行窗口的尺寸
    • 清屏
    • 光标的移动
    • 输出流的静默 (我们输出的内容, 不让它去输出到当前的这个终端中)
    • 借助输入输出流,引出输入输出流的一个监听以及事件库 events
    • ansi escaped code 转义字符
  • 命行交互其实是有一定复杂度的, 在这个过程中,最重点的库和命行交互最重点库是两个 readlineinquirer

inquirer

  • inquirer 是一个命令行交互常用的库,Weekly Downloads 30,375,340 (动态数据)
  • 作为一个命令行交互的库能做到这个程度,可以说是非常的不简单,而且一直在持续的进行维护,目前已经达到9.2.15版本了
  • 安装 $ npm i -S inquirer
  • 使用示例1:input类型演示
    import inquirer from 'inquirer';
    inquirer
      .prompt([
        {
          type: 'input',
          name: 'yourName',
          message: 'your name:',
        }
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 这里根据文档上的框架结构
    • 通过 type, name, message 三个字段即可完成初始化创建
    • 更多,参考文档:https://www.npmjs.com/package/inquirer#question
效果实例
  • 另外,比较常用的还有
    • default 默认值字段
    • validate 字段是一个回调
      • 用于对字段的校验,只有校验返回 true的时候校验才会结束
    • transformer 字段用于处理信息展示的回调
      • 也就是这个函数内部返回的值是展示的值
      • 返回的值还是之前的 name 字段
      • 更多的像是表单中的 placeholder 仅作为展示
    • filter 字段是一个回调
      • 它会最终改变 answers 最终的结果
      • 会最终改变 name 字段
  • 其他: choice 在匹配 List 列表的时候会用到
  • 注意,prompt 方法内部接受的是一个数组,可以写多个对象来收集数据
  • 使用示例2: 多字段演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'input',
    	    name: 'yourName',
    	    message: 'your name:',
    	    default: 'Lee',
    	    validate: function(v) {
    	    	return v === 'Wang'
    	    },
    	    transformer: function(v) {
    	    	return 'your input name: ' + v // 仅作为展示
    	    },
    	    filter: function(v) {
    	    	return v;
    	    	// return v + '123' // 改变最终值
    	    }
    	  },
    	  {
    	  	type: 'number', // 这种,在没有 validate 的情况下,如果输入的是非数字, 会变成 NaN
    	  	name: 'num',
    	  	message: 'your number',
    	  },
    	  // ...
      ])
      .then((answers) => {
        console.log(answers); // 最终打印的是一个对象,多个字段
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 在示例1中已做了详细说明,这里不再赘述
效果实例
  • 使用示例3: confirm 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'confirm', // 二选一功能
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: false,
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
效果实例
  • 使用示例4: list 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'list', // 列表单选
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 0, // 这里 default 是 下面choices 的索引
    	    choices: [
    	    	{value: 1, name: 'LiLy'},
    	    	{value: 2, name: 'Lucy'},
    	    	{value: 3, name: 'Lee'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
效果实例
  • 使用示例5: expend 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'expand', // 简写选择
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 'red',
    	    choices: [
    	    	{value: 'red', key: 'R'},
    	    	{value: 'green', key: 'G'},
    	    	{value: 'blue', key: 'B'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 简写选择功能,除了 Rgb 还有一个 h
    • 输入 h 回车,会得到 help 提示,列出了所有选项
    • 输入 r 回车,会得到 red, 输入 g 回车,会得到 green
效果实例
  • 使用示例6: checkbox 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'checkbox', // 复选框
    	    name: 'choice',
    	    message: 'your choice:',
    	    default: 0,
    	    choices: [
    	    	{value: 1, name: 'Lily'},
    	    	{value: 2, name: 'Lucy'},
    	    	{value: 3, name: 'Lee'},
    	    ]
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
    • 这里提供 a 全选,空格键 选中,i 反选的功能
    • 默认,上下箭来选择
效果实例
  • 使用示例7: password 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'password', // 密码框
    	    name: 'password',
    	    message: 'your password:',
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
效果实例
  • 使用示例8: editor 类型演示
    import inquirer from 'inquirer';
    
    inquirer
      .prompt([
    	  {
    	  	type: 'editor', // 编辑器
    	    name: 'editor',
    	    message: 'your editor text:',
    	  },
      ])
      .then((answers) => {
        console.log(answers);
      })
      .catch((error) => {
        if (error.isTtyError) {
          // Prompt couldn't be rendered in the current environment
        } else {
          // Something else went wrong
        }
      });
    
效果实例
  • 上面中间的这个类似 vim 的界面,会在一个缓存文件中,输入完以后,缓存文件被删除掉
  • 我们输入的结果会被保留下来,如上图
  • 这样做的好处是在文本编辑器中输入复杂的内容

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/413092.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

术中导航系统开发:助力医疗机构提升手术效率和安全性

一、市场概况 近年来,随着医学影像技术和计算机技术的快速发展,术中导航系统得到了广泛应用。根据QY Research的报告,2022年全球术中导航系统市场规模达到了15亿美元,预计到2028年将达到28亿美元。 二、技术特点 术中导航系统主…

【AIGC】OpenAI推出王炸级模型sora,颠覆AI视频行业

文章目录 强烈推荐前言什么是OpenAI Sora?工作原理:算法原理:应用场景展望与其他视频生成模型相比有哪些优势和不足?优点缺点 总结强烈推荐专栏集锦写在最后 强烈推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易…

ubuntu20.04安装和使用 Maldet (Linux Malware Detect)

1、下载 Maldet sudo wget http://www.rfxn.com/downloads/maldetect-current.tar.gz 2、解压Maldet sudo tar -xvf maldetect-current.tar.gz 3、进入到Maldet目录,然后运行安装脚本 sudo ./install.sh 4、安装ClamAV sudo apt-get update sudo apt-get in…

最好的游泳耳机推荐,年度最佳四大拔尖品牌盘点!

游泳耳机是专为水下运动爱好者设计的耳机,它可以让人们在游泳时享受音乐和音频内容。随着科技的发展,市面上出现了越来越多高品质、高性能的游泳耳机品牌。对于游泳者来说,选择一款合适的游泳耳机至关重要。 接下来将为大家推荐四大高品质的…

【selenium】八大元素定位方式|xpath css id name...

目录 一、基础元素定位 二、cssSelector元素定位——通过元素属性定位 三、xpath元素定位——通过路径 1 、xpath绝对定位 (用的不多) 缺点:一旦页面结构发生变化(比如重新设计时,路径少两节)&#x…

Springboot教程(二)——过滤器、拦截器

过滤器 过滤器可以在调用控制器方法之前进行一些操作,过滤器类一般放在filter包下。 配置类注册 使用过滤器时,要实现Filter接口,并重写doFilter方法: class TestFilter : Filter {override fun doFilter(request: ServletReq…

基于ZYNQ的PCIE高速数据采集卡的设计(三)硬件设计

采集卡硬件设计 3.1 引言 采集卡的硬件设计是实现采集功能的基础,良好的硬件设计可以使采集功能更容 易实现,方便软件开发。本章基于第二章的硬件设计方案来详细介绍采集卡硬件设计。 包括载卡和子卡的芯片的选型、配置和具体电路的设计。载卡和子卡…

ubuntu20.04安装实时内核补丁PREEMPT_RT

参考: Ubuntu 18.04安装 RT-PREEMPT 实时内核及补丁【过程记录】_ubuntu18.04 preempt rt linux 5.6.19-CSDN博客 https://github.com/UniversalRobots/Universal_Robots_ROS_Driver/blob/master/ur_robot_driver/doc/real_time.md当前内核:5.15.0-94-ge…

Redis哨兵模式和Redis Cluster模式

文章目录 🔊博主介绍🥤本文内容Redis Cluster 模式支持自动故障转移功能吗?Redis Cluster 模式支持自动故障转移功能和哨兵有什么区别?Redis Cluster 模式和哨兵模式(Sentinel)在自动故障转移方面有一些关键…

【BUG 记录】MyBatis-Plus 处理枚举字段和 JSON 字段

【BUG 记录】MyBatis-Plus 处理枚举字段和JSON字段 一、枚举字段(mysql环境已测、postgresql环境已测)1.1 场景1.2 定义枚举常量1.3 配置枚举处理器1.4 测试 二、JSON字段(mysql环境已测)2.1 导包2.2 使用对象接受2.3 测试 三、JS…

2024年1月京东洗衣机行业数据分析:TOP10品牌销量销额排行榜

鲸参谋监测的京东平台1月份洗衣机市场销售数据已出炉! 根据鲸参谋电商数据分析平台显示,今年1月份,京东平台上洗衣机的销量约160万件,环比上个月增长约42%,同比去年下滑7%;销售额约28亿元,环比…

大数据云迁移的难点及对应解决方案

企业正站在一个新的起点上:将庞大的数据资源迁移到云端。这不仅是一场技术能力的较量,更是对企业业务连续性和数据安全的重大考验。本文将深入探讨大数据云迁移的难点,并提供相应的解决方案,以期帮助企业在这场转型之旅中走得更稳…

软件License授权原理

软件License授权原理 你知道License是如何防止别人破解的吗?本文将介绍License的生成原理,理解了License的授权原理你不但可以防止别人破解你的License,你甚至可以研究别人的License找到它们的漏洞。喜欢本文的朋友建议收藏关注,…

迪萧科技有限公司邀您参观2024生物发酵展

参展企业介绍 浙江迪萧科技有限公司位于浙江杭州,是一家专注于膜技术的国家高新企业。公司针对食品饮料、医药保健等领域的过程分离与控制、产品提取及浓缩、废料资源化利用等提供全方案解决服务。坚持以“顾客至上、优质服务、卓越品质”为原则。为客户企业提供清…

【数据集】中国历史取水量数据集(1990-2015)

中国历史取水量数据集(1990-2015) 1 数据概述2 数据下载数据文件命名方式和使用方法3 各部门用水比例计算参考1 数据概述 中国历史取水量数据集(1990-2015)提供中国1990-2015年农业灌溉、市政、工业生产、畜牧业、一次能源开采、发电六个部门取水量的空间分布,空间精度为…

【JavaSE】实用类——String、日期等

目录 String类常用方法String类的equals()方法String中equals()源码展示 “”和equals()有什么区别呢? StringBuffer类常用构造方法常用方法代码示例 面试题:String类、StringBuffer类和StringBuilder类的区别?日期类Date类Calendar类代码示例…

UE4 材质多张图片拼接成一张图片(此处用2×2拼接)

UE4 材质多张图片拼接成一张图片&#xff08;此处用22拼接&#xff09; //TexCoord,TextureA,TextureB,TextureC,TextureDfloat3 ReturnTexture TextureA; if(TexCoord.x < 0.5 && TexCoord.y < 0.5) {ReturnTexture TextureA; } else if(TexCoord.x > 0.5…

试用北大库博Cobot-SCA工具

最近试用北大软件工具的库博-SCA工具&#xff0c;其产品全称是库博软件成分分析与同源漏洞检测工具软件。这个产品名称有点长&#xff0c;至于原因&#xff0c;可能是为了与市场上其它SCA工具进行区分吧。北大库博SCA不是像大多数SCA工具&#xff0c;解析构建文件中的依赖组件进…

C#与VisionPro联合开发——跳转页面

1、跳转页面并打开相机 From1 所有代码展示 using System; using System.IO; using System.Windows.Forms; //引入VisionPro命名空间 using Cognex.VisionPro;namespace ConnectCamera {public partial class Form1 : Form {public Form1() {InitializeComponent();}CogAcqFif…

现在转行学python,前景和优势有哪些?

正所谓“男怕入错行&#xff0c;女怕嫁错郎”&#xff0c;可想而知进入一个正确的行业有多重要。IT行业的高薪吸引着越来越多转行“入坑”&#xff0c;python作为目前的大势&#xff0c;是很多人转行的首选。为什么这么多的人都想转行学习python&#xff0c;python有哪些前景和…