如何在自己的项目中实现脚手架的命令行交互

news2025/2/27 11:22:40

背景

所在的公司大多数项目都是用Taro脚手架搭建的,因为业务上要实现多端开发 答应我,如果可以千万不要选择跨端开发🙏。所以不同环境下运行、打包会有多个命令。如下图所示:

嗯??好熟悉感觉在哪见过?

这不是我当时初学框架时候用脚手架搭建项目的时候选择配置的交互效果吗!本着学会了就是自己的的原则,立马打开package.json看看这个start命令到底干了什么!

初探

当我充满好奇打开package.json。

为了方便理解,这里先把所有的多余的方法隐藏起来。

当我把杂七杂八的都隐藏起来之后,发现最底部有一个index(),这个我懂!先执行了index方法嘛。 然后我顺着代码看去,引出了start.js文件中第一个依赖inquirer

inquirer

打开npm搜索这个依赖,大致了解一下后,原来命令行的交互都是它来实现的。

这里简单介绍一下inquirer,具体的可以去GitHub看下文档

语法

const inquirer = require('inquirer');

const test = async ()=>{const promptList = [{type: 'input',message: '输入框',name: 'xxx',}]const { xxx } = await inquirer.prompt(promptList);console.log(`返回值为${xxx}`); //返回值
} 

PS:因为inquirer.prompt()返回的是一个Promise,这里是为了使用await 所以const一个test函数。另外,结构赋值出来的变量xxx要与配置项中的name相同。

PPS:ES6语法参考阮一峰老师的ES6 入门教程

类型

input (输入 可用于填写用户信息 支持参数校验)
const promptList = [{type: 'input',message: '请输入年龄:',name: 'xxx',validate: (val)=> {if(val == 18){return '还18呢?!'}else{return true}}}] 

效果如下:

password (密码 隐藏输入)
const promptList = [{type: "password",message: "请输入您的密码:",name: "xxx",}]; 

效果如下:

confirm (确认 返回true/false)
const promptList = [{type: "confirm",message: "是否加班?",name: "xxx",}]; 

效果如下:

