前端架构: 脚手架框架之yargs的11种基础核心特性的应用教程

脚手架框架之yargs的基础核心特性与应用


1 )概述

  • yargs 是脚手架当中使用量非常大的一个框架
  • 进入它的npm官网: https://www.npmjs.com/package/yargs
    • 目前版本: 17.7.2
    • Weekly Downloads: 71,574,188 (动态数据)
    • 最近更新:last month (github)
    • 说明这是一个比较优质的库

2 )对 yargs 的应用

  • 准备一个脚手架工程,比如 xyzcli
  • 进行 npm 初始化 $ npm init -y
  • 修改package.json中的关键配置
    • 添加 bin 属性,其值设置为: “bin/index.js”
  • 在脚手架工程目录中执行安装开发依赖
    • $ npm i yargs -S

2.1 初步实践,了解其基本API

  • 编写 bin/index.js
    #!/usr/bin/env nodeconst yargs = require('yargs/yargs');
    const { hideBin } = require('yargs/helpers');
    console.log(hideBin(process.argv));
    yargs();
    
    • 现在执行 $ npm link 方便调试
    • 执行 $ xyzcli --help, 可以看到输出 [ '--help' ]

2.2 继续优化,窥探其基本用法

  • 好,接着修改 bin/index.js
    #!/usr/bin/env nodeconst yargs = require('yargs/yargs');
    const { hideBin } = require('yargs/helpers'); // 用于参数解析
    const arg = hideBin(process.argv);yargs(arg).argv;
    
  • 现在执行 $ xyzcli --help 可以看到输出
    选项:--help     显示帮助信息                                                 [布尔]--version  显示版本号                                                   [布尔]
    
  • 执行 $ xyzcli --version
    1.0.0
    
  • 这时候说明最简易版脚手架已经开发好了

2.3 探究 strict 模式

  • 现在发现差异,如果执行 $ xyzcli --help 有输出
  • 但是执行 $ xyzcli -h 就没有输出了
  • 可以加入 strict 模式,可以对无用参数输入进行提示,如下添加
    yargs(arg).strict().argv;
    
  • 继续执行 $ xyzcli -h 看到输出了报错提示
    选项:--help     显示帮助信息                                                 [布尔]--version  显示版本号                                                   [布尔]无法识别的选项:h
    
  • 注意这个 strict 在 lerna 源码中有用到

2.4 对 usage 这个API的使用

  • 继续测试 usage
    yargs(arg).usage('Usage: xyzcli [command] <options>').strict().argv;
    
  • 执行 $ xyzcli --help,查看输出
    Usage: xyzcli [command] <options>选项:--help     显示帮助信息                                                 [布尔]--version  显示版本号                                                   [布尔]
    
  • 看到,最顶部多了 Usage: xyzcli [command] <options>

2.5 对 demandCommand 这个API的使用

  • 这个API表示最少输入多少命令

    yargs(arg).usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().argv;
    
  • 只执行 $ xyzcli, 可查看输出

    Usage: xyzcli [command] <options>选项:--help     显示帮助信息                                                 [布尔]--version  显示版本号                                                   [布尔]A command is required. Pass --help to see all available commands and options.
    
  • 可以发现,最后多了一行 A command is required. Pass --help to see all available commands and options.

  • 这个API就可以对命令参数过少时进行提示

2.6 对 alias 这个API的使用

  • 对现有命令或参数起别名

    yargs(arg).usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version').argv;
    
  • -h 进行测试,执行 $ xyzcli -h,输出

    Usage: xyzcli [command] <options>选项:-h, --help     显示帮助信息                                             [布尔]-v, --version  显示版本号                                               [布尔]
    
  • -v 进行测试,执行 $ xyzcli -v,输出

    1.0.0
    

2.7 对 wrap 这个API的使用

  • 对终端cli窗口的宽度的设定
    yargs(arg).usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version').wrap(50) // 这里设定为 50.argv;
    
  • 执行 $ xyzcli -h,查看宽度
    Usage: xyzcli [command] <options>选项:-h, --help     显示帮助信息               [布尔]-v, --version  显示版本号                 [布尔]
    
  • 修改宽度为 80
    .wrap(80) // 这里设定为 80
    
  • 再次执行 $ xyzcli -h,查看宽度
    Usage: xyzcli [command] <options>选项:-h, --help     显示帮助信息                                             [布尔]-v, --version  显示版本号                                               [布尔]
    
  • 可以看到两者不同宽度的区别
  • 如果想要占满终端屏幕, 可以使用 terminalWidth()
    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version').wrap(cli.terminalWidth()) // 这里.argv;
    
  • terminalWidth() 会返回终端宽度,这里没有必要做演示了,会铺满终端

