Node CLI工具原理解析(1):https://developer.aliyun.com/article/1394831?spm=a2c6h.13148508.setting.16.55964f0ez7IHhI
使用npm install
安装依赖,会根据bin
中的描述,创建1个command
到exec/filepath.js
的软链
软链所在目录区别于是否是global
安装
这个目录可以通过npm bin
指令查看
全局路径和前面使用 which npm
获取的一致,当前项目的路径即在node_modules/.bin
中
如果是本地开发CLI时,可以使用npm link
指令根据bin
描述信息,自动创建软链到npm bin
所示的目录中,通过-g
参数区别是否是全局
# 项目工作目录下执行 npm link # or npm link -g
命令行参数
前面主要都在围绕命令展开介绍。要实现工具的丰富功能离不开参数的组合,本小节就介绍下Node
里如何处理Command
与Options
。
我们可以通过process.argv
方法获取到运行时的 命令行入参
js
复制代码
console.log(process.argv);
各位置参数释义
0
:Node可执行文件所在路径1
:执行的js脚本路径>1
:用户运行时传入的参数
通过这些参数,就能区分出用户要执行的行为
当然在实际开发中大部分场景下,都会使用第三方库去解析命令行参数
,来降低代码的复杂度,提高可读性。
下面是一个使用commander
的例子
#!/usr/bin/env node const { Command } = require('commander') const pkg = require('./package.json') const program = new Command() program.version(pkg.version) program .command('hello [paths...]') .description('hello world demo') .alias('h') .option('-p, --pkg <path>', 'set package.json path') .action((paths, options) => { console.log('😄😄😄'); console.log(paths); console.log(options); }) program.parse(process.argv)
可以看到使用第三方库辅助处理参数
,已经非常完善了
除了老牌的commander之外还有其它的相同作用的库,这里就不展开介绍了。
彩色打印
这个大家都不陌生了,大部分CLI打印结果都是五颜六色
的
比如下面的例子
echo '[36mhello world[39m'
相关知识点是ANSI Escape code
,这里就不展开说明了。
实际开发中,也很少直接写这种原始的数值。通常会使用chalk这个库辅助,比如上面这个颜色对应代码如下。
const Chalk = require('chalk'); console.log(Chalk.cyan('hello world'));
渐变色打印就常用gradient-string这个库
const gradient = require('gradient-string'); console.log(gradient('cyan', 'pink')('Hello world!'));
简单两行代码效果就出来了
终端交互
在使用 例如Vue CLI
此类工具进行项目初始化的时候,会有输入
,单选
,多选
等交互操作。
相关原理涉及内容太“抽象”,篇幅较大,后续通俗精简了再做分享
常用的第三方库就是inquirer这个库
下面是简单checkbox
示例
const inquirer = require('inquirer'); inquirer .prompt([ { type: 'checkbox', message: '水果选择', name: 'fruits', choices: [ { name: '🍌', }, { name: '🍉', }, { name: '🍇', }, ] }, ]) .then((answers) => { console.log(answers); });
最后
本文没有阐述非常深奥的知识点,只涉及日常的一些基操
,有助于读者了解Node CLI 背后的工作原理。
如内容有不妥之处,可以评论区交流;有感兴趣希望深入了解的知识点也可评论区@。
完整示例代码移步=>Github