Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli
前面的文章分享了组件库的开发、example、组件库文档,本文分享组件库 cli 开发。
1 为什么要开发组件库 cli
回顾一个新组件的完整开发步骤:
1 在 packages 目录下创建组件目录 xxx:
1.1 使用 pnpm 初始化 package.json,修改 name 属性;
1.2 在该目录中创建 src 目录和 index.ts 文件;
1.3 在 src 目录下创建 types.ts 文件和 index.tsx / index.vue 文件;
2 在组件库的入口模块 packages/yyg-demo-ui:
2.1 使用 pnpm install 安装 1.1 创建的 xxx;
2.2 在 packages/xxx-ui/index.ts 中引入 xxx,并添加到 components 数组中;
3 packages/scss/components/ 目录:
3.1 在该目录下创建 _xxx.module.scss;
3.2 在该目录中的 index.scss 中引入 _xxx.module.scss;
4 组件库文档:
4.1 在 docs/components 目录下创建 xxx.md 文件;
4.2 在 docs/demos 目录下创建 xxx 目录,并在该目录中创建 xxx.vue 文件;
4.3 在 docs/components.ts 中添加组件菜单项;
该步骤是一个机械化的流程操作,涉及新建或修改十多个文件,费事费力,纯属体力活。这种情况下就可以使用工具替代咱们完成这些操作,开发一个 cli,执行命令、输入组件名就自动创建组件,完成上述操作,如此便可以将注意力集中到组件和业务的开发中。
2 开发 cli 使用到的技术
开发 cli 的库有很多,优雅哥在这里使用的还是最传统的技术栈,在下面使用的这些库时要注意版本号:
库 | 版本 | 作用 |
---|---|---|
commander | ^9.4.1 | 接收输入的命令,解析命令参数 |
chalk | 4.1.2 | 控制台输出的文字颜色 |
inquirer | 8.2.5 | 命令行交互,在命令行提示用户输入,获取到用户输入的内容 |
log-symbols | 4.1.0 | 控制台输出的图标,如 success、failure 等状态 |
ora | 5.4.1 | 在控制台显示 loading |
shelljs | ^0.8.5 | 执行 cmd 命令,如 cd、pnpm install 等 |
3 搭建 cli 开发框架
有了上面的知识准备,接下来就进入实战 cli:
3.1 初始化 cli 模块
在命令行中进入 cli 目录,依旧使用 pnpm 初始化:
pnpm init
修改生成的 package.json 文件 name 属性:
{
"name": "@yyg-demo-ui/cli",
"version": "1.0.0",
"description": "命令行工具",
"author": "程序员优雅哥",
"license": "ISC"
}
在 cli 目录下创建 ts 配置文件 tsconfig.json:
{
"compilerOptions": {
"target": "es2015",
"lib": [
"es2015"
],
"module": "commonjs",
"rootDir": "./",
"allowJs": true,
"isolatedModules": false,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"strict": true,
"skipLibCheck": true
}
}
在 cli 目录下创建 index.ts 文件作为入口:
#!/usr/bin/env node
console.log('hello cli!')
该文件第一行不能省略,这句话的意思是使用 node 来执行这个文件,并且在 /use/bin/env 环境变量中去找 node 执行器。
3.2 ts-node 执行 ts 文件
有了入口文件,怎么去执行它呢?当前 index.ts 中没有任何 TypeScript 语法,可以使用 node index.js 来执行,但有 TypeScript 语法时,就需要 tsc 先编译 ts 文件,再使用 node 命令来执行。这样每次运行比较麻烦,庆幸可以使用 ts-node 来执行。
在 cli 目录下按照 ts-node 为开发依赖:
pnpm install ts-node -D
可以尝试在命令行中执行 ts-node index.ts。
直接这么执行不优雅,优雅哥更宁愿在 cli 的 package.json 添加 scripts:
"scripts": {
"gen": "ts-node ./index.ts create"
},
在上面的 gen 命令中,添加了一个参数 create,在后面会解析出这个参数。
重新在命令行执行:
pnpm run gen
控制台能正常输出 hello cli!,ts 文件可以正常执行。
3.3 源码目录
上面创建的 index.ts 是命令执行的入口,现在咱们在 cli 中创建 src 目录存放源码,并在 src 中创建 index.ts 作为源码的入口,首先在该文件中定义一个入口函数:
src/index.ts:
export const mainEntry = () => {
console.log('hello cli mainEntry')
}
在外层的 index.ts 中(cli/index.ts)调用该函数:
#!/usr/bin/env node
import { mainEntry } from './src'
mainEntry()
执行 pnpm run gen 测试程序是否正常运行。
3.4 参数解析
前面定义的 gen 命令携带了参数 create,要怎么解析出这个参数呢?可以使用 commander 库来完成。
在 cli 中安装 commander:
pnpm install commander -D
修改 cli/src/index.ts 文件,使用 commander 来解析参数:
import { program } from 'commander'
export const mainEntry = () => {
console.log('hello cli mainEntry')
program.version(require('../package').version)
.usage('<command> [arguments]')
program.command('create')
.description('create a new component')
.alias('c')
.action(() => {
console.log('创建组件')
})
program.parse(process.argv)
if (!program.args.length) {
program.help()
}
}
如果直接执行 ts-node index.ts,会输出命令使用帮助:
hello cli mainEntry
Usage: index <command> [arguments]
Options:
-V, --version output the version number
-h, --help display help for command
Commands:
create|c create a new component
help [command] display help for command
执行 pnpm run gen (即 ts-node index.ts create),则会进入 create 命令的 action 回调函数中:
hello cli mainEntry
创建组件
在 cli/src/ 目录下创建目录 command,并在该目录中创建 create-component.ts 文件,该文件用于处理参数为 create 时执行的内容(即创建组件相关的目录文件等):
export const createComponent = () => {
console.log('创建新组建')
}
该文件导出了函数 createComponent,该函数的内部实现逻辑咱们在下一篇文章实现,本文先将 cli 架子搭起来。
修改 cli/src/index.ts 文件,首先引入 createComponent 函数,然后在 create 命令的 action 中调用它:
...
import { createComponent } from './command/create-component'
export const mainEntry = () => {
...
program.command('create')
...
action(createComponent)
...
}
执行 gen 命令时,就会调用到 createComponent 函数了。
3.5 用户交互
在 createComponent 中,首先要提示组件开发人员输入组件的名称、中文名、组件类型(tsx、vue),这时候可以使用 inquirer 来实现。先在 cli 下安装依赖,为了省事,咱把其他依赖一起安装了:
pnpm install chalk@4.1.2 inquirer@8.2.5 @types/inquirer@8.2.5 log-symbols@4.1.0 ora@5.4.1 shelljs @types/shelljs -D
接着在 create-component.ts 中定义交互提示和变量名:
import inquirer, { QuestionCollection } from 'inquirer'
// 交互提示
const questions: QuestionCollection = [
{
name: 'componentName',
message: 'Input the component name: ',
default: ''
},
{
name: 'description',
message: 'Input the component description: ',
default: ''
},
{
type: 'list',
name: 'componentType',
message: 'Choose the component type: ',
choices: [
'tsx', 'vue'
]
}
]
最后在 createComponent 函数中使用 inquirer 实现交互提示信息:
const createNewComponent = (componentName: string, description: string, componentType: string) => {
console.log(componentName, description, componentType)
}
export const createComponent = () => {
inquirer.prompt(questions).then(({ componentName, description, componentType }) => {
createNewComponent(componentName, description, componentType)
})
}
执行 pnpm run gen 运行效果如下:
到这里,组件库 cli 的架子咱们就搭建起来了,后面只需要实现 createNewComponent 函数即可,在该函数中创建目录、文件、执行命令等。
3.6 美化日志
本文最后咱们玩点优雅的东西。如果直接使用 console.log 输出,只有黑白色,不优雅,咱可以使用 chalk 改变输出的文字的颜色,并通过 log-symbols 加些图标。首先在 src 下创建 util 目录,在该目录中创建 log-utils.ts 文件,用来封装优雅版的 console.log:
import chalk from 'chalk'
import logSymbols from 'log-symbols'
export const r = (msg: string, showIcon = true): void => {
if (showIcon) {
console.log(logSymbols.error, chalk.red(msg))
} else {
console.log(chalk.red(msg))
}
}
export const g = (msg: string, showIcon = true): void => {
if (showIcon) {
console.log(logSymbols.success, chalk.green(msg))
} else {
console.log(chalk.green(msg))
}
}
export const c = (msg: string): void => {
console.log(logSymbols.info, chalk.cyan(msg))
}
该文件导出了 r、g、c 三个函数,其他文件使用时非常简便:
c('yyg-demo-ui cli 工具')
本文搭建好 cli 的架子,下文将完成 createNewComponent 函数,实现组件创建的全过程。
感谢阅读,公号同名“程序员优雅哥”。
Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli的更多相关文章
- Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo
前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通 ...
- Vue3 企业级优雅实战 - 组件库框架 - 4 组件库的 CSS 架构
在前一篇文章中分享了搭建组件库的基本开发环境.创建了 foo 组件模块和组件库入口模块,本文分享组件库的样式架构设计. 1 常见的 CSS 架构模式 常见的 CSS 架构模式有很多:OOCSS.ACS ...
- Vue3 企业级优雅实战 - 组件库框架 - 3 搭建组件库开发环境
前文已经初始化了 workspace-root,从本文开始就需要依次搭建组件库.example.文档.cli.本文内容是搭建 组件库的开发环境. 1 packages 目录 前面在项目根目录下创建了 ...
- Vue3 企业级优雅实战 - 组件库框架 - 2 初始化 workspace-root
上文已经搭建了 pnpm + monorepo 的基础环境,本文对 workspace-root 进行初始化配置,包括:通用配置文件.公共依赖.ESLint. 1 通用配置文件 在项目 根目录 下添加 ...
- Vue企业级优雅实战04-组件开发01-SVG图标组件
(后续的文章 公众号会提前一周更新,欢迎关注文末的微信公众号:程序员搞艺术) 预览本文的实现效果: # gitee git clone git@gitee.com:cloudyly/dscloudy- ...
- Vue企业级优雅实战-00-开篇
从2018.1.开始参与了多个企业的中台建设,这些中台的技术选型几乎都是基于 Spring Cloud 微服务架构 + 基于 Vue 全家桶的前端.我前后端架构及开发我几乎各占一半的精力,在企业级前端 ...
- Vue企业级优雅实战05-框架开发01-登录界面
预览本文的实现效果: # gitee git clone git@gitee.com:cloudyly/dscloudy-admin-single.git # github git clone git ...
- Vue企业级优雅实战03-准备工作04-全局设置
本文包括如下几个部分: 初始化环境变量文件 JS 配置文件初始化:如是否开启 Mock 数据.加载本地菜单.URL 请求路径等: 国际化文件初始化:初始化国际化文件的结构: 整合 Element UI ...
- Vue企业级优雅实战02-准备工作03-提交 GIT 平台
代码管理.版本管理是件老大难的事情,尤其多人开发中的代码冲突.突击功能时面临的 hotfix 等.本文只是简单说说如何将一套代码提交到两个 Git 平台(GitHub.GitEE)上.其他的 Git ...
- Mysql--主库不停机搭建备库
参考:http://blog.csdn.net/luozuolincool/article/details/38494817 mysqldump --skip-lock-tables --single ...
随机推荐
- kubeoperator 使用外部mysql
1.导出 kubeoperator 的数据库 sql 文件,然后导入到外部mysql 2.正常关闭 kubeoperator 3.关闭 kubeoperator 不会影响已经部署的 k8s 集群 4. ...
- ingress-nginx 的使用 =》 部署在 Kubernetes 集群中的应用暴露给外部的用户使用
文章转载自:https://mp.weixin.qq.com/s?__biz=MzU4MjQ0MTU4Ng==&mid=2247488189&idx=1&sn=8175f067 ...
- C#-8 数组
一 关于数组 数组是由一个变量名称表示的一组同类型的数据元素.数组中的元素通过变量名和方括号索引来访问. int[] intArray = new int[] { 1, 2, 3 }; //声明了一个 ...
- 220501 T1 困难的图论 (tarjan 点双)
求满足题目要求的简单环,做出图中所有的点双,用vector存储点双中的边,如果该点双满足点数=边数,就是我们想要的,求边的异或和即可:如果该点双点数小于边数,说明有不只一个环覆盖,不满足题意. 1 # ...
- 驱动开发:内核取ntoskrnl模块基地址
模块是程序加载时被动态装载的,模块在装载后其存在于内存中同样存在一个内存基址,当我们需要操作这个模块时,通常第一步就是要得到该模块的内存基址,模块分为用户模块和内核模块,这里的用户模块指的是应用层进程 ...
- 删除数组里含有a的元素,并且将null值放在后面
想去掉里面含有a的元素,并将null放在后面.放在后面就是往后移,其他值往左移 1 public static void main(String[] args) { 2 //自定义的一个数组 3 St ...
- FTP文本传输协议
一.存储类型 存储类型分为三种: 直连式存储:Direct-Attached Storage,简称DAS 网络附加存储:Network-Attached Storage,简称NAS(存储和管理空间都在 ...
- ES集群检查常用命令
一.集群检查常用命令 查询集群状态命令: curl -XGET "http://ip:port/_cluster/health?pretty" 查询Es全局状态: curl -XG ...
- day03-CSS
CSS 1.css介绍 css指的是层叠样式表(cascading style sheets) 官方文档:https://www.w3school.com.cn/css/index.asp 为什么需要 ...
- 表驱动法在STM32中的应用
1.概念 所谓表驱动法(Table-Driven Approach)简而言之就是用查表的方法获取数据.此处的"表"通常为数组,但可视为数据库的一种体现.根据字典中的部首检字表查找读 ...