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

Inquirer.js CLI交互开发指南:告别命令行黑盒子 命令行交互是Node.js工程化的重要环节,其本质是通过结构化输入输出实现人机高效协作。Inquirer.js基于readline底层封装,提供input、list、checkbox等7类开箱即用的prompt组件,内置ANSI渲染、键盘事件映射与终端兼容处理,显著降低CLI工具开发门槛。相比原生readline需手动处理光标控制和跨平台差异,或prompt-sync缺乏异步支持等局限,Inquirer以可插拔架构和成熟生态(如inquirer-autocomplete-prompt)支撑动态加载、条件跳转 阅读详情

命令行交互核心实现

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

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 的界面,会在一个缓存文件中,输入完以后,缓存文件被删除掉
  • 我们输入的结果会被保留下来,如上图
  • 这样做的好处是在文本编辑器中输入复杂的内容

readline

  • readline,是 nodejs 当中的一个内置库,主要帮我们去管理数据流的
  • 命令行当中要交互的方式,一定是需要用户提供一些输入的
  • readline 就可以很好的帮我们去一次一次的读取这个输入流
  • 注意,这个输入不仅是指我们输入一些字符,还包含我们键盘上输入的一切,如上,下,空格,回车等
  • 基本使用
    import * as readLine from 'readline';
    
    const rl = readLine.createInterface({
    	input: process.stdin,
    	output: process.stdout,
    });
    
    rl.question('your name: ', (answer) => {
    	console.log(answer);
    	rl.close(); // 关闭读取流
    })
    
  • readline 主要用途是根据传入的输入流逐行读取信息
  • 回车的时候,会认为这行输入结束,并且把所有输入的内容传递到输出流中进行展示
  • 这是readline的核心用途
  • 如果调试 readline 源码,可知,它内部会强制将函数转换为构造函数
    if (!(this instanceof Interface)) {
      return new Interface(input, output, completer, terminal);
    }
    
  • 接着是对 StringDecoder的判断和赋值,这个也是node的一个内置库
    if (StringDecoder === undefined) {
      StringDecoder = require('string_decoder').StringDecoder;
    }
    
  • 再之后,定义了一些列的参数,调用了 EventEmitter
    EventEmitter.call(this)
    
    • 这个用途是使用 this 继承 EventEmitter, this内部就会生成一些列的属性信息,如 _events, _eventsCount
    • 让当前 Interface 实例具备事件驱动的能力,因为nodejs有单线程,非阻塞IO,事件驱动的特性
    • 也就是说事件驱动,在单线程的nodejs中是非常重要的
  • 再接着,定义一些参数, 对 input 进行判断,也就是分析 input 参数
    if (input && input.input) {
      // ....
    }
    
  • 再往后找,看readline是如何做事件监听的
    this.output = output; // output: WriteStream 系统输出流
    this.input = input; // input: ReadStream 系统输入流
    
    // ...
    
    emitKeypressEvents(input, this) // 这里就是监听用户在终端中的键盘输入
    
    • 在 emitKeypressEvents 函数内部,会调用一个 emitKeys 的方法
    • 这里是核心, 其原理和源码不在这里进行剖析
【架构师(第十二篇)】脚手架之命令行交互工具 inquirer.js 使用方法 最近找到一个VUE的文档,它将VUE的各个知识点进行了总结,整理成了《Vue 开发必须知道的36个技巧》。内容比较详实,对各个知识点的讲解也十分到位。有需要的小伙伴,可以点击下方卡片领取,无偿分享。 阅读详情

相关推荐

用React开发终端界面:原理、实现与工程实践

声明式UI是现代前端开发的核心范式,它通过组件化和状态驱动视图的理念,将开发者从繁琐的DOM操作中解放出来。其底层原理基于虚拟DOM的差异计算和高效的协调算法,确保界面更新既直观又高性能。这一技术价值在于大幅提升了复杂交互界面的开发效率和可维护性,尤其在需要频繁状态同步的场景中优势明显。在应用场景上,声明式UI不仅适用于Web浏览器,其抽象渲染层的设计思想也能桥接到其他图形环境,比如命令行终端。本文将热词“React”和“终端”结合,探讨如何将React的声明式开发体验引入终端界面开发,通过实现一个微型渲染

weixin_33894640的博客 322

【常用的Npm包】Inquirer

Inquirer 为node命令输入提供一个好用好看的界面

未来可期 2290

现代CLI工具入口设计:从run-main.ts看工程化实践与性能优化

命令行界面(CLI)工具作为开发者与系统交互的重要桥梁,其设计原理直接影响开发效率和用户体验。一个优秀的CLI入口需要遵循单一职责原则,将环境校验、依赖管理、错误处理和信号监听等关注点分离。在技术实现上,通过延迟加载(Lazy Loading)机制优化启动性能,结合全局异常捕获和友好错误提示提升健壮性,这些工程实践使得CLI工具能够更好地适应复杂场景。特别是在AI工具链和前端框架生态中,run-main.ts这样的入口文件已成为现代工程化的标准模式,它不仅处理基础启动逻辑,还支持插件系统、会话管理等高级特性

