Monorepo与pnpm最佳实践

本文将介绍如何使用 pnpm 及 Monorepo 实现高效的代码构建和发布流程。

什么是 Monorepo?

Monorepo 是一种将多个项目统一放在一个代码仓库中进行集中管理的方式,适用于项目间耦合度高、共享代码较多的场景

Vue 为例,其源码采用 Monorepo 管理模式,代码仓库中包含多个子项目,如 reactivityruntime-corecompiler-core 等。每个子项目拥有独立的 package.json,可单独安装、运行与测试。

这种管理方式带来的好处包括:

  • 便于团队协作:不同团队在同一代码库中开发,统一规范和流程,避免重复造轮子
  • 提升代码复用率:子项目间可以直接相互引用,无需通过发布依赖包的方式
  • 统一版本与质量控制:更易对各模块进行集中测试、构建与发布,保障整体代码质量
  • 降低开发复杂度:避免多仓库切换与依赖同步问题,提高开发效率

构建 Monorepo 项目

  1. 全局安装

    npm install pnpm -g

  2. 创建 monorepo 仓库:

bash 复制代码
mkdir monorepo && cd monorepo
pnpm init
  1. 在根目录下添加 pnpm-workspace.yaml 文件,告诉 pnpm 当前 Monorepo 中哪些目录属于 workspace
makefile 复制代码
packages:
  - "apps/*"				这是存放"业务应用"的地方,通常是最终运行的项目,比如后台、前台、小程序等。
  - "packages/*"		这是存放"可复用模块/工具库/组件"的地方,所有 apps/ 中的项目可以直接使用它们。
  1. 添加项目
bash 复制代码
mkdir apps && cd apps

# apps-a
mkdir apps-a && cd apps-a
pnpm init

# apps-b
mkdir ../apps-b && cd ../apps-b
pnpm init
  1. 安装依赖
csharp 复制代码
// 安装依赖
pnpm install

// 安装包到根
pnpm add xxx -w

// 安装项目到特定项目
pnpm --filter apps-b add name@version -D

具体的可以看文档:pnpm.io/zh/cli/add

  1. 启动项目
scss 复制代码
// 不需要进到特定的项目来操作
// xxxx  子项目package配置的name名称
pnpm --filter xxxx start 

安装包的原则:

  1. 一般公共的包都是安装到最外层 ,除了版本原因等需要"覆盖的"则安装到特定的项目里
  2. 所有的项目都需要package.json,package.json的name一般是以"@"作为开头,比如@falcon-covoy,这块需要改;
  3. apps-aapps-bpackage.json都是单独的,需要提取公共的包到最外层的package.json
  4. 项目需要完善的部分:Changesets、Semantic-release、Turbopack、Sonar、Commitlint、Sentry报警、Sentry Transcation业务统计等工具
相关推荐
JinSo11 分钟前
pnpm monorepo 联调:告别 --global 参数
前端·github·代码规范
程序员码歌18 分钟前
豆包Seedream4.0深度体验:p图美化与文生图创作
android·前端·后端
urhero22 分钟前
工作事项管理小工具——HTML版
前端·html·实用工具·工作事项跟踪·任务跟踪小工具·本地小程序
二十雨辰24 分钟前
eduAi-智能体创意平台
前端·vue.js
golang学习记32 分钟前
从0死磕全栈之Next.js connection() 函数详解:强制动态渲染的正确姿势(附实战案例)
前端
郝学胜-神的一滴39 分钟前
Three.js光照技术详解:为3D场景注入灵魂
开发语言·前端·javascript·3d·web3·webgl
m0dw43 分钟前
vue懒加载
前端·javascript·vue.js·typescript
国家不保护废物1 小时前
手写 Vue Router,揭秘路由背后的魔法!🔮
前端·vue.js
菜鸟‍2 小时前
【前端学习】仿Deepseek官网AI聊天网站React
前端·学习·react.js
小光学长2 小时前
基于Vue的保护动物信息管理系统r7zl6b88 (程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。
前端·数据库·vue.js