ElementPlus 源码之 发布流程

7 阅读2分钟

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
  • 类型生成
  • 自动发布
  • 按需加载

这些才是真正工业级的部分。