Vue3 企业级优雅实战 - 组件库框架 - 8 搭建组件库 cli

news2024/12/23 22:34:44

前面的文章分享了组件库的开发、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接收输入的命令,解析命令参数
chalk4.1.2控制台输出的文字颜色
inquirer8.2.5命令行交互,在命令行提示用户输入,获取到用户输入的内容
log-symbols4.1.0控制台输出的图标,如 success、failure 等状态
ora5.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

直接这么执行不优雅,优雅哥更宁愿在 clipackage.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 运行效果如下:

image-20221115141328774

到这里,组件库 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 函数,实现组件创建的全过程。

感谢你阅读本文,工号(同名“程序员优雅哥”),了解第一时间更新文章。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/66246.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【正点原子FPGA连载】第二十八章 以太网ARP测试实验 摘自【正点原子】DFZU2EG/4EV MPSoC 之FPGA开发指南V1.0

1&#xff09;实验平台&#xff1a;正点原子MPSoC开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id692450874670 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/thread-340252-1-1.html 第二十八章 以太…

(十七) 共享模型之工具【JUC】【读写锁】

一、ReentrantReadWriteLock&#xff08;P247&#xff09; 当读操作远远高于写操作时&#xff0c;这时候使用 【读写锁】让 【读-读】可以并发&#xff0c;提高性能。 类似于数据库中的 select ... from ... lock in share mode 提供一个 数据容器类内部分别使用读锁保护数据的…

【论文阅读 CIKM‘2021】Learning Multiple Intent Representations for Search Queries

文章目录Original PaperMotivationMethodTask Description and Problem FormulationNMIR Framework: A High-Level OverviewModel Implementation and TrainingDataOriginal Paper Learning Multiple Intent Representations for Search Queries More related papers can be …

基于Electron的桌面端应用开发和实践

引言 如果开发跨桌面端的应用开发的话&#xff0c;我相信&#xff0c;electron目前绝对是不可避免的技术方案。web应用大家都知道&#xff0c;通过浏览器访问的应用就是web应用&#xff0c;那什么是桌面端&#xff1f;桌面端有两个重要特点&#xff1a; 具备独立运行于操作系…

学习压力容器中卡箍快开结构的强度计算

导读:压力容器的设计一定要考虑安全性、经济性、环保及健康问题。首先安全是核心问题&#xff0c;在保证安全的前提下尽可能的再做到经济合理。 本文从强度计算软件SW6-2011 V3.1补丁二&#xff08;单机版&#xff09;和&#xff08;网络版&#xff09;所解决的问题&#xff0…

Redis 性能问题优化方案

Redis性能问题&优化方案前言Redis真的变慢了吗&#xff1f;使用复杂度过高的命令操作bigkey集中过期实例内存达到上限fork耗时严重开启内存大页开启AOF绑定CPU使用Swap碎片整理网络带宽过载其他原因频繁短连接运维监控其它程序争抢资源总结前言 Redis 作为优秀的内存数据库…

Java高效率复习-MySQL上篇[MySQL]

前言 本文章是用于总结尚硅谷MySQL教学视频的记录文章&#xff0c;主要用于复习&#xff0c;非商用 原视频连接&#xff1a;https://www.bilibili.com/video/BV1iq4y1u7vj/?p21&spm_id_frompageDriver&vd_sourcec4ecde834521bad789baa9ee29af1f6c https://www.bilib…

Spring Boot 项目优化和 JVM 调优,亲测!真实有效。。

三、Jvm调优实战 1、未设置JVM参数的情况 我现在有一个项目&#xff0c;默认情况下&#xff0c;没有设置任何Jvm参数。 下面我来启动看一下。 看一下堆栈分配&#xff1a; 很明显默认的最大堆内存分配了8个G。很明显的不合理嘛。 2、下面我们来设置下Jvm参数 例如要配置JVM…

vue2 ElementUI 表单标签、表格表头添加问号图标提示

文章目录1. 问题背景2. element-ui悬浮提示定义3. 基础4. 延申5. 参考1. 问题背景 使用element-ui有时候需要对表格的表头、表单的标签进行自定义&#xff0c;添加问号的悬浮提示。 要达到的效果&#xff0c;如图所示&#xff1a; 2. element-ui悬浮提示定义 https://elemen…

【菜菜的sklearn课堂笔记】聚类算法Kmeans-基于轮廓系数来选择n_clusters

