关于包管理杂谈
现在有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仓库统一管理全部。【有点多页应用的味道】
好处就是多了个公共文件夹存放公共内容,比如公共组件、工具方法、配置文件;应用衍生的具体优势就很多:
- 依赖更新方便:我更新A里面的公共组件时候,BCD的引用自然也是最新的了,不用再去一个个更新。【以往npm的包更新时候只能配置一个hook通知你们,再手动更新BCD吧】
- 打包配置、代码规范配置等等可以统一
- 复用逻辑清晰
- 拉代码方便,(我的理解是公共文件更新时候,拉取就行,而不是像以前那样重装依赖)
- 子应用可以独立部署构建(我意思是后续可以单独build某个应用,不用每次build整个大项目)
基于monorepo思想的实践有以下几个:
- lerna
- yarn
- 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’。
-这个作用有什么意义?
- 你开发组件库时候,可以用这个东西辅助,就不需要打包通过dist/…访问了。
- 在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
后续再更新吧