前言
前端日常开发中,会遇见各种各样的 cli,使用 vue 技术栈的你一定用过 @vue/cli
,同样使用 react 技术栈的人也一定知道 create-react-app
。利用这些工具能够实现一行命令生成我们想要的代码模版,极大地方便了我们的日常开发,让计算机自己去干繁琐的工作,而我们,就可以节省出大量的时间用于学习、交流、开发。
cli 工具的作用在于它能够将我们开发过程中经常需要重复做的事情利用一行代码来解决,比如我们在写需求的时候每新增一个页面就需要相应的增加该页面的初始化代码,而相同文件类型的初始化代码往往是一样的,比如 example.vue。同时我们还需要增加对应的路由,比如在 router.js 中增加对应的路由规则。这些工作都是很繁琐又重复的,每次遇到这种情况都重复一遍吗?是时候作出改变了,编写自己的 cli 工具,一行命令,3 秒钟进入 coding 状态!
本文以自己的 fc-vue-cli 为例,将开发到发布过程完整记录下来,看完本文,你将学会如何从零开发一个 cli 项目,以及如何使用 npm 发布自己的包。
提前放上该项目地址
源代码地址: 源代码
npm 地址: npm
原文地址(github上):
要实现的功能
fc-vue add-page
通过这行命令来新增一个页面的模版文件,省去了手动新建文件,手动复制初始化代码的麻烦,同时添加上对应的路由配置
脚手架的名字定为 fc-vue,这个是通过 package.json 里面的 name 字段来定义的。
目录结构
入口 (bin/index.js)
入口文件只做了一件事,那就是判断当前node的版本是否大于10,如果版本号<10则提醒用户升级node
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#!/usr/bin/env node
// 'use strict';
const chalk = require( 'chalk' );
const currentNodeVersion = process.versions.node;
const major = currentNodeVersion.split( '.' )[0];
if (major < 10) {
console.error(
chalk.red(
`You are running Node \n${currentNodeVersion} \nvue-assist-cli requires Node 10 or higher.\nPlease update your version of Node`
)
);
process.exit(1);
}
require( '../packages/init' );
|
初始化命令 (packages/init.js)
在这里初始化你要实现的命令,比如我要实现 add-page 功能,这里要用到的 commander
库。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
const { program } = require( 'commander' );
const { log } = require( './lib/util' );
// 初始化版本,我们直接获取package.json里面的版本号就可以了
program.version(require( '../package.json' ).version);
//开始添加命令 [name] 说明这个参数是可选的,我们想做到兼容不同的使用方法所以把这个参数设置未可选
//.description里面可以写上这个命名的一些描述,当用户fc-vue help add-page 的时候可以提供帮助文档
//.option 用来添加可选的参数
//.action用来响应用户的输入,这里我们单独用一个文件./commands/add-page来处理
program
.command( 'add-page [name]' )
.description(
'add a page, 默认加在./src/views 或 ./src/pages 或./src/page目录下,同时添加路由\n支持"/"来创建子目录例如:add-page user/login\n使用时,支持 fc-vue add-page 【回车】 来选择输入信息'
)
.option( '-s, --simple' , '创建简单版的页面,只新增一个.vue文件' )
.option( '-t, --title <title>' , '页面标题' )
.action(require( './commands/add-page' ))
.on( '--help' , () => {
log( '支持 fc-vue add-page 【回车】 来选择输入信息' );
});
//格式化命令行参数
program.parse(process.argv);
|
处理用户输入的命令 (packages/commands/add-page.js)
这里需要使用到几个库, shelljs
用来处理 shell 命令的,我们用来操作文件, chalk
用来给打印输出增加样式。函数通过 name,cmdObj 来获取用户的输入,其中 name 是.command('add-page [name]')里面的 name, cmdObj 对象里面则包括其他参数
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
|
const fs = require( 'fs' );
const shell = require( 'shelljs' );
const chalk = require( 'chalk' );
const { askQuestions, askCss } = require( '../lib/ask-page' );
const checkContext = require( '../lib/checkContext' );
const copyTemplate = require( '../lib/copy-template' );
const addRouter = require( '../lib/add-router' );
const { error, log, success } = require( '../lib/util' );
shell.config.fatal = true ;
module.exports = async (name, cmdObj) => {
try {
//默认使用less,
let cssType = 'less' ;
let simple = cmdObj.simple;
let id="codetool">
问答模式 (packages/lib/ask-page.js)
这里需要用到
检查用户执行命令时所在的环境 (packages/lib/checkContext.js) 因为我们不确定用户会不会按照我们所期望的方式来使用,所以在这里我们加上一些判断,来确保用户的行为规范,否则就抛出错误,提示用户该怎么使用。主要就是确保用户在项目根目录或者 src 目录路径下执行命令。然后还要确认用户所在项目的目录结构是否符合我们所提供的规范(基本上也是社区的规范)。最后当然还要判断下这个需要添加的页面是否已经存在。
复制模版到目标路径 (packages/lib/copy-template.js)
当确认过上下文环境,拿到了用户的输入参数,这个时候我们就可以愉快的进行页面添加工作了,也就是复制我们事先准备好的模版到目标文件。这里需要考虑用户选择的是 normal 还是 simple 类型的根据不同的类型来添加不通的页面模版。当然同时还支持 less,scss 等。 比如用户执行
添加路由 (package/lib/add-router.js)
添加页面模版的同时我们希望能够自动配置上路由。其实思路很简单,就是读取 router.js 然后往里面插入用户添加的页面所在的路由。我们约定 src/views 目录下面的组件都是页面级的,也就是说/user/login/index.vue 对应的路由就是/user/login。 比如用户执行
回到添加路由配置的实现,packages/lib/add-router.js。
发布到 npm 主要是配置好 package.json 文件。bin 里面定义好 npm 包的入口。
运行npm login 先登录 npm publish 发布,每次发布的版本号不能重复复制代码 安装使用
使用演示
结束 这样就实现了一个简单的 fc-vue add-page 功能,是不是很简单。 源代码地址: 源代码 npm 地址:npm 到此这篇关于手把手带你搭建一个 node cli的文章就介绍到这了,更多相关手把手带你搭建一个 node cli内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家! 原文链接:https://juejin.im/post/6857842033084760071 延伸 · 阅读
精彩推荐
|