从0搭建vue3组件库: 如何完整搭建一个前端脚手架?( 二 )

提示版本号,kitty-ui -h显示帮助信息等 。而实现这些基本原理就是process.argv
create-kitty下的入口文件index.js修改为
#! /usr/bin/env nodeconsole.log(process.argv);然后执行这个文件并带几个参数

从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

文章插图
然后会发现用户传的参数在process.argv数组的第二位以后,这样我们就可以根据用户输入不同参数做不同操作了 。但是这样很不方便,所以我们可以使用框架来解决 。
使用第三方库解析参数首先安装command-line-args
pnpm add command-line-args -S接下来看它是如何获取用户输入参数的
#! /usr/bin/env nodeimport commandLineArgs from 'command-line-args';//配置命令参数const optionDefinitions = [{ name: 'version', alias: 'v', type: Boolean },{ name: 'arg1', type: String },{ name: 'arg2', type: Number },];const options = commandLineArgs(optionDefinitions);console.log(options);
从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

文章插图
注意这里使用了es6的语法,所以需要将package.json中的type指定为module
接下来实战一些,检测用户输入--help指令,然后我们输出一个帮助的配置 。
首先安装command-line-usage
pnpm add command-line-usage -S首先引入commandLineUsage,然后写个配置
import commandLineUsage from 'command-line-usage';//帮助内容const helpSections = [{header: 'create-kitty',content: '一个快速生成组件库搭建环境的脚手架',},{header: 'Options',optionList: [{name: 'version',typeLabel: '{underline boolean}',description: '版本号',},{name: 'arg1',typeLabel: '{underline string}',description: '参数1',},{name: 'arg2',typeLabel: '{underline number}',description: '参数2',},],},];command-line-args中配置个help命令,当获取到help的时候直接打印
const optionDefinitions = [{ name: 'help', alias: 'h', type: Boolean },{ name: 'version', alias: 'v', type: Boolean },{ name: 'arg1', type: String },{ name: 'arg2', type: Number },];const options = commandLineArgs(optionDefinitions);if (options.help) console.log(commandLineUsage(helpSections))
从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

文章插图
但是这样好像不太好看 。这里可以借助chalk工具给打印加个颜色
pnpm add chalk -S我比较喜欢绿色,所以让控制台输出绿色的字体
import chalk from 'chalk';...if (options.help) console.log(chalk.green(commandLineUsage(helpSections)))
从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

文章插图
当然它还有很多用法,感兴趣可以自己去研究 。到这里关于用户参数解析部分差不多就结束了,下面介绍如何实现交互式命令
交互式命令当我们使用脚手架时,有些会提示我们输入项目名称和选择模板等,比如执行npm create vite的时候
从0搭建vue3组件库: 如何完整搭建一个前端脚手架?

文章插图
如果只是简单交互可以通过node自带的process.stdin或者readline模块实现 。比如用readline实现一个简单的交互式命令
import readline from 'readline'...const rl = readline.createInterface({input: process.stdin,output: process.stdout,});rl.question('你是谁?', function (anwser) {console.log(`我是${anwser}`);//添加close事件,不然不会结束rl.close();});

经验总结扩展阅读