开发超爽的nodejs命令行程序

开发nodejs命令行程序以一般会到什么库?

  • 首选commander提供一套标化化的命令行解析,非常好用。
  • 其次是prompts、inquirer,enquirer等库来提供交互输入提示,可以提供更加友好的用户体验
  • 还有一个是ansicolor、chalk来进行命令行输出的颜色控制,用来在控制

有了以下三板斧,基本上就可以写出一个很好命令行程序了吗?

如果想要更爽些,则推荐使用MixedCli

MixedCli是一个命令行应用开发框架,其主要是对commander/prompts/logsets的封装,提供了更加友好的命令行开发体验。

MixedCli主要提供三个能力:

  • 自动为命令行选项推断生成交互提示
  • monorepo工程集成动态命令集成,使分布在不同包中的命令可以形成完整的命令行应用
  • 使用logsets集成一系列增强的终端增强输出组件

下面的使用示例:

第1步:创建工程

以一个典型的monorepo为例开始:


flexapppackagescli     corevuereact

示例工程名为flexapp,工程中的包名分别是@flexapp/core@flexapp/cli@flexapp/vue@flexapp/react

第2步:创建命令行应用

@flexapp/cli是命令行应用,对外提供flexapp的命令行工具。

1. 安装依赖

npm install mixed-cli
pnpm add mixed-cli
yarn add mixed-cli

2. 创建cli.js

@flexapp/cli包中创建cli.js文件,内容如下:

flexapppacakgesclicli.jsinit.jspackage.json

主要内容如下:

const { outputStr,MixedCli } = require("mixed-cli") 
const initCommand = require("./init")const cli = new MixedCli({name: "flexapp",version: "1.0.0",include: /^\@flexapp\//, // 显示logologo: String.raw`____   ____                  __            \   \ /   /___   ___________|  | _______   \   Y   /  _ \_/ __ \_  __ \  |/ /\__  \  \     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/`, 
})
cli.register(initCommand)
cli.run()
{"name": "@flexapp/cli","version": "1.0.0","bin": {"flexapp": "cli.js"}
}

@flexapp/cli仅仅是一个命令行的入口:

  • 重点:include: /^\@flexapp\// 的意思是告诉mixed-cli,当执行flexapp命令时,会在当前工程中搜索以@flexapp/开头的包,然后包中声明在cli文件夹下的所有命令被合并到flexapp命令中。
  • @flexapp/cli中使用cli.register(iniCommand),注册一个通用的init命令,该命令的实现在init.js中。 一般可以在此工程提供一些通用命令,而其他的命令声明逻辑在分别在@flexapp/*/cli/*.js等包中实现。

第3步: 创建命令

从上面可以看到@flexapp/cli非常简单,主要是一些通用的命令和命令行的入口。而真正的命令声明在其他的包中,比如@flexapp/vue@flexapp/react等包中。

然后接下来,我们在@flexapp/vue中创建一个dev命令,用于启用vue项目。

flexapppacakgesclicli.jsdev.jspackage.jsonvuesrcindex.tsclidev.js      // dev命令的实现pacakge.json

接下来我们编写dev.js文件,内容如下:


const { MixedCommand } = require('mixed-cli');/*** @param {import('mixed-cli').MixedCli} cli*/
module.exports = (cli)=>{                const devCommand = new MixedCommand();devCommand.name('dev').description("以开发模式启动应用")      // 未指定默认值,自动使用text类型提供                       .option("-p,--port <port>","指定端口号",3000)                      .option("-d,--debug" ,"调试模式",{ default:true,prompt:true })      .option("-h,--host <host>","指定主机名",{default:"localhost",prompt:true})                         .option("-e,--env [value]","环境变量",{ prompt:false })                                   .option("-m,--mode <mode>","指定模式",{choices:["development","production","test","debug"]}).option("-f,--framework [value]","开发框架",{choices:[{title:"vue",value:1},{title:"react",value:2,description:"默认"},{title:"angular",value:3}]}).option("-o,--open","自动打开浏览器",{prompt:{          // 自定义提示type:"toggle",message:"是否自动打开浏览器?",}}).action((options)=>{            console.log("run dev")})return devCommand
} 

