Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

开滴滴
• 阅读 1495

前两篇文章分享了基于 vite3 vue3 的组件库基础工程 vue3-component-library-archetype 和用于快速创建该工程的工具 yyg-cli,但在中大型的企业级项目中,通常会自主搭建这些脚手架或加速器。优雅哥希望每位前端伙伴能知其所以然,故接下来的文章将进入 Vue3 企业级优雅实战 系列,整个系列将包括五大部分:

 Vue3 企业级优雅实战 - 组件库框架 - 1 搭建 pnpm monorepo

首先会分享如何从 0 开始搭建一套组件库基础工程,即如何从 0 实现 vue3-component-library-archetype

1 组件库工程应该具备的功能

在参考 Element PlusAnt DesignVan UIVue3 开源 UI 项目后,优雅哥认为一套企业组件库工程需要具备如下功能:

  1. 组件库的开发:这是最基础的,组件库工程必须要支持组件库的开发,在工程中开发各种组件;
  2. 组件库的构建:组件库开发完成后,不可能让所有使用该组件库的项目都使用源码的方式引入到各个项目中,而是要将其构建打包后发布到私服或 npm 上,各个项目通过依赖的方式引入使用。在这个过程中,就涉及类型定义的提取、不同模块化规范的打包等;
  3. 组件库的发布:上面提到组件库构建打包后需要发布到私服或 npm,那难道在组件库开发阶段就频繁的发布到私服上吗?这样做也没问题。不过优雅哥的建议是在本地启动一个迷你私服,当组件库开发到一个阶段(如 beta版本)可以提供给其他项目使用时,便可以按照常规流程发布到公司的私服或 npm 上。
  4. 组件库文档的编写和发布:通常会采用 MarkDown 来编写组件库的操作手册、每个组件的 API(props 组件的输入属性、events 组件提供的事件、methods 组件暴露的方法、slots 组件支持的插槽)、组件的使用说明、Demo 展示、Demo 对应的代码等。组件库文档中的 Demo 不仅给使用者参考,还可以使用它来调试组件。在文档编写完成后,需要将文档构建打包发布到 HTTP 服务上,供开发同事查看。
  5. 组件库开发工具 cli:每次新创建一个组件,都需要创建一套组件目录文件结构、注册该组件、在文档中添加该组件文档、Demo等操作,整个过程繁琐且没价值,而组件库可能会有几十个组件,所以很有必要开发一个 cli 用于快速创建组件,同时实现创建组件的规范化。
  6. 组件库 example 的开发和发布:这个是非必须的,在组件库中添加这个部分是基于两个方面考虑,其一是可以开发一个演示站点,用来展示组件库在项目中的实现效果;其二是在我的实践中,组件的开发通常由业务开发驱动,在开发 example 的过程中逐步完善组件库中的组件,当组件实现到一定的程度后,便可以将 example 抽取到独立的工程中。

2 环境准备

  1. Node JS 和 npm 版本:
node -v
npm -v

各位使用的版本最新大于等于我的版本。我本地的版本如下:

node:8.10.0
npm:7.14.0
  1. 安装或更新 pnpm
npm install -g pnpm

安装后查看版本:

pnpm -v

我本地 pnpm 版本号为 7.14.2

3 搭建 monorepo 项目

monorepo 单一代码库,是一种代码库的组织方式,与之对应的是 multirepos 多代码库。multirepos 通常是将不同的模块(packages)放在不同的代码仓库中,而 monorepo 是一个代码仓库中存放多个 packages。

在咱组件库基础工程项目中,包含了很多个包:多个组件的包、文档对应的包、cli 包、example 包,如果都在不同的代码仓库中维护,那则需要对应多个仓库,开发过程中需要在多个仓库间切换。此外,不同的仓库间的代码相互引用也比较麻烦。所以在组件库基础工程采用 monorepo 的方式来组织多个包。

实现 monorepo 有很多方式,LernaYarn Workspacepnpm Workspace 等,这里我选择 pnpm,使用 pnpm 后你会感觉到它的很多好处:速度、磁盘空间等。

关于 pnpm、monorepo 的理论知识,大家自己上网查询,优雅哥就不写那些无关痛痒的废话来凑数了。

3.1 创建项目

  1. 创建项目根目录

创建一个目录,作为组件库工程的根目录,目录名就使用你定义的组件库的名称,我命名为 yyg-demo-ui。用 IDE 打开该目录。

  1. 初始化 package.json

在命令行中进入该目录,使用 pnpm 初始化 package.json

pnpm init

执行完该命令后,会在项目根目录下自动生成 package.json 文件。在 package.json 文件中指定 type 属性为 module

{
    ...
  "type": "module",
  ...
}
  1. git 初始化:
git init
  1. 创建目录

在项目根目录下分别创建 cli、docs、example、packages 四个目录,分别存放命令行工具、组件库文档、example、组件库四大模块,并在 packages 目录下创建 foo 和 yyg-demo-ui (yyg-admin-ui 需修改为你的组件库名)两个目录。

mkdir -p cli docs example packages/foo packages/yyg-demo-ui

目录结构如下:

yyg-demo-ui/
|- cli/
|- docs/
|- example/
|- packages/
        |- foo/
        |- yyg-demo-ui/

3.2 配置 workspace

前面创建了四个目录,需要告诉 pnpm 有哪些包,pnpm 提供了配置文件来配置 monorepo

  1. 在项目根目录下创建配置文件 pnpm-workspace.yaml
packages:
  - packages/*
  - cli
  - docs
  - example
  # exclude packages that are inside test directories
  - '!**/test/**'

上面的配置指定了 clidocsexample 本身是 package,packages 目录下的子目录也是 package。同时排除了所有的 test 目录。

  1. package.json 中指定 workspace
{
    ...
  "workspaces": [
    "packages/*",
    "cli",
    "docs",
    "example"
  ]
}

到这一步就完成 pnpm + monorepo 的搭建了,项目根目录称为 workspace-root,下一步将初始化 workspace-root

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
7个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
JavaScript常用函数
1\.字符串长度截取functioncutstr(str,len){vartemp,icount0,patrn/^\x00\xff/,strre"";for(vari
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这