2.8 对 epilogue 这个API的使用

  • 它可以在结尾加上我们想要说的话

    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version').wrap(cli.terminalWidth()).epilogue('We hope you guys work happily every day!') // 注意这里.argv;
    
  • 执行 $ xyzcli -h, 查看输出

    Usage: xyzcli [command] <options>选项:-h, --help     显示帮助信息                                                                  [布尔]-v, --version  显示版本号                                                                    [布尔]We hope you guys work happily every day!
    
  • 可以看到最后一行,输出 We hope you guys work happily every day!

  • 结合 dedent 库来使用,首先进行安装,$ npm i dedent -S

  • 基于 dedent 库来设定 epilogue, 达成去除缩进(包含首位空格)的目的

    #!/usr/bin/env nodeconst yargs = require('yargs/yargs');
    const { hideBin } = require('yargs/helpers');
    const dedent = require('dedent'); // 注意这里const arg = hideBin(process.argv);
    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version').wrap(cli.terminalWidth()).epilogue(dedent`Welcome to use xyzcli command line.We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli`).argv;
    
  • 执行 $ xyzcli -h,查看输出

    Usage: xyzcli [command] <options>选项:-h, --help     显示帮助信息                                                                  [布尔]-v, --version  显示版本号                                                                    [布尔]Welcome to use xyzcli command line.
    We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli
    

2.9 对 options 这个API的使用

  • 全局选项,对所有 command 都有效
    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version')// .alias('d', 'debug') // 这个设置别名,同下面,二者取其一即可.wrap(cli.terminalWidth()).epilogue(dedent`Welcome to use xyzcli command line.We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli`).options({debug: {type: 'boolean',describe: 'Bootstrap debug mode',alias: 'd' // 这里添加了,上面就可以忽略了,推荐写在这里}}).argv;
    
  • 这里设置了 options,内部传入一个对象进行配置,这里别名的两种设置方式,推荐下面这种,在options内部设定
  • 执行 $ xyzcli -h, 查看输出结果
    Usage: xyzcli [command] <options>选项:-d, --debug    Bootstrap debug mode                                                          [布尔]-h, --help     显示帮助信息                                                                  [布尔]-v, --version  显示版本号                                                                    [布尔]Welcome to use xyzcli command line.
    We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli
    
  • 可见,这里添加了 -d 和 --debug 的选项

2.10 对 option 这个API的使用

  • 这个 option 和 options 这两个API用途差不多, 但使用方式不一样
    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version')// .alias('d', 'debug').wrap(cli.terminalWidth()).epilogue(dedent`Welcome to use xyzcli command line.We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli`).options({debug: {type: 'boolean',describe: 'Bootstrap debug mode',alias: 'd' // 这里添加了,上面就可以忽略了,推荐写在这里}}).option('registry', {type: 'string',describe: 'Define global registry',alias: 'r',// hidden: true, // 这个就不会出现在提示中,但是可以作为开发调试使用 --registry 或 -r}).argv;
    
  • option 这个API,可以配置 hidden 选项,这个配置之后,不会出现在终端提示中,但是可作为开发调试使用,$ xyzcli -r
    • 需要后期结合这个参数做对应的处理程序,这块先略过
    • 同时,需注意,options 中是没有 hidden 配置选项的
  • 执行 $ xyzcli -h,查看输出结果
    Usage: xyzcli [command] <options>选项:-d, --debug     Bootstrap debug mode                                                         [布尔]-r, --registry  Define global registry                                                     [字符串]-h, --help      显示帮助信息                                                                 [布尔]-v, --version   显示版本号                                                                   [布尔]Welcome to use xyzcli command line.
    We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcliA command is required. Pass --help to see all available commands and options.
    

