现在有npm yarn pnpm monorepo思想 rush lerna TurboRepo workspace很多概念
项目中用到A依赖,A用到B依赖,yarn会把B放在和A同级的位置,所以你项目中可以直接require(‘B’),缺点:一但A不依赖B了,这种写法就出问题了。
这是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去到对应虚拟磁盘找到依赖。这样不同的依赖只会存一份。
一句话:用一个大项目A来承载一堆子项目BCD。以前一个项目一个仓库,现在用一个git仓库统一管理全部。【有点多页应用的味道】
好处就是多了个公共文件夹存放公共内容,比如公共组件、工具方法、配置文件;应用衍生的具体优势就很多:
基于monorepo思想的实践有以下几个:
官宣停止维护了…
lernaJs是由Babel团队出的一个多包管理工具。因为Babel包含很多子包,以前都是放在多个仓库里的,管理比较困难,特别是有调用系统内包的时候,发布比较麻烦。所以为了能更好更快的夸包管理,babel推出了lernaJs,使用了monorepo的概念,现在React,Babel,Angular,Jest都在使用这个工具来管理包
Yarn 1.0 版本中,开发人员发布了一个名为 Workspaces 的功能主要用于基于 Monorepo 方案来管理多个应用程序之间的依赖处理。
通常业界主流基于 Lerna 负责发布和版本控制,而使用 Yarn Workspaces 来管理多个应用程序之间的依赖。
workspace这个东西作用是什么呢:他可以在不打包发布一个项目的情况下,可以像已发布那样子引用该组件,比如import loadsh form ‘loadsh’。
根目录下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
那么就能成功运行了。
后续再更新吧