Vite 本身不直接管理 Monorepo 多包依赖,但通过 TypeScript Project References、按包隔离构建配置、pnpm+Turborepo 任务缓存及分阶段类型检查,可显著提升 TypeScript 多包单仓项目的构建效率与开发体验。

Vite 本身不直接管理 Monorepo 的多包依赖关系,但配合正确的配置和工具链,能显著提升 TypeScript 多包单仓项目的构建效率与开发体验。核心不在“Vite 做了什么”,而在于它如何与 TypeScript、pnpm、Turborepo 等协同,让增量编译、类型检查、依赖复用真正落地。
启用 TypeScript Project References
这是优化编译速度最有效的手段——避免全量重编,只构建变更包及其下游依赖。
- 每个包的
tsconfig.json中开启"composite": true,并指定"outDir"和"declaration": true - 在依赖它的包中,通过
"references"字段显式声明依赖:{"references": [{"path": "../shared/tsconfig.json"}]} - Vite 构建时默认不读取
references,需搭配vue-tsc --noEmit或tsc -b进行类型检查,而 Vite 仅负责打包(可跳过重复类型检查)
按包隔离 Vite 构建配置
不同包用途不同(组件库、应用、工具包),不能共用一套 vite.config.ts。
- 组件库包:启用
build.lib模式,输出.d.ts(配合vue-tsc --emitDeclarationOnly) - 应用包:启用
build.ssr或build.rollupOptions.output.manualChunks控制代码分割 - 共享工具包:设为
build.emptyOutDir: false,避免每次清空影响其他包引用 - 所有包统一使用
resolve.alias映射 workspace 内部路径(如@shared→../../packages/shared/src),避免相对路径混乱
利用 pnpm + Turborepo 实现任务级缓存与并发
Vite 负责单包构建,而构建调度和缓存由更高层工具接管。
- pnpm 提供硬链接式
node_modules,确保各包共享同一份依赖,消除重复安装和预构建开销 - Turborepo 的
turbo.json定义build任务依赖图:"build": {"dependsOn": ["^build"], "outputs": ["dist/**"]},自动识别变更包及影响范围 - 启用远程缓存(如 Vercel Turborepo Cloud)后,CI/CD 中未变更的包可直接复用缓存产物,无需重新构建
- 搭配
pnpm build --filter ./packages/ui...可精准触发子包构建,避免全量执行
精简类型检查范围,避免 ESLint + tsc 双重耗时
TypeScript 类型检查不是构建必需环节,但必须可靠;应与构建解耦、分阶段执行。
- 开发时:Vite 启动不跑
tsc,靠编辑器和vue-tsc --watch提供实时类型反馈 - 提交前:用
lint-staged+eslint --ext .ts,.tsx检查变更文件,跳过node_modules和dist - CI 构建前:运行
tsc --build --force全量验证,但仅对发布分支启用,日常 PR 可跳过 - ESLint 配置中明确限定
parserOptions.project路径,避免宽泛 glob(如./**/tsconfig.json)导致扫描卡顿


















