跳至主要內容

package.json 子项目问题

LincZero大约 2 分钟

package.json 子项目问题

介绍

之前我一直以为这个只能对npm库的包进行依赖,没想到本地包也是可以进行依赖的

JavaScript的 npm/pnpm/yarn 等,可以对本地的子项目进行管理。 这通常透过使用 Monorepo(一种代码存储方式,将一个项目的所有代码放在同一个仓库(repo)中,详见 [[Monorepo VS Multirepo]] 笔记)来实现。

具体实现方式有多种:

  • 多个package.json
    • 优点:每个项目可以有自己单独的依赖,不会互相干扰。对于相互独立、相互之间没有关联的子项目而言,这是一个不错的选择。
    • 缺点:重复的依赖可能浪费存储空间。如果子项目之间需要相互引用,管理和跟踪可能会比较复杂。
  • Lerna
    • 优点:Lerna可以管理项目中的公用依赖,在多个子项目间进行软连接,方便在开发时进行引用。此外,Lerna支持并行的、按顺序的发布和版本控制,非常适合对多个子项目进行统一管理和发布。
    • 缺点:与多个package.json相比,学习成本更高,有一定复杂性。
  • NPM工作区 / yarn工作区 等
    • 优点:npm 工作区是 npm v7+ 的功能,如果你已经在使用 npm,这可以帮助整合你的工作流。 它允许设置多个子项目,并把它们的node_modules聚合在一起。做到了在本地开发时的交互引用,且能够减少冗余的依赖。
    • 缺点:该功能在npm 7以上版本才有,旧版npm不支持。它仍然是npm社区较新的一个特性,因此可能还存在一些未被彻底解决的问题。

选用

  • 一般来说,选择哪种方式来管理多子项目,需要根据子项目间的关联程度、团队的熟悉程度、项目的具体需求等因素来决定。
  • 在某些项目中,使用Lerna或者npm工作区会更有助于简化流程和提高效率
  • 而在其他项目中,维护多个独立的package.json可能会更合适。

三种方案

多个package.json 方案

Lerna 方案

参考:

  • 官网:https://lerna.js.org/
  • 官网文档:https://lerna.js.org/docs/introduction
  • 国内站:https://www.lernajs.cn/,但资料很少不建议
  • 国内落地:上面链接的底部有,很多大型项目都有在使用

接下来介绍一下使用Lerna进行本地子项目管理的大致步骤: