• yargs 简易指南:撸一个CLI


    前言

    最近在写一个覆盖公司产品全站页面性能测试的项目,随着代码量逐渐上升,
    单纯的脚本执行的姿势,使维护成本上去了,代码散落各地,调用要打一大串。
    所以直接搞成CLI改善使用体验和降低维护成本。

    这篇文章只聚焦CLI入口的姿势及经验分享

    成品图

    在这里插入图片描述


    ![在这里插入图片描述](https://img-blog.csdnimg.cn/dac78e0df4994d999bd556b64b97a337.png)
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/749b44bc00b24555a63b25e60aa328c6.png)

    资料及思路

    搞CLI的前提就是正确的解析终端命令行传递的命令及参数,
    node生态里面,有挺多解析库的, 比如commander,minimist 这些,
    但是有一个是我之前调研过感觉不错的,刚好这次可以用上,就是yargs

    前置知识储备

    • 知道linux风格的命令行规范,比如可选参数,子命令等
    • node解析参数的原理

    采用的解析库

    yargs : API风格是链式调用,具备完善的command和复杂参数的组合,以及对应的hanlder【钩子响应】,
    有完整的typescript提示,在写的过程中,直接跳转看类型定义可以减少看文档的次数。
    这玩意让CLI代码的可读性直接拉升,哪怕你有同名参数,但是结合不同的commandhandler就可以很好的独立开来!

    需求

    • 伪CLI风格调用
      • 不是真的发布CLI,结合package.json的scripts调用,适用于整个工程使用
    • 提供多功能命令【command】,独立不同功能
      • 命令及参数支持别名,类型定义,是否必填,描述等
      • 参数错误捕获
      • 参数的自定义校验及必填
    • 命令执行过程中断

    代码实现

    接下来请看代码注释,更加清晰的介绍可以看下官网的API介绍,这里不过多介绍!

    const yargs = require('yargs/yargs');
    const process = require('process');
    const {
        hideBin } = require('yargs/helpers');
    const path = require('path');
    const {
        measureRun, measureRunAllModule } = require('./run'); // 功能实现
    const genData2File = require('./gen'); // 功能实现
    const clean = require('./clean'); // 功能实现
    
    // 检测终端输入的中断快捷键信号【cmd+c】,强行退出进程
    process.on('SIGINT', () => {
       
      process.kill(process.pid);
    });
    
    const argv = yargs(hideBin(process.argv))
      .strict()// 严格模式,参数错误直接抛出异常
      .command({
       
        // 提供子命令
        command: 'measure', // 子命令全称
        aliases: ['m'], // 子命令别名
        desc: '测量文件', // 子命令描述
        builder: function (yargs) {
       
          // 此处返回命令参数组合
          return yargs
            .check((argv) => {
       
              // .check支持手动校验接受的参数
              if (argv.all) return true;
              if (typeof argv.sourceFile !== 'string' || !argv.sourceFile) {
       
                throw new Error('CLI出错啦,源文件路径必须是字符串且不能为空!\n');
              }
              return
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
  • 相关阅读:
    Java 在Word指定段落/文本位置插入分页符
    HTML网页设计制作——响应式网页影视动漫资讯bootstrap网页(9页)
    FITC荧光素标记角叉菜胶;Carrageenan-FITC ;FITC-Carrageenan
    eBPF 入门实践教程(一):编写 eBPF 程序监控打开文件路径并使用 Prometheus 可视化
    计算机网络从三层交换机到路由器ospf
    知乎乱码、b站首页乱码、蓝奏云网盘打不开都是DNS惹的祸!修改设备的DNS
    Netty(5)第一行代码Hello World
    字节跳动岗位薪酬体系曝光,看完感叹:不服不行
    JSON介绍
    高压功率放大器是什么东西
  • 原文地址:https://blog.csdn.net/bomess/article/details/126711061