checkbox (复选 空格选中)
 const promptList = [{type: "checkbox",message: "请选择您的武器(可多选):",name: "xxx",choices: [{name: "JS",checked: true // 默认选中},{name: "React"},{name: "Vue"},{name: "Angular"},]}] 

效果如下:

rawlist (有序列表)
const promptList = [{type: "rawlist",message: "请选择您的职业:",name: "xxx",choices:["法师","战士","盗贼"]}]; 

效果如下:

list (无序列表)
const promptList = [{type: "list",message: "请选择您的位置:",name: "xxx",choices:["上","野","中","AD","辅助"]}]; 

效果如下:

分析

搞懂这个依赖后,发现文件中的indexmode(模式)env(环境) 这三个函数都是在让用户选取模式,并将此次操作选择的返回值带到下一个函数内,最后将所有参数代入到 exec(执行)

绘图用的是 excalidraw (在 快跑啊小卢_ 评论找到的)😄

接下来就是揭开exec的神秘面纱的时候!

嗯嗯?前两行代码我倒是看懂了,将之前所有的返回值在commandObj这个配置项中拿到具体的执行命令。那这个chalkshell是什么东西??

接下来引出我们文件中第二个依赖chalk

chalk

继续在npm平台上搜索这个依赖 <img src=“https://p3-juejin.byteimg.com/tos-cn-i-k3u1fbpfcp/4a0dae08972e4efdbdbd44c4829474fd~tplv-k3u1fbpfcp-zoom-in-crop-mark:4536:0:0:0.image?) 大致意思是实现终端的文字样式,依旧是简单介绍一下,具体可参考[GitHub](https://link.juejin.cn/?target=https%3A%2F%2Fgithub.com%2Fchalk%2Fchalk “https://github.com/chalk/chalk”” style=“margin: auto” />

颜色

console.log(chalk.red('我是红色'));
console.log(chalk.yellow('我是黄色'));
console.log(chalk.blue('我是蓝色')); 

效果如下

背景色

console.log(chalk.bgRed('我是红色'));
console.log(chalk.bgYellow('我是黄色'));
console.log(chalk.bgBlue('我是蓝色')); 

效果如下

粗细

console.log(chalk.bold('我是粗的'));
console.log(chalk('我是细的')); 

效果如下

同时设置

console.log(chalk.bgBlue.red.bold('蓝底红字粗')); 

效果如下

shelljs

老规矩先查依赖,同时贴上GitHub, 官网翻译如下

例如:

shell.exec('git help') 

效果如下

总结

到这里整个交互以及执行就显而易见了

占为己有

就这?简单!接下来就是自己写个小Demo,然后占为己有

  • 新建文件
  • 初始化 yarn init
  • 安装依赖 yarn add inquirer chalk shelljs -D
  • 在package.json中增加 "script":{ "start":"node start.js" }
  • 引入start.js
  • 最后在命令行中输入 yarn start,按下回车

嗯嗯??怎么报错了

查了一下资料,发现最新版本的chalkinquirer 不支持CommonJS语法

 "devDependencies": {"chalk": "^5.0.1","inquirer": "^9.1.2","shelljs": "^0.8.5"}, 

解决办法:将CommonJS改为ES Module,并在package.json中加入

//start.js
import inquirer from'inquirer'
import chalk from'chalk'
import shell from'shelljs'

//package.json
"type":"module" 

大功告成!

注意: 这里在Taro项目中没有使用ES Module,是因为我在package.json加入type后,Taro会报错,所以还是采用CommonJS语法,降低了依赖的版本

 "devDependencies": {"chalk": "^4.1.2","inquirer": "^8.2.4","shelljs": "^0.8.5",} 

最后

整理了一套《前端大厂面试宝典》,包含了HTML、CSS、JavaScript、HTTP、TCP协议、浏览器、VUE、React、数据结构和算法,一共201道面试题,并对每个问题作出了回答和解析。

有需要的小伙伴,可以点击文末卡片领取这份文档,无偿分享

部分文档展示:



文章篇幅有限,后面的内容就不一一展示了

有需要的小伙伴,可以点下方卡片免费领取

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

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

相关文章

LeetCode刷题(python版)——Topic69. x 的平方根

一、题设 给你一个非负整数 x &#xff0c;计算并返回 x 的 算术平方根 。 由于返回类型是整数&#xff0c;结果只保留 整数部分 &#xff0c;小数部分将被 舍去 。 注意&#xff1a;不允许使用任何内置指数函数和算符&#xff0c;例如 pow(x, 0.5) 或者 x ** 0.5 。 示例 1…

2022年下半年网络规划设计师下午真题及答案解析

1.若系统正在将( )文件修改的结果写回磁盘时系统发生掉电&#xff0c;则对系统的影响相对较大。A.目录 B.空闲块 C.用户程序 D.用户数据 2.采用三级模式结构的数据库系统中&#xff0c;如果对一个表创建聚簇索引&#xff0c;那么改变的是数据库的( )。 A.外模式…

信号(1.信号概念 2.信号的处理方式 3.信号阶段 用户态,内核态)

目录1.临界资源2.临界值3.原子性4.互斥5.什么是信号量6.什么是信号1.信号概念2.信号的处理方式3.信号阶段1.信号使用前&#xff0c;信号的产生2.为什么进程会崩溃3.信号产生中4.信号产生后1.临界资源 被多个进程能够看到看到额资源叫做临界资源 如果没有堆临界资源进任何的保护…

技术分享 | AlertManager 源码解析

作者&#xff1a;石蓓蓓 爱可生研发工程师&#xff0c;主要负责爱可生产品云DMP树产品的研发工作。 本文来源&#xff1a;原创投稿 *爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 AlertManager 是处理对应用程序的告警的…

ZIP压缩文件的打开密码和自动加密有什么不同?

ZIP是常用的压缩文件格式&#xff0c;对于重要的内容&#xff0c;我们还可以设置密码&#xff0c;从而达到保护文件内容的目的。 通过WinRAR给ZIP文件设置密码保护&#xff0c;可以设置“打开密码”和“自动加密”&#xff0c;那两者有什么不同呢&#xff1f; 设置打开密码是…

【附源码】Python计算机毕业设计万达影院售票管理系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

图相似度计算——SIMGnn源码解读

在运行代码的时候&#xff0c;需要首先指定参数&#xff0c;--histogram&#xff0c;表示使用直方图特征 1.数据集 数据集我们使用的是AIDS数据集&#xff0c;为内置的数据集&#xff0c;整个数据集大约700张图&#xff0c;每个图少于10个点&#xff0c;每个点由29维的向量组成…

多视角碰撞,探索 Serverless 企业落地更多可能性丨阿里云用户组厦门站

2022 年 9 月 24 日&#xff0c;阿里云在厦门举办了第 12 场阿里云用户组&#xff08;AUG&#xff09;活动&#xff0c;活动主题为“提效降本&#xff0c;Serverless 助力企业快速落地云原生”&#xff0c;吸引了众多技术从业者及企业管理者到场交流。 2009 年&#xff0c;伯克…

油气田工业控制系统现状

石油石化行业综述 石油石化行业分为上游、中游和下游。其中&#xff0c;上游从事的业务包括原油、天然气 的勘探、开发&#xff0c;中游主要是油气 的存储与运输&#xff0c;下游则涵盖炼油、化工、天然气加工等流程型业务及加油站零售等产品配送、销售型业务。通常情况下&…

常用 numpy 函数(长期更新)

文章目录np.where()np.zeros()np.zeros_like()np.divide()np.linalg.norm()np.uint8()np.clip()np.where() np.where有两种用法 np.where(condition,x,y) 当where内有三个参数时&#xff0c;第一个参数表示条件&#xff0c;当条件成立时where方法返回x&#xff0c;当条件不成…

超强功能WebSSH安装,解决Web远程SSH终端

项目地址&#xff1a;https://github.com/huashengdun/webssh 一个简单的 Web 应用程序&#xff0c;用作 ssh 客户端以连接到您的 ssh 服务器。它是用 Python 编写的&#xff0c;基于 tornado、paramiko 和 xterm.js。 特征&#xff1a; 支持SSH密码认证&#xff0c;包括空密…

Windows系统配置CUDA编程环境

像配置一个简单的可以进行CUDA编程的Windows系统环境&#xff0c;分别需要CUDA以及Visual stdio。 注意&#xff0c;如果是新配置的电脑&#xff0c;一定要先安装visual stdio再安装CUDA&#xff0c;否则后面在VS中创建.cu文件时容易出现找不到模块的情况。 一、安装Visual st…

动态规划--(回文子串,最长回文子序列)

代码随想录day 57 动态规划模块 回文子串,最长回文子序列 文章目录1.leetcode 647. 回文子串1.1 详细思路及解题步骤1.2 Java版代码示例2.leetcode 516. 最长回文子序列2.1 详细思路及解题步骤2.2 Java版代码示例1.leetcode 647. 回文子串 1.1 详细思路及解题步骤 该题用动态规…

2023最新SSM计算机毕业设计选题大全(附源码+LW)之java杨佑川音乐播放器908v6

大部分步骤是 1.确定选题 选题的确定需要查阅大量的资料&#xff0c;要搞清楚自己大概想要研究的方向是什么。可以选择自己感兴趣的学科或者强势的学科进行研究&#xff0c;同时要多和毕业指导老师多交流&#xff0c;征求老师的意见和建议&#xff0c;最后确立选题。计算机专…

【K8S系列】第九讲:Kubernetes 之探针

目录 一、探针是什么 二、探针类型 2.1 livenessProbe 2.1.1 容器重启策略 2.2 readinessProbe 2.3 startupProbe 2.4 总结 2.5 探针示例 2.6 配置字段介绍 三、探测机制 3.1 HTTP GET探针 3.2 TCP套接字探针 3.3 Exec探针 Tips 一、探针是什么 探针:是由 kub…

OpenCV众筹了一款ROS2机器人rae,开源、功能强、上手简单。来瞅瞅~

编辑&#xff1a;OAK中国 首发&#xff1a;oakchina.cn 喜欢的话&#xff0c;请多多&#x1f44d;⭐️✍ ▌前言 Hello&#xff0c;大家好&#xff0c;这里是OAK中国&#xff0c;我是助手君。 在2020年、2021年OpenCV分别在Kickstarter上众筹了两款OAK产品&#xff0c;均筹集…

设计模式——桥接模式

桥接&#xff08;Bridge&#xff09;模式 一、基本思想 当一个类内部具备两种或多种变化维度时&#xff0c;使用桥接模式可以解耦这些变化的维度&#xff0c;使高层代码架构稳定。 将抽象与实现分离&#xff0c;使它们可以独立变化。 用组合关系代替继承关系来实现&#xff0…

运维面试必问的中间件高频面试题

1. redis是单线程还是多线程&#xff1f; 这个问题已经被问过很多次了&#xff0c;从redis4.0开始引入多线程&#xff0c;redis 6.0 中&#xff0c;多线程主要用于网络 I/O 阶段&#xff0c;也就是接收命令和写回结果阶段&#xff0c;而在执行命令阶段&#xff0c;还是由单线程…

综述类论文_Machine Learning for Encrypted Malicious Traffic Detection(重要)

文章目录Machine Learning for Encrypted Malicious Traffic Detection: Approaches, Datasets and Comparative Study摘要存在的问题论文贡献1. 基于机器学习的加密流量检测模型的总体框架1.1 Research Target&#xff08;研究目标&#xff09;1.2 Traffic Dataset Collection…

Allegro给各种形式的板框导弧操作指导

Allegro给各种形式的板框导弧操作指导 Allegro可以给板框导弧,让加工出来的板框更加圆滑,具体操作步骤如下 板框是line形式的 选择Manufacture-Drafting-Fillet命令 在Options里面Radius输出导弧的半径,比如78.74 框选两个线段的部分 完成后的效果如下图 框选4个角落,…