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

392 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第8天,点击查看活动详情

pnpm 是什么?

Fast, disk space efficient package manager.

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

特点 🙂

快速:pnpm 比其他包管理器快 2 倍。查看所有基准

image.png

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

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

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

关于pnpm如何高效利用磁盘空间以及为何选择创建非扁平化的node_modules,可以查看文章:

扁平 node_modules 不是唯一的方法

关于monorepo

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

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

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 pnpm

Flat node_modules is not the only way

单体仓库与多仓库都有哪些优势劣势

What Is a Monorepo?

httpweixin.qq.comr5RGXj2jETTUyrSzs90T3.png

来源:前端妙妙屋 - 前端开发者的学习资源