跳至主要內容

为什么是 pnpm?我们为何使用monorepo?

Yihui大约 3 分钟

为什么是 pnpm?我们为何使用monorepo?

pnpm 是什么?

Fast, disk space efficient package manager.

pnpm 是新一代 node 包管理器。它由 npm/yarn 衍生而来,但却解决了 npm/yarn 内部潜在的 bug,并且极大了地优化了性能,扩展了使用场景,相比 yarn、npm,pnpm安装包更快速,对包的依赖管理更偏平,对磁盘占用更少。

特点

快速:pnpm 比其他包管理器快 2 倍

pnpm 比 传统的 npm 和 Yarn 快 2 倍。查看所有基准open in new window,是具有大量依赖项的应用程序的基准测试:

img

高效利用磁盘空间:node_modules中的文件是从单个内容寻址存储中的克隆或硬链接 。

支持 monorepos:pnpm 内置支持单仓多包。(接下来要讲)

严格:pnpm 默认创建了一个非平铺的 node_modules,因此代码无法访问任意包。

关于pnpm如何高效利用磁盘空间以及为何选择创建非扁平化的node_modules,可以查看文章扁平 node_modules 不是唯一的方法open in new window

关于monorepo

前文提到pnpm支持monorepo,我们来说一下什么是monorepo,以及其的可用性:

**⭐注意:monorepo不是pnpm专属,yarn 也可以通过 workspace 管理 monorepo,可以看Monorepo最佳实践之Yarn Workspacesopen in new window了解 **

monorepo 是把多个项目的所有代码放到一个 git 仓库中进行管理,多个项目中会有共享的代码则可以分包引用。整个项目就是有 root 管理的 dependencies 加上多个 packages,每个 package 也可以在自己的作用域引入自己的 dependencies。

为什么要使用 monorepo

使用 monorepo 可以把原本一个项目的多个模块拆分成多个 packages,在 packages 之间相互引用,也可以单独发布成包,极大地解决了项目之间代码无法重用的痛点。在项目打包或者编译操作时也可重用一套配置,通吃所有 packages。

Monorepo 与 Multirepo

A monorepo keeps everything in one repository. A multirepo (multiple repositories) typically has one repository for each project. The more projects, the more repositories. A multirepo is also known as polyrepo.

monorepo 将所有内容保存在一个存储库中。一个 multirepo(multiple repositories)通常为每个项目都提供一个存储库。项目越多,存储库就越多。multirepo 也称为 polyrepo。

Monorepo 通常最适合……

  • 使用单个存储库可以查看每个项目的代码和资源,这可以帮助我们管理依赖项。

  • 单个存储库使协作更容易。这是因为每个人都可以访问全部代码、文件和资源。因此,开发人员可以共享和重用资源。

  • 使用单个存储库可以帮助加速开发。例如,我们可以进行原子更改(一个操作可以跨多个项目进行更改)。

Multirepo 通常最适合……

  • 需要使用 Git 的大型项目。使用 Git 管理的大规模 monorepo 不会永远高效,并不适合将团队项目全部梭哈,而是根据业务、依赖性选择性使用Multirepo。

  • 开源或第三方库 。在某些版本控制系统中,需要多个存储库才能使用的开源项目或与第三方团队合作,并且需要确保第三方开发人员只能访问他们正在处理的项目。

留下讨论问题

  • 为什么不是全部进行软/硬连接?

  • 什么是“幽灵依赖”?

  • 这种思路很难想吗?为什么pnpm这么长时间才出现

参考:

Github pnpmopen in new window

Flat node_modules is not the only wayopen in new window

单体仓库与多仓库都有哪些优势劣势open in new window

What Is a Monorepo?open in new window