一般,我们知道
为什么需要脚手架?
- 减少重复性的工作,不再需要复制其他项目再删除无关代码,或者从零创建一个项目和文件。
- 根据交互动态生成项目结构和配置文件,具备更高的灵活性和人性化定制的能力。
- 多人协作更为方便,避免了人工传递文件的繁琐。
- 集成互联网上的模板,方便自己与他人使用。
脚手架工作流
脚手架问答流
如何搭建一个脚手架
第三方库的支持
搭建步骤
1、初始化项目
首先创建一个空项目,命名为 mbs-cli ,然后新建一个 bin/mbs 文件,再执行 npm init
生成一个 package.json
文件。最后安装上面需要用到的依赖。
1 | mkdir mbs-cli && cd mbs-cli |
2、处理命令行
node.js 内置了对命令行操作的支持,在 package.json
中的 bin
字段可以定义命令名和关联的执行文件。
在 package.json
中加上 bin
的内容:
1 | { |
首先在 mbs
文件中引入相关依赖模块:
1 |
|
然后编写nodejs处理逻辑,具体用法见下。
nodejs依赖模块介绍与用法
commander(指挥官)
自动地解析命令和参数,用于处理用户输入的命令
- usage(): 设置usage值,自定义帮助信息
- command(): 定义一个命令名字
- description(): 设置 description值
- option(): 定义参数,需要设置「关键字」和 「描述」,关键字包括「简写」和「全写」两部分,以
,
、|
、空格
做分隔 - parse(): 解析命令行参数
argv
- version(): 终端输出版本号
定义常规命令:
1 | // 定义常规命令 |
init命令逻辑
1 | // init 命令逻辑 |
处理用户输入命令
1 | // init 命令逻辑 |
最后处理解析命令行参数
1 | program.parse(process.argv) |
inquirer(询问者)
通用的命令行用户界面集合,用于和用户进行交互。由于交互的问题种类不同,inquirer
为每个问题提供很多参数
1 | type: 表示提问的类型,包括:input, confirm, list, rawlist, expand, checkbox, password, editor; |
语法结构
1 | const inquirer = require('inquirer') |
input类型
1 | const promptList1 = [ |
效果
confirm类型
1 | const promptList2 = [ |
效果
list类型
1 | const promptList3 = [ |
效果
download-git-repo
download-git-repo
支持从 Github
、Gitlab
、Bitbucket
下载仓库
1 | download(repository, destination, options, callback) |
repository
1 | - GitHub - github:owner/name or simply owner/name |
destination
1 | The file path to download the repository to. xxxxxxxxx |
options
1 | boolean default false - if true use git clone instead of an http download. |
callback
1 | The callback function as function (err). |
ora(loading动效)
用于显示下载中的动画效果
1 | const ora = require('ora') |
chalk(字体颜色)
通过 chalk
来为打印信息加上样式,比如成功信息为绿色,失败信息为红色。这样子会让用户更加容易辨认,同时也让终端的显示更加好看:
1 | const chalk = require('chalk') |
log-symbols(日志符号)
使用 log-symbols
在信息前面加上 ✔︎ 或者 ✘ 等的图标,优化视觉体验:
1 | console.log(symbols.success, chalk.green('New project has been initialize successfully!')) |
handlebars
handlebars
可以对仓库的模板中的 package.json
文件做一些动态修改:
1 | { |
并在下载模板完成之后将用户输入的答案渲染到 package.json
中
1 | const { readFileSync, writeFileSync } = require('fs') |
cli-table
表格
1 | const Table = require('cli-table') |
shelljs
执行命令行命令 cd path && npm i
1 | var shell = require('shelljs') |
msb-cli脚手架
mbs-cli工作流
mbs-cli目录结构
mbs-cli核心命令
本地npm模块调试
开启调试模式
npm link
可以将当前目录 ./bin
文件夹下的 npm包
链接到全局执行环境,从而在任意位置使用命令行都可以直接运行该 npm包
关闭调试模式
在当前目录下执行 npm unlink
即可删除链接符号