这次来聊聊代码组织设计

1,237 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 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 方案,对于大型代码库的组织,梳理了大致的工作流程。至于团队使用什么方案落地,则需要经过团队自己去思考,哪种方案对于自己的团队才是最优解。


最后,让我们一起加油吧!

gg.jpg