自定义cli 搭建
本文介绍简单的nodecli的搭建,可以通过简单的cli我们去延伸多功能,深度的自定义cli的搭建,搭建的同时我们还可以去掌握node一些常见的插件和api,这篇文章主要介绍 自动化路由的搭建(简单的路由)。
搭建cli
1.下载需要用到的npm包 npm i chalk clear commander download-git-reop figlet handlebars open ora watch util -D 插件的解释: chalk 用于控制台的颜色 clear 清空控制台 commander 执行指令界面 download-git-reop git下载项目的插件 figlet 改变控制台输出的文字 或者特殊的字符 handlebars 语义化字符串模板(也可以用template) open 打开浏览器 ora 优雅的终端加载进度 (下载的时候一定要注意 下载 5.3.0以上的) watch 监听 util 常见函数的集合(本文用于引出异步编程的函数) 2.搭建cli的基础 创建自定义的cli目录 通过npm init -y 去初始化配置 在package.json中配置我们将要执行的命令和文件
{
script:{
.......
},
bin:{
"将要全局执行的命令":执行的文件
}
bin:{
"jkqtest":"./bin/cli.js"
}
}
//执行的文件入口
#! /usr/bin/env node
console.log('auto-cli....')
const program = require('commander')
program.version(require('./package.json').version)
program
.command('init <name>')
.description('init project')
.action(require('./bin/init.js'))
program.parse(process.argv)
program
.command('refresh')
.description('refresh routers')
.action(require('./bin/refresh'))
执行命令后 进行的操作
const {promisify} = require('util')
const figlet = promisify(require('figlet'))
const clear = require('clear')
const chalk = require('chalk')
const log = content => console.log(chalk.green(content));
const {clone} = require('./download');
const open = require('open')
const spawns = async (...args) => {
const {spawn} = require('child_process')
return new Promise(resolve => {
const proc = spawn(...args)
proc.stdout.pipe(process.stdout)
proc.stderr.pipe(process.stderr)
proc.on('close', () => {
resolve()
})
})
}
module.exports = async name => {
clear()
const data = await figlet('JKQ Welcom')
log(data);
log(`创建项目: ${name}`);
await clone('github:su37josephxia/vue-sample', name)
log('子进程的方式安装依赖')
await spawns(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['install'], { cwd: `./${name}` })
log(`安装完成:To get Start: cd ${name} \n npm run server`)
await spawns(process.platform === 'win32' ?'npm.cmd' : 'npm',['run', 'dev'],{cwd: `./${name}`})
}
定义下载的方法
const {promisify} = require('util')
module.exports.clone = async function(repo, desc) {
const download = promisify(require('download-git-repo'))
console.log('正在下载请等待.....')
await download(repo, desc)
console.log('下载完成')
}
执行refresh刷新路由的方式
const fs = require('fs')
const hbs = require('handlebars')
const chalk = require('chalk')
module.exports = async () => {
const list = fs.readdirSync('./src/views')
.filter(v => v !== 'Home.vue')
.map(v => ({
name: v.replace('.vue', '').toLowerCase(),
file: v
}))
compile({list}, './src/router.js', './template/router.js.hbs')
compile({list}, './src/App.vue', './template/App.vue.hbs')
function compile(meta, filePath, templatePath) {
if (fs.existsSync(templatePath)) {
const content = fs.readFileSync(templatePath).toString()
const result = hbs.compile(content)(meta)
fs.writeFileSync(filePath, result)
console.log('创建成功');
}
}
}
以上就是简单的自动创建cli的小工具,后续可能会添加 view 中添加的文件就会自动的去刷新路由,在进一步就是 会根据view 中的目录然后去进行主子路由的生成等 后续继续更新
|