{"name": "@flexapp/vue","version": "1.0.0","main": "index.js","dependencies": {"mixed-cli": "^1.0.0"}
}
  • src/cli目录下创建dev.js文件,用于声明dev命令。cli目录下的所有js文件会被自动加载,每个文件均导出一个函数,该函数需要返回一个或多个MixedCommand实例。cli目录是一个默认的约定目录,可以通过cli.cliDir参数修改。
  • 创建MixedCommand实例,用于声明命令。MixedCommand继承自commanderCommand类,因此可以使用commander的所有特性。
  • package.json只需要将mixed-cli添加为依赖即可。
  • 同样地,我们可以在@flexapp/react,@flexapp/app等包中创建其他的命令。

第4步: 使用命令

我们在flexapp应用中开发。

  • 安装@flexapp/cli

::: code-group

npm install @flexapp/cli @flexapp/vue
pnpm add @flexapp/cli @flexapp/vue
yarn add @flexapp/cli @flexapp/vue

安装@flexapp/cli包后,就可以在命令行中使用flexappflexapp init命令了。

此时执行一下flexapp命令,会看到如下输出:

____   ____                  __
\   \ /   /___   ___________|  | _______\   Y   /  _ \_/ __ \_  __ \  |/ /\__  \\     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/
版本号:1.0.0 
Usage: flexapp [options] [command]Options:-v, --version      当前版本号-h, --help         显示帮助Commands:init [options]    初始化应用  // 只有这个命令 
  • 接下来我们安装@flexapp/vue
npm install @flexapp/vue @flexapp/vue
pnpm add @flexapp/vue @flexapp/vue
yarn add @flexapp/vue @flexapp/vue

:::

此时再执行一下flexapp命令,会看到如下输出:

