Element Plus 官方仓库 的发布流程本质上是:
Monorepo(pnpm workspace) + 构建 packages + 版本管理 + 发布到 npm
它的发布体系比较成熟,适合你现在正在做的组件库架构参考。
Element Plus 的整体发布架构
核心技术:
- pnpm workspace
- monorepo
- internal packages
- gulp + rollup + esbuild
- changeset(现在)
- GitHub Actions 自动发布
- npm publish
目录大概类似:
packages/
components/
theme-chalk/
hooks/
utils/
internal/
build/
metadata/
play/
docs/
一、packages 如何组织
Element Plus 每个模块都是独立 package:
例如:
packages/
components/
button/
input/
hooks/
utils/
directives/
每个 package 都有:
{
"name": "@element-plus/components",
"version": "2.x.x"
}
最终通过 workspace 管理。
二、构建流程(build)
Element Plus 不是直接用 Vite build。
而是:
pnpm build
内部执行:
gulp build
实际会:
1. 编译 TS
使用:
- rollup
- esbuild
- ts-morph
生成:
dist/
es/
lib/
分别对应:
ESM
CommonJS
2. 生成类型
dist/types
通过:
vue-tsc
或者:
ts-morph
3. 生成样式
theme-chalk 单独构建:
packages/theme-chalk
编译:
输出:
dist/index.css
三、版本管理(最关键)
以前:
Element Plus 用:
lerna
后来迁移:
changesets
现在推荐你也这样。
四、Changesets 发布机制
安装:
pnpm add @changesets/cli -Dw
初始化:
pnpm changeset init
会生成:
.changeset/
五、开发者如何发版
第一步:创建 changeset
pnpm changeset
会交互选择:
patch
minor
major
例如:
---
"@element-plus/components": minor
---
feat: add xxx
第二步:更新版本号
pnpm changeset version
它会:
- 自动更新 package.json version
- 自动更新 changelog
第三步:构建
pnpm build
第四步:发布
pnpm changeset publish
底层其实:
npm publish
六、Element Plus 如何发布多个包
因为是 workspace:
packages:
- packages/*
- internal/*
pnpm 会自动识别。
发布时:
pnpm -r publish
或者 changeset 自动处理。
七、发布到 npm 的关键配置
每个 package:
{
"main": "lib/index.js",
"module": "es/index.mjs",
"types": "es/index.d.ts",
"files": [
"es",
"lib",
"dist"
]
}
八、如何发布到私有 npm(你之前问的)
你可以直接:
{
"publishConfig": {
"registry": "http://192.168.0.232:4873/"
}
}
或者:
npm publish --registry http://192.168.0.232:4873/
更推荐:
# .npmrc
registry=http://192.168.0.232:4873/
九、Element Plus 的 CI/CD
GitHub Actions:
on:
push:
tags:
- v*
自动:
pnpm install
pnpm build
pnpm changeset publish
十、你现在最推荐的方案(适合 Vue3 组件库)
你完全可以直接照着这个架构:
推荐技术栈
Monorepo
pnpm workspace
构建
简单版:
vite + vite-plugin-dts
大型版:
rollup + tsup
发布
changesets
文档
vitepress
playground
play/
十一、最简现代组件库发布流程
你可以这样:
pnpm changeset
pnpm changeset version
pnpm build
pnpm changeset publish
基本就是现代组件库标准方案。
十二、你现在最容易踩的坑
1. workspace package 没有 build
会出现:
ERR_PNPM_RECURSIVE_RUN_NO_SCRIPT
解决:
"scripts": {
"build": "vite build"
}
2. rollup 没有 input
你前面报错:
You must supply options.input
说明:
没有入口文件。
必须:
build: {
lib: {
entry: resolve(__dirname, 'index.ts')
}
}
3. package exports 配错
现代组件库必须:
"exports": {
".": {
"import": "./es/index.mjs",
"require": "./lib/index.js",
"types": "./es/index.d.ts"
}
}
十三、如果你想复刻 Element Plus
建议你拆成:
packages/
components/
hooks/
utils/
theme/
然后:
scripts/
build.ts
最后:
changesets
即可。
十四、Element Plus 当前最值得学习的点
最核心其实不是 UI。
而是:
- monorepo 组织
- build system
- package exports
- 类型生成
- 自动发布
- 按需加载
这些才是真正工业级的部分。