打造属于自己的脚手架
初始化项目
mkdir kima-cli
npm init -y
配置eslint
npm install eslint -D
我这里没有全局安装eslint,所以要在package.json script配置完后才能运行命令。
// package.json
"scripts": {
"eslint-init": "eslint --init",
"eslint": "eslint src/*",
},
npm run eslint-init
依次选择
- How would you like to use ESLint? > To check syntax and find problems
- What type of modules does your project use? > CommonJS (require/exports)
- Which framework does your project use? None of these
- Does your project use TypeScript? > No
- Where does your code run? > Node
- What format do you want your config file to be in? > JSON
初始化完后,自行配置规则,这里不多展示。
// .eslintrc
"rules": {
"semi": ["error", "always"],
"quotes": ["error", "single"]
}
初始化git
git init
只有初始化了git以后,才能用git hooks。若是不使用husky,可以忽略这步。
配置husky
husky可以防止使用Git hooks的一些不好的push或commit。
非必要,不想配置也ok。
npm install husky -D
第一次安装配置,启用git hooks。安装完后,会出现.husky文件夹
npx husky install
安装后启动git hooks, 在package.json中配置。
配置完后每次执行npm i 的时候,会自动执行prepare
"scripts": {
"prepare": "husky install"
},
接下来接可以添加挂钩,husky v4.0与v5.0,挂钩添加的方式不同。这里只展示v5.0的用法。
添加挂钩之前,一定要先运行husky install
# husky add <file> [cmd]
npx husky add .husky/pre-commit "echo pre-commit"
commit之后,会先执行pre-commit。此时会输出"pre-commit"

具体配置运行的命令,可以在.husky pre-commit中任意配置。
我这里配置了执行eslint
#!/bin/sh
. "$(dirname "$0")/_/husky.sh"
npm run eslint
commit时,会先执行eslint, 校验不通过则不允许提交代码。
配置commitlint
在git commit时执行commitlint校验提交内容
- 先安装commitlint
npm install --save-dev @commitlint/{cli,config-conventional}
- 配置生成文件
echo "module.exports = {extends: ['@commitlint/config-conventional']};" > commitlint.config.js
- 向husky添加commit-msg hook
npx husky add .husky/commit-msg 'npx --no-install commitlint --edit $1'
type类型
- feat:新功能(feature)
- fix:修补bug
- docs:文档(documentation)
- style: 格式方面的优化
- refactor:重构
- test:测试
- chore:构建过程或辅助工具的变动

添加配置文件
创建 bin/kima 文件
#!/usr/bin/env node
console.log(1);
tips
#!/usr/bin/env node 表示要用系统里的node环境来执行文件
配置package.json
"bin": {
"kima": "./bin/kima"
},
创建软链接
npm link
创建完后,测试一下,在终端输入kima, 可看到输出1。 证明配置成功。
编写入口文件
在bin/kima 文件中引入main.js,作为入口文件。
#!/usr/bin/env node
require('../src/main.js');
安装commander
commander.js是TJ所写的工具包,让node命令行程序制作更加简单。
npm install commander
在src/main.js中写入
const { program } = require('commander');
const _version = require('../package.json').version;
program.version(_version)
.parse(process.argv);
执行kima -h, 发现默认有两个指令。-V 和 -h
这里我看-V不太顺眼,就更改了一下指令。
program.version(_version, '-v, --version');
执行kima -v, 打印了版本号 1.0.0
初步成功啦,接下来玩点好玩的。
安装 figlet和 @darkobits/lolcatjs
figlet 用于生成由字符串组成的图形
@darkobits/lolcatjs 让字符串上色
npm install figlet @darkobits/lolcatjs
修改src/main.js
const figlet = require('figlet');
const Printer = require('@darkobits/lolcatjs').default;
const string = figlet.textSync('kima');
program
.version(Printer.fromString(` \n 欢迎使用kima脚手架 ${_version} \n ${string}`), '-v, --version')
.parse(process.argv);
再次执行 kima -v, 就可以看到控制台变好看了!🎉

开始搭建
- inquirer 对话库,询问者
- chalk 终端字符串样式库
- ora 优雅的终端微调器,可以添加loading之类的
- download-git-repo 从git上拉取代码
- shelljs 使用ShellJS操作目录文件
npm install inquirer chalk ora download-git-repo shelljs
自定义一些指令
program
.option('init', '初始化项目⚙️')
.option('-i, --info', 'print environment debug logs 🪂');
配置异常处理
写到最后面,因为program.parse()需要解析上面配置的字符串。
try {
program.parse(process.argv);
} catch (e) {
console.log(e);
console.log(`${chalk.red('脚手架出现异常,请联系kk📧')}`);
}
添加问题
使用inquirer添加一些问题
const prompt = [
{
type: 'input',
name: 'description',
message: '✍️ 请输入项目描述',
filter: val => val
},
{
type: 'input',
name: 'author',
message: '✍️ 请输入作者名',
filter: val => val
},
{
type: 'list',
name: 'frame',
message: '✅ 请选择使用的框架',
default: 0,
choices: [
{
name: '默认安装'',
value: 'all'
},
{
name: '只安装Vue',
value: 'vue'
},
{
name: '只安装Element',
value: 'element'
}
]
}
];
接收指令
program
.command('create <app-name>')
.description('create a new project powered by kima')
.action((cmd) => {
create(cmd);
});
const create = async function (name) {
try {
const projectName = name;
const answers = await inquirer.prompt(questions);
const _pwd = process.cwd();
const projectPath = `${_pwd}/${projectName}`;
// 检查项目是否存在
checkDir(projectPath, projectName);
const spinner = ora(`☕️ ${chalk.red('模版正在下载中,请稍后 \n')}`).start();
// 项目模版地址
const url = 'direct:https://github.com/mobuiin/project-template.git#main';
// 拉取模版
download(url, projectPath, { clone: true }, err => {
if (err) {
spinner.fail(`${chalk.magenta('下载失败😭')}`);
process.exit(1);
} else {
const fileName = `${projectPath}/package.json`;
checkDir(fileName, 'package.json');
const data = fs.readFileSync(fileName).toString();
const json = JSON.parse(data);
json.name = projectName;
json.description = answers.description;
json.author = answers.author;
const options = {
// 这里不方便展示
};
options[answers.frame]();
fs.writeFileSync(fileName, JSON.stringify(json, null, 2), 'utf-8');
spinner.succeed(`${chalk.magenta('项目创建成功🎉')}`);
}
});
} catch (e) {
console.log(e);
console.log(`${chalk.red('脚手架出现异常,请联系kk 📧')}`);
}
};
补充知识点
process.exit([code]) code只有0 和 1, 没有-1。 默认值为0,代表成功。1 代表失败
使用download-git-repo 拉取代码时,使用direct + clone为true 时,一定要带上分支。默认分支为master。
这里修改package.json 使用Node原生的方法,先读取文件,再进行修改。也可以用ShellJS写指令,去替换和操作package.json。
program.parse(process.argv); 要写到最后
到这里就完成的差不多拉,先看看长什么样!

安装并使用
到这里就是发布到私服去拉。发布不用再说了吧,很容易的!! npm publish 一下就ok拉~
最后全局安装脚手架 即可以使用啦
npm install kima-cli -g
