Node.js 用途很广,常用来开发服务、桌面应用等被开发者熟知,Node.js 还有另外一个非常实用的场景 - 命令行应用(后文统称 CLI)。
本文可参考的源码:https://github.com/youngjuning/cli
HelloWorld
创建一个youngjuning 目录,并使用进入该目录:
1 | $ mkdir youngjuning && cd youngjuning |
在该目录下新建 bin/cli.js:
1 |
|
使用 package.json 的 bin 项是用来指定各个内部命令对应的可执行文件的位置:
1 | "bin": { |
在命令行输入 npm link 或 npm install -g 将当前项目安装到全局环境,这样就可以直接使用 youngjuning 来运行文件了。
commander.js
Node.js 为我们提供了 process.argv 来读取命令行参数,这里我们对此不作介绍,有兴趣可以自行研究,我选择了 tj 大神的 commander:
command: 定义命令行指令,后面可跟上一个 name,用空格隔开,如.command( 'app [name]')alias: 定义一个更短的命令行指令description: 描述,它会在 help 里面展示option: 定义参数。它接受四个参数- 在第一个参数中,它可输入短名字
-a和长名字–app,使用|或者,分隔,在命令行里使用时,这两个是等价的,区别是后者可以在程序里通过回调获取到 - 第二个为描述, 会在
help信息里展示出来 - 第三个参数为回调函数,他接收的参数为一个
string,有时候我们需要一个命令行创建多个模块,就需要一个回调来处理 - 第四个参数为默认值
- 在第一个参数中,它可输入短名字
action: 注册一个callback函数,这里需注意目前回调不支持 let 声明变量parse: 解析命令行
inquire.js
交互命令输入插件!
基本语法
1 | const answers = await inquirer.prompt([ |
参数详解
type: 表示提问的类型,包括:input,confirm,list,rawlist,expand,checkbox,password,editor;name: 存储当前问题回答的变量;message: 问题的描述;default: 默认值;choices: 列表选项,在某些 type 下可用,并且包含一个分隔符(separator);validate: 对用户的回答进行校验;filter: 对用户的回答进行过滤处理,返回处理后的值;transformer: 对用户回答的显示效果进行处理(如:修改回答的字体或背景颜色),但不会影响最终的答案的内容;when: 根据前面问题的回答,判断当前问题是否需要被回答;pageSize: 修改某些type类型下的渲染行数;prefix: 修改message默认前缀;suffix: 修改message默认后缀。
实现动态模板
- 利用
recursive-readdir库递归读取项目所有文件 - 利用
handlebars进行模板替换 - 利用
fs模块进行读文件和写文件操作
1 | const fs = require('fs') |
命令行工具
- chalk.js: 美化命令行的模块
- ora: Elegant terminal spinner
- ncp: 异步的拷贝文件,包含空文件夹
- recursive-readdir: 递归地列出目录和子目录下的所有文件,不包含目录本身。
- shelljs: Unix shell commands for Node.js
- log-symbols: 打印日志的特殊标志
- download-git-repo: Download and extract a git repository (GitHub, GitLab, Bitbucket) from node
- global-prefix: 获取 npm 全局安装的前缀
- exec-sh: 执行 shell 命令转发所有 stdio 流,比 shelljs exec 命令好用
- wml: wml 侦听某个文件夹中的更改(使用 watchman),然后将更改的文件复制到另一个文件夹中。
- cmd-open: 扩展 Windows 命令 open
- shx: shx is a wrapper around ShellJS Unix commands, providing an easy solution for simple Unix-like, cross-platform commands in npm package scripts.
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 紫升的博客!
评论