weixin_30340819的博客 373

npm inquirer库的用法

inquirer 是一个基于 Node.js 的命令行交互式用户界面的库,可以通过提示用户输入或选择来获取用户的输入。 你可以使用 npm 命令来安装 inquirer 库: npminstall inquirer 然后在你的 JavaScript 代码中引入 inquirer 库: const inquirer = require('inquirer'); 接下来,你就可以使用 inquir...

weixin_35753431的博客 790

Inquirer.js, 通用交互 命令行 用户界面的集合.zip

Inquirer.js, 通用交互 命令行 用户界面的集合 Inquirer.js 通用交互 命令行 用户界面的集合。版本 4.x 只支持 node 6和 over 。 对于 node 4支持,请使用版本 3.x 。目录文档文档安装工具示例方法对象问题回答分

嘉立创EDA实战:从点亮第一盏灯到完成首块PCB

本文详细介绍了使用嘉立创EDA从点亮第一盏LED灯到完成首块PCB的全过程。通过实战案例分享,包括原理图绘制、PCB设计、DRC检查、覆铜操作等关键步骤,帮助电子设计爱好者快速掌握嘉立创EDA的使用技巧,并避免常见的设计错误。

weixin_30314793的博客 376

inquirer.js 构建交互式命令行工具,全网详细 inquirer.js中文教程

Inquirer 是一个流行的 Node.js 库,用于构建交互式命令行界面。它提供了一个简单而强大的 API,使得创建用户友好的交互变得容易。可以看作是一款强大的命令行交互式问答库。

NolanKy 的 技术博客 1997

Qt开发中彻底解决中文乱码问题

中文乱码问题主要源于编码不一致需要同时设置控制台和Qt应用程序的编码确保项目文件和环境配置的编码一致文件操作时注意指定正确的编码。

qq_53832058的博客 3406

前端架构师-week5-命令行交互原理

readline 的使用方法和实现原理 高能:深入讲解 readline 键盘输入监听实现原理 秀操作:手写 readline 核心实现 命令行样式修改的核心原理:ansi 转移序列讲解 响应式库 rxjs 快速入门 放大招:手写命令行交互式列表组件

chengbo_eva的博客 788

大模型部署之二--vllm+docker部署

本文介绍了在openEuler系统上快速本地部署Qwen3-8B、DeepSeek-R1、Qwen2.5deng 大模型的完整流程。通过modelscope管理模型,采用vllm+docker模式实现部署。主要步骤包括:1)安装conda环境;2)配置docker;3)下载模型;4)编写docker compose配置文件;5)启动服务。特别针对2卡4090服务器提供了参数配置建议,并给出常用命令和参考资料。文档还提示不同系统和平台可能存在差异,为开发者提供了本地部署大型语言模型的实用指南。

weixin_39279863的博客 1133

亚马逊商品评论爬取与情感分析实战:Python+BeautifulSoup高效解析(附反爬技巧)

本文详细介绍了使用Python和BeautifulSoup库高效爬取亚马逊商品评论并进行情感分析的完整实战流程。文章从环境搭建、核心代码编写入手,重点讲解了如何通过设置请求头、添加延迟等防封策略应对反爬机制,确保数据抓取的稳定性。最后,利用TextBlob库对评论文本进行情感分析,并通过可视化图表直观展示产品口碑,为电商选品与市场调研提供数据支持。

weixin_29046611的博客 1164

Bun vs Node.js:不是替代,而是开发体验的精准加速

JavaScript 运行时生态中,Bun 作为新兴轻量级运行时,正以毫秒级启动、零 node_modules 依赖、内置 TS 转译等特性重构开发工具链。其底层基于 JavaScriptCore 的精简设计,规避了 V8 冷启动开销,专注短生命周期任务;模块解析机制跳过 CommonJS 动态加载,直连预编译缓存,显著提升 CLI 工具与构建脚本性能。技术价值在于将‘等待时间’从开发流程中剥离,释放工程师对业务逻辑的专注力。典型应用场景包括本地开发服务器(Vite/SvelteKit)、边缘函数、自动化

weixin_33849215的博客 416

LVGL仪表盘实战:5分钟用lv_meter打造汽车仪表UI(附完整代码)

本文详细介绍了如何使用LVGL的lv_meter组件在5分钟内构建专业汽车仪表盘UI。从环境配置、刻度定制到指针动画和性能优化,提供完整代码示例和实战技巧,帮助开发者快速实现嵌入式设备上的高效仪表盘设计。

k5l6m的博客 426

inquirer.js——交互式命令行用户界面

inquirer.js

weixin_44384273的博客 2068

Spring Boot应用Docker化实战:从Dockerfile编写到镜像推送完整流程

