package.json 子项目问题
大约 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进行本地子项目管理的大致步骤: