pnpm + monorepo 为何是组件库/工具库的最佳方案

283 阅读2分钟

Monorepo(单仓多模块) 与其他项目开发模式有什么区别?

Monorepo(单仓多模块) 模式中所有相关项目和组件都被存储在一个代码仓库中,彼此之间可以互相依赖每个子模块单独构建部署流程

Monolithic(单体应用) 模式中整个项目由单一代码库组成,构建和部署流程针对整个代码库

Multirepo(多仓多模块) 模式中项目拆分为多个独立仓库,每个仓库有单独的构建部署流程

特点\模式MonorepoMonolithicMultirepo
仓库个数单个单个多个
构建部署流程单个模块整个项目单个仓库
代码复用模块之间复用直接调用相同逻辑重写或提取到通用仓库

为什么组件库/工具库选用 Monorepo?

其实也该叫为什么不选用 Monolithic(单体应用) 和 Multirepo(多仓多模块)?

monorepo 的优势:

  1. 方便代码复用,工作流复用
  2. 模块独立管理
  3. 分工明确

选用 Multirepo(多仓多模块) 的缺点

当选用这种模式时,可以想象这么一种场景:

view 库依赖 components 组件库

components 组件库依赖 shared 通用方法库

当我们更新 shared 库时,components 组件库和 view 库都要进行依赖更新。

上层包想要得到底层包更改的效果,需要严格逐层升级

其次,每个包会有很多相似的配置,一旦涉及到整体的修改,需要对多个仓库都进行修改

选用 Monolithic(单体应用) 的缺点

  1. 代码维护性差,耦合性强
  2. 任何小修改必须重新构建整个项目,过程长
  3. 任何一个功能出现问题,可能导致整个应用挂掉

为什么 pnpm 是 monorepo 的最佳搭配?

npm 与 yarn 的历史遗留问题

  1. npm 和 yarn 将依赖进行扁平化处理,相同依赖提升到顶层,这需要消耗很多性能,并且依赖是串行安装
  2. 大量文件重复下载
  3. 扁平化依赖带来了幽灵依赖的问题(可以访问没有安装的依赖)

pnpm 是如何解决上述问题的?

  1. 并行安装依赖,其中对每个包 resolving(解析依赖树,决定下载包) -> fetching(并行下载tar包) -> wrting(解压构建依赖树),同一个包的不同版本只格外存储diff内容
  2. 使用硬链接节省磁盘空间虚拟存储目录+软连接解决幽灵依赖