如何在自己的项目中实现脚手架的命令行交互
admin
2024-01-25 03:58:52
0

背景

所在的公司大多数项目都是用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平台上搜索这个依赖

颜色

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道面试题,并对每个问题作出了回答和解析。

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

部分文档展示:



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

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

相关内容

热门资讯

关于校园生活的名人名言 关于校园生活的名人名言 1) 学校是造就人的工场。——[捷]夸美纽斯  2) 亡而存之,废而举之...
历史上的5月8日发生了哪些事件... 历史上的5月8日发生了哪些事件?2020年5月8日,李清杉和黄芳迎牵小手谈恋爱
请问这是一部什么电影? 请问这是一部什么电影?预见未来?
问一本世界名著的名字 问一本世界名著的名字《小妇人》吧。看过的书里这本最符合了。希望可以帮助到您。悲惨世界是不是
形容人自律的成语 形容人自律的成语严于律己成语发音:yán yú lǜ jǐ成语解释:律:约束。严格地约束自己。形容对...
阿泽是什么? 阿泽是什么?别埋汰狗好不好!!
生人勿扰!免得伤其无孤的意思 生人勿扰!免得伤其无孤的意思生人勿扰:直译--不认识的陌生人不要前来打扰。其实是不欢迎不认识的人,不...
历史上甄宓真的与大小乔并称当世... 历史上甄宓真的与大小乔并称当世三大美人吗?江东有二乔,河北甄宓俏。”这句话出自哪里?史书上写了吗?那...
龙血战神女主角是谁? 龙血战神女主角是谁?女主角:灵曦龙辰的老婆是女主角,名字是灵曦。
原创 民... 在6月29日,南宁民族影城IMAX激光影厅的启幕仪式如火如荼地进行,这座备受影迷期待的IMAX激光影...
村里新建文化礼堂,求对联一副! 村里新建文化礼堂,求对联一副!上联后字开头,下联塘字开头,谢谢!曾氏礼堂落成后来居上勤学苦练知识广塘...
英语在线翻译 小朋友 英语在线翻译 小朋友英语在线翻译 小朋友中文:小朋友=英文:Children
易拉罐小制作怎么做 易拉罐小制作怎么做要简单滴简单明了,很简单吧
把人挤出底线,算犯规吗? 把人挤出底线,算犯规吗?不算 不过动作幅度过大有可能就算了不算 但不要故意往底线整 人家站0度三...
这才是煎豆腐最好吃的家常做法,... 周末傍晚,隔壁厨房飘来一阵勾人的焦香,混着一点辛辣的诱惑。我忍不住探出头,只见楼下王姨正端着盘金黄微...
感冒吃药上瘾怎么办? 感冒吃药上瘾怎么办?戒掉...那是一件很严重的事情,现在市面上的感冒药大多都有抗生素,抗生素是治病的...
你觉得你会如何度过生命中最后的... 你觉得你会如何度过生命中最后的时光?生命的结束是人生旅途的最后部分,如果知道明天终将离去,那么,回头...
怀君属秋夜,散步咏凉天的含义 怀君属秋夜,散步咏凉天的含义《秋夜寄邱员外》作者:韦应物怀君属秋夜,散步咏凉天。空山松子落,幽人应未...
忽然觉得自己很累,有人说生活就... 忽然觉得自己很累,有人说生活就像一场梦亦真亦假,难道真的如此嘛?其实生活不是一场梦,只是我们太不懂稿...