乐趣区

关于javascript:实践-lerna-monorepo

历史

  • 上古期间,前端没有工程化的概念可言,复用代码也不过是将某些 css、js 代码片段保留到笔记,须要时复制到我的项目中,仅此而已。参考:55 个进步你 CSS 开发效率的必备片段,或是 jquery 库
  • 莽荒时代,前端呈现了 nodejs 和 npm,于是一大批通用代码被公布到了 npm 平台,能够在我的项目中简略配置即可应用通用的库,任何人都能够简略的将代码公布到 npm。参考:lodash
  • 古代,因为前端我的项目的复杂度逐步回升,所以呈现了 monorepo 工具以更简略的复用代码。例如层出不穷的 monorepo 反对工具 lerna、@microsoft/rush、yarn 2、pnpm、npm 7

自去年 10 月开始,吾辈应用 lerna 重构集体和公司的我的项目,以应答更加简单的前端我的项目。

为什么须要 monorepo?

借用一下 lerna 官网的简介:

将大型代码仓库宰割成多个独立版本化的 软件包(package)对于代码共享来说十分有用。然而,如果某些更改 逾越了多个代码仓库的话将变得很 麻烦 并且难以跟踪,并且,逾越多个代码仓库的测试将迅速变得非常复杂。

为了解决这些(以及许多其它)问题,某些我的项目会将 代码仓库宰割成多个软件包(package),并将每个软件包寄存到独立的代码仓库中。然而,例如 Babel、React、Angular、Ember、Meteor、Jest 等我的项目以及许多其余我的项目则是在 一个代码仓库中蕴含了多个软件包(package)并进行开发。

你可能会认为除了大型开源我的项目之外,monorepo 对于小型我的项目和生产环境的业务我的项目没有太多价值。但这是错的,前者我在微型工具库 liuli-util 上进行了实际,确定了它对于保护和应用的确有帮忙。而后者,甚至呈现了专门为业务我的项目的 monorepo 工具 @microsoft/rush,微软在 rushstack 我的项目中大规模应用了它。

为什么抉择 lerna?

那么,有了这么多 monorepo 工具,为什么咱们抉择 lerna?

  • lerna
  • @microsoft/rush
  • yarn 2
  • pnpm
  • npm 7

其实,除了 lerna 与 @microsoft/rush 之外,其它竞争对手都是包管理器,仅仅只是提供了 workspace 的工作空间,并未提供更高级性能。

lerna 和 @microsoft/rush 的 npm 趋势比照参考: https://www.npmtrends.com/ler…

下图是一个比照

比照项 lerna @microsoft/rush
star 26,824 2,392
周下载 1,155,241 100,386
使用者 出名开源我的项目 微软系产品

就吾辈的理论应用体验而言,相比于 lerna,rush 默认蕴含了更多的货色,而非通过组合一系列可选的工具反对,这增长了相当的门槛。

上面是吾辈对其的一些认知过程

  • rush.js 是真的感觉很【业余】,限定了很多很多货色
  • https://rushjs.io/pages/maint…
  • 像是这里,通过 allowedPackagesPolicy 的形式对 team 中所有开发人员都能够间接引入新的 npm 包做出了限度
  • 唉,rush 比 lerna 简单多了,做了很多很多的预约义的事件,这就意味着,它对我的项目维护者(而非开发者)的要求更高
  • 和 ide 没齐全集成真苦楚.JPG
  • 吾辈总算明确这些配置为什么是【举荐配置】而不是【默认配置】了,引发的谬误太多了(毕竟 npm 包很多并不标准)
  • rush monorepo 的一个问题是,某些包总喜爱强制指定依赖包的特定版本(例如 react-scripts),而 rush 总是“聪慧”的仅装置最新的,导致增加的我的项目莫名其妙的炸掉
  • 吾辈的锅,它在最初给了办法 https://rushjs.io/pages/advan…
  • 但一整个进阶主题都是在解决这个问题。。。
  • 算了,吾辈放弃了,rush + pnpm 感觉上保护配置老本太高了,滚回 lerna + yarn 了

rush 在性能、指标和文档方面更好,但现阶段而言还是 lerna 更成熟。

lerna 是什么?

简而言之,Lerna 是一个管理工具,用于治理蕴含多个软件包(package)的 JavaScript 我的项目。能够在一个我的项目中创立多个模块(基本上模块也能够认为是一个我的项目),并且能够在本地的模块之间相互关联。

lerna 我的项目的根本构造如下

生产我的项目

  • 根目录

    • apps: 生产我的项目

      • app-1
      • app-2
    • libs: 通用模块

      • lib-1
      • lib-2
    • package.json
    • lerna.json

开源库

  • 根目录

    • libs: 模块根目录

      • lib-1
      • lib-2
    • package.json
    • lerna.json

目录的名字灵感来源于 rushstack

应用 lerna 的长处

其中局部长处是 monorepo 固有的劣势,但也有 lerna 独有的性能。

  • 更容易抽离公共代码: 模块之间能够相互援用并且即时失效
  • 更容易对立

    • 我的项目配置: tsconfig.json/prettier.json/git hooks
    • 治理和公布一系列包: lerna publish
    • 批改依赖立即失效: lerna bootstrap
    • 依赖版本: 和默认合并不同版本的依赖
    • 文档生成和合并: fliegdoc
    • 代码格调: prettier/git hooks
    • 在一个模块运行另一个模块的命令: lerna run <cmd> --scope <pkg>
    • 打包工具和流程: 封装更适宜我的项目的打包 cli

目前略微大点的开源我的项目不是曾经转为了 lerna monorepo,就是曾经在转换的路上(很像最近风行的应用 typescript 重构库)。包含但不限于以下这些:

吾辈目前应用的笔记工具 Joplin 也在去年应用 lerna 重构了,参考:Lerna migration。

总结

应用 lerna 尽管会减少一些复杂度,但带来的长处依然是超过毛病的。

退出移动版