2.11 对 group 这个API的使用

  • 对命令进行分组管理, 这次全量代码都在这里
    #!/usr/bin/env nodeconst yargs = require('yargs/yargs');
    const { hideBin } = require('yargs/helpers');
    const dedent = require('dedent');const arg = hideBin(process.argv);
    const cli = yargs(arg)cli.usage('Usage: xyzcli [command] <options>').demandCommand(1, 'A command is required. Pass --help to see all available commands and options.').strict().alias('h', 'help').alias('v', 'version')// .alias('d', 'debug').wrap(cli.terminalWidth()).epilogue(dedent`Welcome to use xyzcli command line.We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli`).options({debug: {type: 'boolean',describe: 'Bootstrap debug mode',alias: 'd' // 这里添加了,上面就可以忽略了,推荐写在这里}}).option('registry', {type: 'string',describe: 'Define global registry',alias: 'r',// hidden: true, // 这个就不会出现在提示中,但是可以作为开发调试使用 --ci}).group(['debug'], '开发选项:').group(['registry'], '其他选项:').argv;
    
  • 执行 $ xyzcli -h,查看输出结果
    Usage: xyzcli [command] <options>开发选项:-d, --debug  Bootstrap debug mode                                                            [布尔]其他选项:-r, --registry  Define global registry                                                     [字符串]选项:-h, --help     显示帮助信息                                                                  [布尔]-v, --version  显示版本号                                                                    [布尔]Welcome to use xyzcli command line.
    We hope you guys work happily every day!For more information, please visit: https://xxx.com/xxx/xyzcli
    
  • 可以看到 Dev Options 这一分组,把 debug 包含进去了,剩余其他的都在 选项中

3 )参考 lerna 的实现细节

  • https://github.com/lerna/lerna/blob/main/libs/core/src/lib/cli.ts

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

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

相关文章

【Webpack】处理图片资源

处理图片资源 过去在 Webpack4 时&#xff0c;我们处理图片资源通过 file-loader 和 url-loader 进行处理 现在 Webpack5 已经将两个 Loader 功能内置到 Webpack 里了&#xff0c;我们只需要简单配置即可处理图片资源 1. 配置 const path require("path");modul…

美国突然致敬中本聪

作者&#xff1a;秦晋 有点看不懂美国的神操作。 2月16日&#xff0c;据《Bitcoin Magazine》报道&#xff0c;比特币的竞争对手、美国参议员伊丽莎白-沃伦对比特币的立场突然180度大转弯。由反对立场转为支持立场。让很多行业媒体出乎意料&#xff0c;甚至惊掉下巴。 报道称&a…

Web Components详解-HTML Templates

前言 在前面Web Components系列文章的插槽中&#xff0c;我们使用直接在body中写入html标签的形式来承载shadowDOM中的元素&#xff0c;这么做会使标签在DOM多渲染一次&#xff0c;不仅降低了性能&#xff0c;还使标签直接暴露在页面中&#xff0c;遵循组件的可重用性、隔离性…

Unity3D 九宫格地图加载逻辑详解

前言 Unity3D是一款强大的游戏开发引擎&#xff0c;拥有丰富的功能和工具&#xff0c;可以帮助开发者快速构建出各种类型的游戏。在游戏开发中&#xff0c;地图加载是一个非常重要的环节&#xff0c;九宫格地图加载是一种常用的地图加载方式&#xff0c;可以有效地提高游戏性能…

文件上传漏洞--Upload-labs--Pass01--前端绕过

一、前端绕过原理 通俗解释&#xff0c;我们将写有恶意代码的php后缀文件上传到网页&#xff0c;网页中的javascript代码会先对文件的后缀名进行检测&#xff0c;若检测到上传文件的后缀名为非法&#xff0c;则会进行alert警告。若想上传php后缀的文件&#xff0c;就要想办法对…

人工智能学习专栏文章汇总

人工智能大潮已来&#xff0c;stay hungry, stay foolish! 人工智能技术学习类文章汇总&#xff1a; 人工智能学习与实训笔记&#xff08;一&#xff09;&#xff1a;零基础理解神经网络-CSDN博客 人工智能学习与实训笔记&#xff08;二&#xff09;&#xff1a;神经网络之图…

Html的<figure><figcaption>标签

Html的<figure><figcaption>标签 示例一: <figure><figcaption>figcaption001, fig标题1 </figcaption><figcaption>figcaption002, fig标题2 </figcaption><div style"width:calc(100px*2); height:calc(100px*2); back…

力扣经典题:环形链表的检测与返回