视频作者&#xff1a;菜菜TsaiTsai 链接&#xff1a;【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibili 我们通常会绘制轮廓系数分布图和聚类后的数据分布图来选择我们的最佳n_clusters from sklearn.metrics import silhouette_samples,silhouette_s…

c++还原简单的vector

文章目录vectorvecotor的介绍vector的模拟实现类的框架成员变量迭代器构造函数析构函数size()capacity()operator[]重载扩容resize()尾插验证是否为空尾删clear 清除swap交换insert插入erase删除迭代器区间初始化构造函数拷贝构造赋值运算符重载n个val构造函数再谈构造函数vect…

数仓日记 - 数仓理论

寒刃尽断处&#xff0c;吾心作剑霜作锋&#x1f3c2; 目录 一、数仓简介 二、关系建模与维度建模 1. 关系建模   2. 维度建模    • 三种模型    • 事实表    • 维度表   3. 事实表的分类    • 事务型事实表    • 周期型快照事实表    • 累积型快照事实表…

Python操作Excel表格

本文介绍如何通过轻量级、零依赖&#xff08;仅使用标准库&#xff09;的 pylightxl 库操作Excel表格。 官网&#xff1a;Welcome to pylightxl documentation — pylightxl 2019 documentation 目录 一、入门 1. 读写CSV文件 2. 读Excel文件 3. 获取工作表和单元格数据 3…

前端css实现特殊日期网页变灰功能

前端变灰效果在网页实际使用过程中使用的比较少&#xff0c;但有时候又缺一不可&#xff0c;一般在大型哀悼日或纪念日的时候使用&#xff0c;使用后的网站页面会变成灰色(黑白色)。 我们先看下各大网站是怎么实现的&#xff1a; 1.csdn实现方式 2.淘宝 3.人民网 4.京东 5.掘…

Unity【Multiplayer 多人在线】服务端、客户端通用架构的使用指南

文章目录&#x1f6a9; Import&#x1f680; protogen使用方法&#x1fa90; 客户端接口&#x1f308; 服务端接口&#x1f9ed; 数据处理&#x1f3a8; Example&#x1f6a9; Import 下载SKFramework框架&#xff0c;导入到Unity中&#xff1b; 在框架Package Manager中搜索并…

osgEarth示例分析——osgearth_colorfilter

前言 osgearth_colorfilter颜色过滤器示例。本示例中&#xff0c;主要展示了6种颜色过滤器的使用&#xff0c;分别是:HSLColorFilter、RGBColorFilter、CMYKColorFilter、BrightnessContrastColorFilter、GammaColorFilter、ChromaKeyColorFilter。 执行命令 // 一条命令是一…

Docker日常运维小技巧

一、故障定位 1、查看容器内部 https 请求响应时间 docker exec -t $(docker ps -f nameblog_web -q) curl -H X-Forwarded-Proto:https \-w %{time_total} -o /dev/null -s localhost 2、查看容器日志 docker logs --tail 50 --follow --timestamps mediawiki_web_1 3、删…

深圳SMT贴片行业MES系统解决方案~MES系统服务商~先达智控

随着我国工业的迅速发展&#xff0c;所有电子行业都离不开SMT贴片生产&#xff0c;SMT贴片生产是电子行业的至关重要的一道工业环节&#xff0c;我国作为一个工业制造大国&#xff0c;有着完备的SMT现代产业体系。SMT贴片领域是我国支柱性产业其一&#xff0c;SMT贴片产品涵盖工…

【JavaWeb开发-Servlet】day01-使用TomCat实现本地web部署

目录 1、准备java web开发环境 &#xff08;1&#xff09;下载javaJDK&#xff08;推荐使用JDK1.8&#xff0c;企业常用且稳定&#xff09; &#xff08;2&#xff09;下载TomCat服务器 2、创建web服务器TomCat (1)创建一个项目文件夹 (2)在文件夹中新建一个记事本并编以下…

算法大神左程云耗尽5年心血分享程序员代码面试指南第2版文档

前言 学习是一种基础性的能力。然而&#xff0c;“吾生也有涯&#xff0c;而知也无涯。”&#xff0c;如果学习不注意方法&#xff0c;则会“以有涯随无涯&#xff0c;殆矣”。 学习就像吃饭睡觉一样&#xff0c;是人的一种本能&#xff0c;人人都有学习的能力。我们在刚出生…