持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第3天,点击查看活动详情
随着业务复杂度的直线上升,前端项目不管是从代码量上,还是从依赖关系上都呈爆炸式增长。同时,由于团队中一般不止有一个业务项目,所以多个项目之间如何配合随着业务扩展渐渐浮出水面。一名合格的高级前端工程师,必需能在宏观上妥善处理这些问题。
monorepo 与 multierpo
multierpo就是将引用按照模块分别在不同的产库中进行管理,而monorepo就是将应用中所有模块全部放在同一个项目中,这样不需要单独发包、测试,且所有代码都在一个项目中管理,一同部署上线,能够在开发阶段更早地复现bug,暴露问题。
这就是项目代码在组织上的不同哲学:一种提倡分而治之,一种提倡集中管理。究竟选择哪种组织,就要根据团队风格和实际场景进行选型了。
使用 Lerna 实现 monorepo
目前来讲,Lerna 作为 JavaScript项目的多包管理器,已经是比较成熟,并已被现代企业所验证,因此接下来将逐步搭建一个基于 Lerna 的 Monorepo 管理环境,希望可以帮助大家在各司业务中落地并实现降本提效。
Lerna 是一个管理工具,用于管理包含多个软件包(package)的 JavaScript 项目。
将大型代码仓库分割成多个独立版本化的 软件包(package)对于代码共享来说非常有用。但是,如果某些更改 跨越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且, 跨越多个代码仓库的测试将迅速变得非常复杂。
为了解决这些(以及许多其它)问题,某些项目会将 代码仓库分割成多个软件包(package),并将每个软件包存放到独立的代码仓库中。但是,例如 Babel、 React、Angular、Ember、Meteor、Jest 等项目以及许多其他项目则是在 一个代码仓库中包含了多个软件包(package)并进行开发。
Lerna 是一种工具,针对 使用 git 和 npm 管理多软件包代码仓库的工作流程进行优化
接下来上手安装Lerna 首先使用 npm 将 Lerna 安装到全局环境中
npm install --global lerna
接下来,我们将创建一个新的 git 代码仓库:
git init lerna-repo && cd lerna-repo
现在,我们将上述仓库转变为一个 Lerna 仓库:
lerna init
你的代码仓库目前应该是如下结构:
lerna-repo/
packages/
package.json
lerna.json
现在可以在packages/再建几个子项目
lerna-repo/
packages/
packages1/
package.json
packages2/
package.json
packages3/
package.json
package.json
lerna.json
再到主目录下安装依赖
cd ..
lerna bootstrap
这个命令的作用就是,假设我们在packages1项目中添加了依赖packages2,那么执行lerna bootstrap命令后,就会在packages1项目的node_modules目录下创建软连接直接指向packages2目录。野牛实说可以通过软连接指向相关依赖。
结合 yarn workspaces
yarn workspaces 可以将多个包的 node_modules 整合成一个, 只需要执行 yarn install 就可将所有包的依赖安装。
下面以一个例子来说明:
root/
packages1/
package.json
packages2/
package.json
packages3/
package.json
node_modules/
package.json
根目录 package.json 文件中声明了 workspaces:
{
"private": true,
"workspaces": ["packages1", "packages2"]
}
注意,添加 private: true 是防止工作区根目录被发布到 npm,workspaces 是一个数组,其中包含所有“工作空间”的路径,也可支持通配符,如 "workspaces": ["packages/*"]。
我们发现项目根目录下的 node_modules 已经包含了所有声明的依赖,且各个子包的 node_modules 中不会重复存在依赖,只会应用根目录下 node_modules 的包。
lerna 和 yarn workspaces 两者搭配是用能够发挥更大的作用。lerna负责版本管理与发布,其强大的API和设置可以使我们在开发时做到灵活细致。yarn workspaces负责依赖管理,使整个流程非常清晰。
小结
本篇分析了 monorepo 方案,对于大型代码库的组织,梳理了大致的工作流程。至于团队使用什么方案落地,则需要经过团队自己去思考,哪种方案对于自己的团队才是最优解。
最后,让我们一起加油吧!