1.值得背的题 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/ struct ListNode *detectCycle(struct ListNode *head) {struct ListNode*fasthead;struct ListNode*slowhead;while(fast!NULL&&fast->…

解锁Spring Boot中的设计模式—03.委派模式:探索【委派模式】的奥秘与应用实践!

委派模式 文章目录 委派模式1.简述**应用场景****优缺点****业务场景示例** 2.类图3.具体实现3.1.自定义注解3.2.定义抽象委派接口3.3.定义具体执行者3.4.定义委派者(统一管理委派任务)3.5.定义委派者管理类 4.测试4.1.controller层4.2.测试不同场景4.2.1.测试生产部门计算费用…

html5移动端适配;检测浏览器信息函数

html5移动端适配 //动态改变font-size大小 (function changeFontSize() {let resizeEvt orientationchange in window ? orientationchange : resizeif (!isPC()) {let docEl document.documentElement;// recalc function () {let clientWidth docEl.clientWidth;docEl.…

【GPT-2】论文解读:Language Models are Unsupervised Multitask Learners

文章目录 介绍zero-shot learning 零样本学习 方法数据Input Representation 结果 论文&#xff1a;Language Models are Unsupervised Multitask Learners 作者&#xff1a;Alec Radford, Jeff Wu, Rewon Child, D. Luan, Dario Amodei, I. Sutskever 时间&#xff1a;2019 介…

java.lang.NumberFormatException: For input string: “!“

文章目录 MyBatis XML文件查询报错&#xff1a;For input string: "!"原因调整办法OGNL表达式 MyBatis XML文件查询报错&#xff1a;For input string: “!” <if test"memberInfoDrawing.phone ! null and memberInfoDrawing.phone ! and memberInfoDrawi…

Hadoop-Yarn-NodeManager都做了什么

一、源码下载 下面是hadoop官方源码下载地址&#xff0c;我下载的是hadoop-3.2.4&#xff0c;那就一起来看下吧 Index of /dist/hadoop/core 二、上下文 在我的<Hadoop-Yarn-启动篇>博客中已经简要的分析了NodeManager的启动过程&#xff0c;NodeManager是管理整个集…

MongoDB聚合运算符:$add

$add运算符将将数字相加或将数字和日期相加。如果参数之一是日期&#xff0c;则 $add会将其他参数视为毫秒&#xff0c;并添加到日期中。 语法 { $add: [ <expression1>, <expression2>, ... ] }参数可以是任何有效的表达式&#xff0c;只要能否解析为数值或日期…

C++中.h与.hpp文件的差异问答

.h文件与.hpp文件在C编程中的区别主要基于约定和偏好&#xff0c;而不是C语言或其编译器强制执行的任何技术差异。以下是这些差异的概述&#xff1a; 约定&#xff1a; .h 文件&#xff1a;此扩展名源于C编程&#xff0c;表示头文件。它在C中常用于头文件&#xff0c;但不一定表…

AppSrv-配置故障转移(23国赛真题)

2023全国职业院校技能大赛网络系统管理赛项–模块B:服务部署(WindowServer2022) 文章目录 知识补充配置步骤验证故障转移配置页面。设置为“热备用服务器”模式。伙伴服务器“DC2”为“待机”状态。为备用服务器保留5%的地址。状态切换间隔为60分钟。启用身份验证,密码为“…

四种mfc140u.dll丢失的解决方法,有效恢复mfc140u.dll丢失

mfc140u.dll文件的重要性&#xff0c;当系统中出现mfc140u.dll丢失的情况时&#xff0c;可能会导致一系列问题和影响。因此&#xff0c;保持mfc140u.dll文件的完整性对于系统和应用程序的稳定运行至关重要。一旦出现mfc140u.dll文件丢失的情况&#xff0c;我们需要采取有效的方…

怎样录屏?掌握这些方法,让你轻松驾驭!

随着科技的进步&#xff0c;如今我们可以通过屏幕录制软件来记录我们的电脑屏幕活动。无论是为了分享游戏精彩瞬间&#xff0c;还是为了制作教程或演示&#xff0c;录屏都成为了许多人的需求。可是你知道怎样录屏才是最好的吗&#xff1f;接下来&#xff0c;本文将为您介绍三种…

前端面试必备八股文——HTMLCSS

HTML src和href的区别 src和href都是用来加载外部资源&#xff0c;区别如下 src当浏览器解析到该元素时&#xff0c;会暂停其他资源的加载和处理&#xff0c;直到该资源加载完成。 它会将资源内容嵌入到当前标签所在的位置&#xff0c;将其指向的资源下载应用到文档内&#…

Mybatis速成(一)

文章目录 Mybatis速成&#xff08;一&#xff09;前言1. 快速入门1.1 入门程序分析1.2 入门程序实现1.2.1 准备工作1.2.1.1 创建springboot工程1.2.1.2 数据准备 1.2.2 配置Mybatis1.2.3 编写SQL语句1.2.4 单元测试 1.3 解决SQL警告与提示 2. JDBC介绍(了解)2.1 介绍2.2 代码2.…