前端架构: 实现脚手架处理简单的命令注册和参数解析

实现简单的命令注册和参数解析


1 )概述

  • 这里不会使用任何第三方工具,而是给大家讲解一下参数解析的一个实现原理
  • 实现两个目标
    • 第一目标是注册一个命令 $ xyzcli init 这个命令就可以完成一个自己的操作
    • 第二个是实现参数解析
      • 希望能够实现 --version 的一个参数解析
      • 以及 init -name 这样的一个参数解析

2 )实现

  • 那么问题来了,如何能识别到这个 init 命令 $ xyzcli init

  • 在nodejs中有一个 process 的内置库

  • 在 process 中会有一个 argv 参数,这个就会把我们所有的参数给罗列下来

    • 第1个返回值是:当前node命令的具体路径
    • 第2个返回值是:当前脚手架命令,如xyzcli的具体路径
    • 第3个返回值是:command, 在这里可以就是 init
      #!/usr/bin/env node// 定义执行命令的库
      const lib = {init() {console.log('init')}
      }// 获取并解析 argv
      const { argv } = require('process');
      // console.log(argv)
      const command = argv[2];
      // console.log(command); // init
      if (command && lib[command]) {lib[command](); // 执行
      } else {console.log('请输入命令')
      }
      
  • 通过以上方法,就可以解析出来 init 命令

  • 那如果需要解析出 --name ooo 这种参数呢?

    #!/usr/bin/env nodeconst { argv } = require('process');const options = argv.slice(3); // 解析从第3个后面
    let [option, param] = options;
    option = option.replace('--', '');// 测试参数
    console.log('option: ', option); // name
    console.log('param: ', param); // ooo
    
  • 如何应用参数呢?

    #!/usr/bin/env node// 定义执行命令的库
    const lib = {init({ option, param }) {console.log('执行 init 流程', option, param)}
    }// 获取并解析 argv
    const { argv } = require('process');
    const command = argv[2];
    let option, param;
    const options = argv.slice(3);
    if (options) {[option, param] = options;option = option.replace('--', '');
    }
    if (command && lib[command]) {lib[command]({ option, param }); // 执行
    } else {console.log('请输入命令')
    }
    
  • 注意,实际参数解析往往比较复杂,比如:

    • $ xyzcli init --name -p 22 --test 33
    • 这种往往参数比较复杂,而且对应的值非常不确定,这个时候,参数处理就会变得非常困难
    • 如果自己开发和兼容此类问题,将会占用非常大的工作
    • 通常我们用一些库进行处理, 这里只做原理解析
  • 对全局命令的处理 $ xyzcli --version

    • 注意,这里 --version 属于 command, 也就是出现在了 argv 的第三位
    • 这种,就是顶级的或全局的 option
      #!/usr/bin/env node// 定义执行命令的库
      const lib = {init({ option, param }) {console.log('init');console.log('执行 init 流程', option, param);},version: '1.0.0'
      }
      // 获取并解析 argv
      const { argv } = require('process');
      const command = argv[2];
      let option, param;
      const options = argv.slice(3);
      if (options.length) {[option, param] = options;option = option.replace('--', '');
      }// 执行命令
      if (command && lib[command]) {lib[command]({ option, param }); // 执行
      } else if(command.startsWith('--') || command.startsWith('-')) {// 这里是全局 optionsconst globalOption = command.replace(/--|-/g, '');if (globalOption === 'version' || globalOption === 'V') {console.log(lib['version']);}
      } else {console.log('请输入命令')
      }
      
  • 以上演示,完成整个脚手架的一个初步版本开发

  • 注意这里不是成熟的案例,只是阐述如何做的原理

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

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

相关文章

春节专题|产业7问:区块链厂商的现在和未来——基础设施厂商

2023转瞬即逝,不同于加密领域沉寂一整年后在年末集中爆发,对于我国的区块链厂商而言,稳中求胜才是关键词,在平稳发展的基调下,产业洗牌也悄无声息的到来。 从产业总体而言,在经过了接近3年的快速发展后&…

C语言系列1——详解C语言:变量、常量与数据类型

目录 写在开始1. 变量与常量的概念1.1. 变量1.2. 常量1.3. 变量与常量的比较1.4. 选择变量还是常量 2. C语言中的基本数据类型2.1. 整型(Integer Types)2.2. 浮点型(Floating-Point Types)2.3. 字符型(Character Type&…

android studio下开发flutter

文章目录 1. 配置环境 https://flutter.cn/docs/get-started/install2. android studio下开发flutter 1. 配置环境 https://flutter.cn/docs/get-started/install 2. android studio下开发flutter 打开Android Studio -> File -> Settings -> Plugins 搜索Dart插件 …

Linux和Windows文件共享实现方式

安装 samba 服务 sudo apt-get install samba samba-common新增用户 groupadd sfp -g 6000 useradd sfp -u 6000 -g 6000 -s /sbin/nologin -d /dev/null设置密码 sudo smbpasswd -a sfp修改配置文件 sudo vi /etc/samba/smb.conf追加参数 [file]comment sfpfile #说明…

C++ 动态规划 计数类DP 整数划分

一个正整数 n 可以表示成若干个正整数之和,形如:nn1n2…nk ,其中 n1≥n2≥…≥nk,k≥1 。 我们将这样的一种表示称为正整数 n 的一种划分。 现在给定一个正整数 n ,请你求出 n 共有多少种不同的划分方法。 输入格式 共一行&…

【vue3学习笔记】shallowReactive与shallowRef;readOnly与shallowReadOnly;toRaw与markRaw

尚硅谷Vue2.0Vue3.0全套教程丨vuejs从入门到精通 课程 P158节 《shallowReactive与shallowRef》笔记: reactive()与shallowReactive():reactive()处理后的数据是响应式的,对象内嵌套的深层结构全部是响应式的。shallowReactive()处理后的数据…

Javaweb之SpringBootWeb案例之propagation属性案例演示的详细解析

案例 接下来我们就通过一个案例来演示下事务传播行为propagation属性的使用。 需求:解散部门时需要记录操作日志 由于解散部门是一个非常重要而且非常危险的操作,所以在业务当中要求每一次执行解散部门的操作都需要留下痕迹,就是要记录操作…

蓝桥杯每日一题----唯一分解定理

唯一分解定理 1.内容 任何一个大于1的整数n都可以分解成若干个质数的连乘积,如果不计各个质数的顺序,那么这种分解是惟一的,即若n>1,则有 n ∏ p i j n\prod{p^j_i} n∏pij​ 这里的 p i p_i pi​是质数。可以进行简单证明…

C语言字符串处理

在 C 语言中&#xff0c;字符串是以字符数组的形式表示的&#xff0c;以空字符 \0 结尾。C 语言提供了一系列的字符串处理函数&#xff0c;可以用于字符串的操作、查找、比较等。以下是一些常用的 C 语言字符串处理函数&#xff1a; 1. 字符串定义与初始化 #include <stdi…

【数据结构】链表OJ面试题4《返回链表入环的第一个结点》(题库+解析)

1.前言 前五题在这http://t.csdnimg.cn/UeggB 后三题在这http://t.csdnimg.cn/gbohQ 给定一个链表&#xff0c;判断链表中是否有环。http://t.csdnimg.cn/Rcdyc 记录每天的刷题&#xff0c;继续坚持&#xff01; 2.OJ题目训练 10. 给定一个链表&#xff0c;返回链表开始…

golang集成sentry: go-redis

网上没有找到go-redis集成sentry的库&#xff0c; 所以我简单实现了一个 代码&#xff1a; https://github.com/Shujie-Tan/go-redis-sentry 使用方法&#xff1a; import (redis_sentry "github.com/Shujie-Tan/go-redis-sentry" ) rdb : redis.NewClient(&re…

如何一键启动、停止或重启运行在服务器内的幻兽帕鲁游戏服务进程?

如果你是用腾讯云轻量应用服务器一键部署的幻兽帕鲁服务器&#xff0c;那么可以在面板一键启动、停止或重启运行在服务器内的幻兽帕鲁游戏服务进程&#xff08;注意并非对服务器整机进行操作&#xff09;&#xff0c;无需手动在服务器内部运行命令。 详细教程地址&#xff1a;h…

Xubuntu16.04系统中修改系统语言和系统时间

1.修改系统语言 问题&#xff1a;下图显示系统语言不对 查看系统中可用的所有区域设置的命令 locale -a修改/etc/default/locale文件 修改后如下&#xff1a; # File generated by update-locale LANG"en_US.UTF-8" LANGUAGE"en_US:en"LANG"en_US…

高中数学:不等式

一、性质 1、同向可加性 2、同向同正可乘 3、正数乘方开方&#xff08;n∈Z&#xff0c;n≥2&#xff09; 常见题型 1、比较大小 分式比较大小&#xff0c;先去分母作差法比较大小带根号的无理数比较大小&#xff0c;直接两边开方因式分解&#xff08;较难&#xff09; 2、…

TiDB分布式关系型数据库简介

目录 1.关于TiDB2.TiDB的整体架构3.使用场景4. TiDB VS MySQL5.参考本文主要介绍TiDB架构以及使用场景。 1.关于TiDB TiDB 是由 PingCAP 公司开源的一款分布式关系型数据库,它支持水平扩展、强一致性和高可用性。TiDB 兼容 MySQL 协议,可以无缝替代 MySQL,特别适合处理大规…

Java17之使用Lambda表达式对对象集合中指定的字段进行排序

Java17之使用Lambda表达式对对象集合中指定的字段进行排序 文章目录 Java17之使用Lambda表达式对对象集合中指定的字段进行排序1. 集合对象排序1. Java实体类2. 正序排序3.倒序排序 1. 集合对象排序 Java8起可用 List 的 sort 方法进行排序&#xff0c;形参为函数式接口Compara…

C#利用接口实现选择不同的语种

目录 一、涉及到的知识点 1.接口定义 2.接口具有的特征 3.接口通过类继承来实现 4.有效使用接口进行组件编程 5.Encoding.GetBytes(String)方法 &#xff08;1&#xff09;检查给定字符串中是否包含中文字符 &#xff08;2&#xff09;编码和还原前后 6.Encoding.GetS…

【算法】字符串-洛谷

文章目录 P5015 [NOIP2018 普及组] 标题统计P5734 【深基6.例6】文字处理软件 P5015 [NOIP2018 普及组] 标题统计 NOIP2018 普及组] 标题统计 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 在怎么读取数据输入的问题上纠结了很久。 本来想用cin>>x的形式一个字符一个…

netstat命令

netstat 是一个计算机网络命令行工具&#xff0c;用于显示网络连接、路由表和网络接口等网络相关信息。netstat 命令可以在各种操作系统上使用&#xff0c;包括 Windows、Linux 和 macOS 等。 在使用 netstat 命令时&#xff0c;可以提供不同的选项来显示不同类型的网络信息。…

猫头虎分享已解决Bug || Invariant Violation in React: Element Type is Invalid ‍

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通鸿蒙》 …