聊聊多包管理,杂谈,monorepo

关于包管理杂谈

现在有npm yarn pnpm monorepo思想 rush lerna TurboRepo workspace很多概念

依赖存储方式:

-Phantom dependencies幽灵依赖:

项目中用到A依赖,A用到B依赖,yarn会把B放在和A同级的位置,所以你项目中可以直接require(‘B’),缺点:一但A不依赖B了,这种写法就出问题了。

-NPM doppelgangers打平依赖:

这是npm用到的方式,项目用到ABCD依赖,AB用到1.0版本的E依赖,CD用到2.0版本的E依赖。存储方式就是:ABCD(E1.0)同级保存,E2.0保存在C、D的下一级,没错,就是E1.0存了一份,2.0存了2份。因为2.0提到第一级就会依赖冲突。缺点:浪费空间
【幽灵依赖策略和打平依赖策略不是冲突的,打平是针对版本不同的情况】

pnpm解决上面的问题,用到了symlink+hard link机制实现的,pnpm会把依赖存到全局,分配一个hard link标注位置(本质是个虚拟路径方式)。然后通过symlink去到对应虚拟磁盘找到依赖。这样不同的依赖只会存一份。

monorepo思想

一句话:用一个大项目A来承载一堆子项目BCD。以前一个项目一个仓库,现在用一个git仓库统一管理全部。【有点多页应用的味道】

好处就是多了个公共文件夹存放公共内容,比如公共组件、工具方法、配置文件;应用衍生的具体优势就很多:

  1. 依赖更新方便:我更新A里面的公共组件时候,BCD的引用自然也是最新的了,不用再去一个个更新。【以往npm的包更新时候只能配置一个hook通知你们,再手动更新BCD吧】
  2. 打包配置、代码规范配置等等可以统一
  3. 复用逻辑清晰
  4. 拉代码方便,(我的理解是公共文件更新时候,拉取就行,而不是像以前那样重装依赖)
  5. 子应用可以独立部署构建(我意思是后续可以单独build某个应用,不用每次build整个大项目)

基于monorepo思想的实践有以下几个:

  1. lerna
  2. yarn
  3. pnpm

lerna

官宣停止维护了…

-什么是lerna

lernaJs是由Babel团队出的一个多包管理工具。因为Babel包含很多子包,以前都是放在多个仓库里的,管理比较困难,特别是有调用系统内包的时候,发布比较麻烦。所以为了能更好更快的夸包管理,babel推出了lernaJs,使用了monorepo的概念,现在React,Babel,Angular,Jest都在使用这个工具来管理包

yarn

Yarn 1.0 版本中,开发人员发布了一个名为 Workspaces 的功能主要用于基于 Monorepo 方案来管理多个应用程序之间的依赖处理。

通常业界主流基于 Lerna 负责发布和版本控制,而使用 Yarn Workspaces 来管理多个应用程序之间的依赖。

pnpm支持workspace

workspace这个东西作用是什么呢:他可以在不打包发布一个项目的情况下,可以像已发布那样子引用该组件,比如import loadsh form ‘loadsh’。

-这个作用有什么意义?

  1. 你开发组件库时候,可以用这个东西辅助,就不需要打包通过dist/…访问了。
  2. 在monorepo项目中,可以做到A重新修改代码后。引用了A的BCD都可以重新更新。或者ABCD互相引用的情况

-使用

根目录下pnpm init
新建component公共组件目录,执行pnpm init
修改component/pageck.json name:‘@test/component’
创建pnpm-workspace.yaml,配置component为工作空间

新建webApp应用目录,执行pnpm init
修改webApp/pageck.json name:‘@test/webApp’
根目录执行pnpm add ‘@test/component’ --filter=@test/webApp

新增webApp/pageck.json的启动命令start
根目录执行pnpm start '–filter=@test/webApp
那么就能成功运行了。

Turborepo

后续再更新吧

你可能感兴趣的:(npm,前端)