本文详细介绍了将Spring Boot应用Docker化的完整实战流程。从环境准备、项目审视,到编写高效且安全的Dockerfile,重点讲解了多阶段构建、镜像层优化、Spring Boot分层JAR等核心技巧,并涵盖了镜像构建、验证、调试以及最终推送至仓库并集成CI/CD的最佳实践,帮助开发者构建生产级Docker镜像。

butter的博客 1023

华为OD机考双机位C卷 - 风险投资计划(Java & Python& JS & C/C++ & GO )

华为OD机考双机位C卷 - 风险投资计划(OD上机考试双机位C卷)。提供Java、C++、Python、Go、JavaScript源码实现,并提供完整思路讲解,以及在线OJ模拟做题。

算法大师! 548

用户与命令交互 启动方式

一个用户与命令行交互的工具 – inquirer inquirer为每个问题提供很多参数: type:表示提问的类型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor; name: 存储当前问题回答的变量; message:问题的描述; default:默认值; choices:列表选项,在某些type下可用,并且包含一个分隔符(separator); validate:对用户的回答进行校验; filter:对用户的

qq_42359718的博客 427

TMF8801 ToF激光测距传感器原理图设计,已量产(距离传感器)

这张 TMF8801 小板的外围结构就很有代表性。核心传感器是 U1 TMF8801,但真正构成量产价值的是外围那一圈:U2 把 VCC 整理成 3V,R1/R2/R5 与 R3/R4/R6 两组 10K 电阻稳定默认态,Q2 2N7002 和 U3 SN74LVC2G07DCKR 处理控制链路,传感器边上还有 C1/C4/C5 三颗 100nF 紧贴去耦。

不脱发的程序猿 162

基于inquirer实现一个控制台多级选择交互功能

🎈在前端脚手架工具中经常会看到控制台输入参数等操作。例如Vue-cli中初始化项目会提示选择一些参数等。所以在开发脚手架工具或者node控制台程序,就需要用到inquirer工具或者类似的工具。但是使用过inquirer工具的同学应该知道,目前inquirer工具支持的交互方式只有以下几种:`input`, `number`, `confirm`, `list`, `rawlist`, `expand`, `checkbox`, `password`, `editor`,最近自己在封装一个脚手架工具时需要

Twinkle_sone的博客 1191

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

迈瑞BS系列全自动生化分析仪LIS协议接口手册(内含HL7和ASTM)

迈瑞BS系列全自动生化分析仪LIS协议接口手册,内含HL7和ASTM)

node之inquirer基本用法和常用属性入门

用户与命令行交互的工具

Vv_mkziyuan 2271

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

4.7 Inquirer.js使用示例

使用文档:https://github.com/SBoudrias/Inquirer.js 示例链接:https://github.com/SBoudrias/Inquirer.js/tree/master/packages/inquirer/examples

LetsStudy的博客 293

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

inquirer介绍及配合lerna在Vue中使用示例

Inquirer是一个用于创建交互式命令行工具的 Node.js 库,常用于收集用户输入。它提供了多种类型的提示框,可以用于创建交互式应用程序(比如 CLI 工具),并且支持各种类型的输入,包括文本、选择框、确认框、密码输入框等。这个库在开发过程中非常有用,尤其是在构建脚本和自动化工具时。

正在解锁骑着骆驼去南极的世界 1073

inquirerjs 简介及API详解

inquirerjs 是什么 Inquirerjs 是一个用来实现命令行交互式界面的工具集合。它帮助我们实现与用户的交互式交流,比如给用户提一个问题,用户给我们一个答案,我们根据用户的答案来做一些事情,典型应用如 plop等生成器工具。 它有以下特色: 提供错误回调 可以提出问题 解析输入的答案 验证答案 管理分层提示 文档 安装 $ npm install inquirer 使用 var inquirer = require('inquirer'); inquirer .p

林中路 3450

【Web前端开发】npm你真的会用吗?

npm是一款JavaScript包管理器(JavaScript Package Manager),同类的工具还有yarn。 npm感觉上是一个很简单的工具,实际并不简单!

popgis的专栏 3632

node学习--自定义脚手架(五):使用inquirer实现命令行问答交互

二、在action.js文件中,引入inquirer,并使用。一、使用npm下载inquirer。

coding_ch的博客 424

inquirerjs简介

这里写目录标题inquirerjs 是什么使用简单功能参数介绍方法inquirer.prompt(questions, answers) -> promiseinquirer.registerPrompt(name, prompt)inquirer.createPromptModule() -> prompt function案例普通用法多次输入 input校验 validate数字 number密码 password确认confirm选项组 list /rawlist/expand多选 che

榴莲不好吃的专栏 3650
上一篇: Nestjs框架: 可集成在Nestjs上的日志模块pino和winston的使用
下一篇: 前端架构: 脚手架工具rxjs的快速上手应用
Wang's Blog
博客等级 码龄12年 7434粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值