Monorepo是一種項目管理方式羽资,就是把多個項目放在一個倉庫里面淘菩,可以參考神三元大佬的一篇文章:現(xiàn)代前端工程為什么越來越離不開 Monorepo?,這篇文章中介紹了Monorepo的概念屠升、收益以及MulitRepo的弊端
pnpm就是一個包管理工具潮改,原生支持Monorepo,比npm和yarn更快一些腹暖,其他的可以參考官網(wǎng)和神三元大佬的另一篇文章:為什么現(xiàn)在我更推薦 pnpm 而不是 npm/yarn?
pnpm的依賴并不是全部打平下載到node_modules下的,我們都知道,如果是npm或者yarn下載的依賴包的話,他會打平整個依賴結(jié)構(gòu) 那什么是打平結(jié)構(gòu)呢 ,其實就是將所有的依賴都放在同一級去展示,因為我們的所以來的庫可能又依賴了別的庫,以此類推可能層層嵌套,這個時候yarn和npm 會將他們打平,也就是將這些嵌套的依賴統(tǒng)統(tǒng)整理到node_modules下. 但是這樣會造成一個問題,那就是一些沒有在package.json里聲明的包我們也可以引入進(jìn)來.這樣會造成極大的隱患.
而pnpm則采用了這種方式
將所有在描述文件中聲明的包下載到node_modules下,同時將他們所依賴的依賴包下載到.pnpm文件夾下
Monorepo的管理方式就自然會出現(xiàn)依賴重復(fù)汇在,或者自己寫的某個包依賴于另一個包這種情況。而pnpm的workspace以及他的依賴管理策略就很好的解決了這一問題,
接下來就讓我們從零開始使用pnpm去搭建一個Monorepo系統(tǒng)吧
首先安裝pnpm
npm install pnpm -g
然后新建一個文件夾,用ide打開之后初始化這個文件夾的package.json,也就是我們的項目描述文件
pnpm init
接著新建pnpm-workspace.yaml文件 ,里面寫上需要建立workspace的文件夾
packages:
# packages下所有的子包
- 'packages/*'
# components文件夾下所有的子包
- 'components/**'
# api文件夾下所有的子包
- 'api/**'
接著我們?nèi)?chuàng)建一個packages文件夾.同時也創(chuàng)建一個api文件夾和conponents文件夾.
api和components文件夾就代表我們的內(nèi)部使用的包.需要被多個子應(yīng)用給引用到.而packages則放置我們的子應(yīng)用. 最終的一個目錄結(jié)構(gòu)應(yīng)該是這樣的
當(dāng)我們需要安裝依賴的時候,使用pnpm install 命令就會自動檢索所有的工作空間的package.json文件里記錄的依賴.
如果需要給某一個子包下載依賴的話,可以使用
pnpm -F 子包名 add 需要下載的包名
pnpm 可以通過-F 來選擇不同的子包.
需要注意的是你的子包名字最好自己重新命名一個,修改package.json的name字段,因為如果再npm庫里有和你同名的包的話,pnpm好像是會去網(wǎng)上下載的,而不會直接使用你本地的子包.
當(dāng)下載了本地的子包后可以指定@*這樣,就會實時使用最新的包.