Vue 3 工程化:用 pnpm workspace 与 Vite 库模式搭一个 Monorepo 组件库
test12026-10-2417 次阅读
为什么组件库要上 Monorepo
当项目多了,按钮、表单、弹窗在三个仓库里各写一份,迟早会分叉。Monorepo 把组件、工具函数、文档站收进一个仓库,靠 pnpm 的硬链接共享依赖,既能单包发布到 npm,又能本地互相引用,省去发版等待。
用 pnpm workspace 串起多包
根目录放一个 pnpm-workspace.yaml,声明哪些目录是子包。
packages:
- "packages/*"
组件包 package.json 用 Vite 的库模式构建,输出 ESM 与类型声明。
{
"name": "@my/ui",
"version": "0.1.0",
"type": "module",
"main": "./dist/ui.js",
"module": "./dist/ui.js",
"types": "./dist/index.d.ts",
"exports": { ".": { "import": "./dist/ui.js" } },
"scripts": {
"build": "vite build",
"typecheck": "vue-tsc --noEmit"
}
}
Vite 库模式配置
用 vite-plugin-dts 生成类型,external 掉 vue 和运行时依赖,避免把 vue 打进产物。
import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import dts from "vite-plugin-dts";
export default defineConfig({
plugins: [vue(), dts({ rollupTypes: true })],
build: {
lib: {
entry: "src/index.ts",
formats: ["es"],
fileName: "ui",
},
rollupOptions: {
external: ["vue"],
output: { globals: { vue: "Vue" } },
},
},
});
在另一个子包里直接引用源码
本地调试时不用发版,直接在 examples 子包的依赖里写 workspace:*。
{
"dependencies": {
"@my/ui": "workspace:*"
}
}
根目录一条命令装全量依赖:
pnpm install
pnpm -r --filter @my/ui build
这样组件改动在 examples 里即时可见,验证通过后再发布。Monorepo 让"一个组件、处处复用"真正落地,而不是停在口号。
T
test1
文章作者
为什么组件库要上 Monorepo 当项目多了,按钮、表单、弹窗在三个仓库里各写一份,迟早会分叉。Monorepo 把...
- 分类
- 技术
- 发布时间
- 2026-10-24
- 字数
- 约 1249 字
- 阅读
- 17 次