____   ____                  __
\   \ /   /___   ___________|  | _______\   Y   /  _ \_/ __ \_  __ \  |/ /\__  \\     (  <_> )  ___/|  | \/    <  / __ \_\___/ \____/ \___  >__|  |__|_ \(____  /\/           \/     \/
版本号:1.0.0 
Usage: flexapp [options] [command]Options:-v, --version      当前版本号-h, --help         显示帮助Commands:init [options]    初始化应用  # dev命令是由@flexapp/vue包提供的dev [options]     以开发模式启动应用  //   [!code ++]

第5步: 自动推断交互提示

在上面dev命令中,共指定了6个选项,当执行flexapp dev命令时, 会根据配置自动交互引导用户输入选项,如下:

dev_cmd.png

  • 命令行的交互体验与使用commander时完全一样
  • 仅当选项未指定默认值或满足一定条件时,才会根据一定的规则自动推断交互提示类型。详见自动推断交互提示
  • MixedCli使用prompts来实现交互提示,因此支持prompts的所有交互类型特性。详见prompts

第6步:终端增强界面组件

然后接下来我们开始在action函数中编写各种任务,此时就可以使用上logsets提供的各种终端增强界面组件

banner1.png

banner2.png

createTasks.png

list.png

log.jpg

log2.jpg

log3.jpg

log4.jpg

log5.jpg

log6.jpg

log7.jpg

log8.jpg

log9.jpg

log10.jpg

log11.jpg

progressbar.png

tasklist.demo.gif

tasklist.png

tasks.note.png

tree1.png

tree2.png

小结

  • MixedCli是一个基于commander的命令行工具开发框架,提供了一套命令行开发的最佳实践。
  • MixedCli能对所有命令行选项自动推断交互提示类型,当用户没有输入选项时,会自动引导用户输入选项,提供友好的用户体验。
  • MixedCli可以在当前工程自动搜索满足条件的包下声明的命令进行合并,从而实现扩展命令的目的。此特性可以保持@flexapp/cli包的精简和稳定,给用户一致的体验。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

DNS解析原理和k8s DNS 实践

1. 问题背景 1.1 域名解析异常 近期开发的一个功能&#xff0c;需要在k8s集群容器环境中调用公司内部api&#xff0c;api提供了内网域名&#xff0c;解析内网域名异常导致请求超时&#xff0c;因此梳理了下DNS的知识点。 可以先看到下面&#x1f447;这段配置&#xff0c;修…

ubuntu20.04安装cuda11.4以及cudnn

系统&#xff1a;ubuntu20.04硬件配置&#xff1a;GPU3080、CPU未知通过《软件和更新》在附加驱动选项中添加了驱动&#xff1a; 1.检查自己电脑支持的cuda nvidia-smi4. 下载cuda11.4.2 wget https://developer.download.nvidia.com/compute/cuda/11.4.2/local_installers/c…

Java中CompletableFuture 异步编排的基本使用

一、前言 在复杂业务场景中&#xff0c;有些数据需要远程调用&#xff0c;导致查询时间缓慢&#xff0c;影响以下代码逻辑运行&#xff0c;并且这些浪费时间的逻辑与以后的请求并没有关系&#xff0c;这样会大大增加服务的时间。 假如商品详情页的每个查询&#xff0c;需要如下…

【高等数学之泰勒公式】

一、从零开始 1.1、泰勒中值定理1 什么是泰勒公式?我们先看看权威解读: 那么我们从古至今到底是如何创造出泰勒公式的呢? 由上图可知&#xff0c;任一无穷小数均可以表示成用一系列数字的求和而得出的结果&#xff0c;我们称之为“无穷算法”。 那么同理我们想对任一曲线来…

Every Nobody Is Somebody 「每小人物都能成大事」

周星驰 NFT Nobody即将发售&#xff0c;Nobody共创平台 Every Nobody Is Somebody Nobody 关于Nobody&#xff1a;Nobody是一款Web3共创平台&#xff0c;旨在为创作者提供一个交流和合作的场所&#xff0c;促进创意的产生和共享。通过该平台&#xff0c;创作者可以展示自己的作…

程序员试用期转正工作总结

一、试用期工作总结 在公司的三个月试用期中&#xff0c;我完成了以下工作&#xff1a; 完成了XX个功能模块的开发&#xff0c;包括XX模块、XX模块和XX模块。参与了XX个项目的开发和上线&#xff0c;其中XX项目、XX项目和XX项目是我主导的。优化了现有系统的性能&#xff0c;特…

Linux最常用的几个系统管理命令

文章目录 Linux最常用的几个系统管理命令查看网络信息的原初 ifconfig默认无参数使用-s显示短列表配置IP地址修改MTU启动关闭网卡 显示进程状态 ps语法几个实例默认情况显示所有进程查找特定进程信息 任务管理器的 top常规使用显示完整命令设置信息更新次数设置信息更新时间显示…

自行车商城网站网页设计与制作web前端设计html+css+js成品。电脑网站制作代开发。vscodeDrea

【自行车商城网站网页设计与制作web前端设计htmlcssjs成品。电脑网站制作代开发。vscodeDrea】 https://www.bilibili.com/video/BV1wT4y1p7jq/?share_sourcecopy_web&vd_sourced43766e8ddfffd1f1a1165a3e72d7605

知识】分享几个摄像头的选型相关知识

【知识】分享几个摄像头的选型相关知识 目录 【知识】分享几个摄像头的选型相关知识一、前言二、正文1、先了解一下监控摄像头的种类1.1、云台型&#xff08;云台型一体摄像机&#xff09;1.2、枪机型&#xff08;枪型摄像机&#xff09;1.3、球机型&#xff08;球型摄像机&…

二叉树及其实现

二叉树 一.树的概念及结构1.1树的概念1.2相关概念 2.二叉树的概念及结构2.1 概念2.2 特殊的二叉树 3.二叉树的遍历3.1 前序、中序以及后序遍历3.2 层序遍历3.3 判断二叉树是否是完全二叉树3.4 二叉树的高度3.5 二叉树的叶子节点个数3.6 二叉树的第k层的节点个数3.7 二叉树销毁3…

SpringBoot+RocketMQ集群(dledger)部署完整学习笔记

文章目录 前言一、单台集群部署二、多台集群部署1.修改配置2.dashboard修改 三、整合springboot1.引入pom和修改yml2.编写消费者3.编写生产者4.测试效果 总结 前言 RocketMQ集群方式有好几种 官网地址 https://rocketmq.apache.org/zh/docs/4.x/deployment/01deploy 2m-2s-asy…

国产AI工具钉钉AI助理:开启个性化助手服务的新篇章

钉钉AI助理是钉钉平台的一项功能&#xff0c;它可以根据用户的需求提供个性化的AI助手服务。用户可以在AI助理页面一键创建个性化的AI助理&#xff0c;如个人的工作AI助理、旅游AI助理、资讯AI助理等。企业也可以充分使用企业所沉淀的知识库和业务数据&#xff0c;在获得授权后…