随着前端开发项目的日益复杂化,Monorepo 的使用逐渐成为现代前端工程中的重要趋势。传统上,开发者们通常使用多个 Git 仓库来管理不同的项目,而 Monorepo 的理念则是将所有子项目集中在同一个 Git 仓库中进行管理,即所有的子项目都存放在根目录的packages
目录下,简化协作和提高效率。PNPM 作为当前最快速且节省磁盘空间的包管理工具,在 Monorepo 项目管理中展现了其独特的优势。本文将深入探讨 PNPM 在 Monorepo 项目中的应用,从零开始构建高效的开发环境。
文章导航
什么是 Monorepo?
Monorepo 是一种将多个项目或包文件放入同一个 Git 仓库进行管理的开发模式。其主要结构通常如下:
├── packages
| ├── pkg1
| | ├── package.json
| ├── pkg2
| | ├── package.json
├── package.json
├── pnpm-workspace.yaml
在 Monorepo 模式下,packages
目录下的每个子文件夹代表一个项目或包,这种方式的核心优势在于:
- 代码复用:多个项目可以共享代码,避免重复开发。
- 统一开发流程:所有项目在同一个 Git 仓库中,开发流程一致。
- 高效管理:便于集中管理、发布和版本控制,尤其是对于多项目依赖的情况。
为什么选择 PNPM?
与常见的 Yarn 和 NPM 相比,PNPM 在 Monorepo 项目中展现了更多独特的优势:
- 安装速度极快:PNPM 采用非扁平的包结构,不使用
yarn/npm
复杂的扁平算法,并且仅更新发生变化的文件,极大提升了安装速度。 - 节省磁盘空间:PNPM 会将安装的包统一存放在磁盘的某个位置,项目中的
node_modules
通过hard-link
的方式链接到实际的安装地址,有效减少磁盘占用。
这些优势使得 PNPM 成为管理 Monorepo 项目的不二选择,特别是在多个项目间需要频繁共享代码时,PNPM 的节省空间和高效安装能力尤为突出。
如何使用 PNPM 构建 Monorepo?
以下是使用 PNPM 管理 Monorepo 项目的步骤:
1. 初始化项目
在项目根目录下创建 package.json
文件,并初始化项目:
pnpm init
随后,新建一个名为 pnpm-workspace.yaml
的文件以及 packages
文件夹(用于存放各个子项目),这两者是 PNPM 管理 Monorepo 项目的固定格式。
2. 创建多个子项目
然后在你的packages 下可创建多个文件夹(一般一个项目代表一个文件夹),并分别初始化你的项目(就像平常构建项目一样构建、只不过是在packages 文件夹下面)
- 分别初始化每个项目执行 pnpm init
- 然后正常构建项目
# 初始化 pkg1 子项目
cd packages/pkg1
pnpm init
此时,每个项目的开发流程与普通项目无异,只是它们都位于同一个 Git 仓库中,便于集中管理。
3. 全局与局部安装依赖
在 Monorepo 中,可以选择在根目录下或具体的项目中安装依赖。在这里的项目打包我是用的 vite。
- 在根目录安装vite(由于vite是两个项目都使用,可在根目录执行命令如下)
# 此处的 -w 正是因为 pnpm 本身支持monorepo。他代表其他项目共用这个包
pnpm i vite --save-dev -w
- 然后对于某个项目特定的包
pnpm --filter 具体项目文件名 add 包名
4. 如何统一或者单独在根目录下执行你的项目
- 分别配置项目中的package.json(根目录下的除外)中的脚本如图所示(此处是 vite 配置)
"dev": "vite",
"build": "vite build",
- 然后在根目录下安装一个包名为 concurrently 的包实现多个项目同时打包或运行
pnpm i concurrently --save-dev -w
- 然后在根下的package.json中统一配置
{
"scripts": {
"dev:main": "pnpm -C ./packages/main run dev",
"dev:plugins": "pnpm -C ./packages/plugins run dev",
"build:main": "pnpm -C ./packages/main run build",
"build:plugins": "pnpm -C ./packages/plugins run build",
"dev": "concurrently \"pnpm dev:main\" \"pnpm dev:plugins\"",
"build": "concurrently \"pnpm build:main\" \"pnpm build:plugins\"",
"test": "echo \"Error: no test specified\" && exit 1"
}
}
5. 公共代码管理
开发中可能有些公共代码,比如这两个项目可能业务一样,用到的后端接口之类的一样,其实就可以单独管理(此处就不具体演示,而是做一个demo)
- 在packages下创建一个新的文件夹(即此处第三个项目文件夹、配置一样不变)
- 然后在新建的项目的package.json中配置name为 根package.json中的name/当前项目的name(规范一下命名)
- 最后在你想要使用的这个公共部分代码的项目中安装(此处举例: 根package.json中的name为 r,当前项目name为:libs)
pnpm i @r/libs --workspace
然后在需要使用这些公共代码的项目中,通过 import
进行引入即可。
PNPM 的独特功能:智能化管理与跨平台推广
PNPM 提供的智能化管理工具,进一步优化了 Monorepo 的开发体验。通过分组管理和自动提预算工具,开发者可以根据不同项目的需求,自动调整预算和资源分配,确保在项目的关键节点时,获得最大曝光。
此外,PNPM 还支持跨平台的推广方式,通过站内外联动的广告投放策略,将项目推广至更广泛的用户群体。无论是大型品牌还是中小型商家,PNPM 的全站推广工具能够帮助项目在双十一等大型促销活动中,精准触达目标用户,实现营销效果的最大化。
总结
在当今前端开发的复杂生态中,Monorepo 逐渐成为管理多个项目的主流方案,而 PNPM 则以其极高的安装速度和节省磁盘空间的优势,成为 Monorepo 项目管理的首选工具。通过本文的介绍,您可以轻松上手 PNPM,在多项目管理、依赖共享、自动化工具等方面显著提升开发效率。
如果您的团队正在管理多个前端项目,或者正在寻找一种更高效的开发流程,不妨尝试使用 PNPM 来构建您的 Monorepo。它不仅能帮助您节省时间和空间,还能让整个团队的开发工作变得更加顺畅。
延展阅读:
如何高效设计软件开发测试用例:解锁关键要点与实战技巧的疑问解答
MongoDB 4.0至7.0:这些主版本更新带来了哪些关键特性与性能飞跃?
电商平台客服工作台频繁卡顿怎么办?如何清理淘宝、京东、拼多多、抖音的缓存提升效率?
咨询方案 获取更多方案详情