在学习各种框架时,通常简单的直接通过cli工具方便快捷的创建项目,在简单项目中还合用,但是如果项目稍复杂,或者有用到一些基于私人定制的工具时就稍显不足,除了直接把纯净版架子丢git上,自己实现一个cli工具实际上也不是很复杂的。
首先列举一些经常会用到的模块
org 显示loading
文档 : ora – npm
示例 :
const ora = require('ora');
const loading = ora('building...').start();
loading.color = 'yellow'
setTimeout(() => {
loading.stop();
}, 3000);
rimraf 递归清除文件
比如清除全部build后的dist文件,提供喜闻乐见的rm -rf能力
文档 : rimraf – npm
示例 :
const rimraf = require('rimraf');
rimraf('./dist/', function () {
//do sth
});
path 简化路径操作
这个很常见想必不需要赘述了
文档 :path – node 上不去的可以访问 path - 菜鸟教程
示例 :
const path = require('path');
console.log(__dirname)
console.log(__filename)
console.log(path.dirname(dist/index.js))
chalk 美化字体颜色
没什么实际作用,就是炫,比如build时写个爆闪矩阵晃瞎眼
文档:chalk – npm
示例:
const chalk = require('chalk');
console.log(chalk.red.bgBlue('bgBlue'))
console.log(chalk.rgb(255,0,255).bgRgb(0,0,66)('wtf'))
commander 命令包
提供增加自定义指令的能力
文档:commander – npm
示例:
const commander = require('commander');
commander.version('1.0', '-v --version');
commander.command('init <name>').action((e) => { console.log(e) })
commander.option('-a', 'des描述怎么拼来着')
commander.parse(process.argv)
inquirer 询问者
就是init时会问你name啊auther啊要不要eslint啊干这个的
文档: inquirer – npm
示例:
const inquirer = require('inquirer')
inquirer.prompt([
{
type: 'input',
name: 'name',
message: 'project name'
}
]).then(e=> {
console.log(e)
}).catch(e=>{console.log(e)})
接下来入正活了,首先肯定是基于某套框架例如vue\react的脚手架创建一个初始项目,基于这个初始项目逐步的将我们自己需要的一些工具、组件添加完善;最后就可以结合上述的一些花活整出自己的cli工具了。
#!/usr/bin/env node
//声明编译环境,省去node关键字
// 本地方式 - 适合自己玩,新建bin/index.js而后npm link添加全局指令
const fs = require('fs');
const ora = require('ora');
const chalk = require('chalk');
function myCli(name){
let demoPath = './project';
let tagPath = './'+name;
let loading = ora(chalk.yellow('downing...'))
function down(arr){
while (arr.length > 0){
let item = arr.shift();
if(item[0]=='file'){
let data = fs.readFileSync(item[1]);
fs.writeFileSync(tagPath + "/" + item[1].replace("./project", ".").data);
}else{
let path = tagPath+"/"+item[1].replace("./project",".")
fs.mkdirSync(path);
}
}
loading.stop();
console.log(chalk.green('DownLoad Finish'))
}
// 获取目录结构下所有文件
function makearr(){
let arr= [];
function read(path){
let files = fs.readdirSync(path);
files.forEach(function(item,index){
let nowpath = path+"/"+item;
let stat = fs.statSync(nowpath);
if(stat.isDirectory()){
arr.push(['dir',nowpath]);
read(nowpath);
}else{
arr.push(["file",nowpath]);
}
})
}
read(demoPath);
return arr;
}
}
// git方式
const download = require('download-git-repo')
download-git-repo(username/仓库名)
module.export = myCli;
如果想要直接npm i myCli -g这样直接通过npm安装还需要将包发布到npm上,发布也简单跟git差不多,npm login登录后想一个不会重复的名字直接npm publish就齐活了。