使用PNPM管理單一倉庫

簡介

以前用過yarn+lerna管理單一倉庫腿短,實際使用中還是存在不少問題擂啥,pnpm出來以后除了對node_modules管理非常好以為龙誊,對workspace支持也非常好颜说。本項目就是使用father背零、dumi腰吟、pnpm技術棧的React組件單一倉庫模板。

使用這個項目模板根據(jù)下面的說明文檔徙瓶,可以非趁停快速的完成創(chuàng)建包、編寫和展示組件文檔侦镇、構建和發(fā)布到npm倉庫灵疮。

倉庫地址:scfido/pnpm-monorepo: 使用father、dumi壳繁、pnpm技術棧的React組件單一倉庫模板震捣。 (github.com)

使用

安裝依賴

在根目錄執(zhí)行會自動安裝所有項目的依賴包。

pnpm install

清理所有依賴

pnpm clean

清理所有依賴并重新安裝

pnpm reinstall

啟動文檔項目

文檔項目有兩個作用:

  1. 介紹組件的使用方法
  2. 組件的功能演示
pnpm start

開發(fā)

創(chuàng)建新包

在這個模板中新添加一個包闹炉,操作流程如下蒿赢,以創(chuàng)建liba為例:

cd .\packages\
mkdir liba
cd liba
pnpm dlx create-father ./ 

# 根據(jù)提示選擇或輸入你的信息。
# √ Pick target platform(s) ? Browser
# √ Pick NPM client ? pnpm
# √ Input NPM package name ... liba
# √ Input NPM package description ...
# √ Input NPM package author (Name <email@example.com>) ...

包目錄創(chuàng)建好后渣触,添加react組件之前要對項目參數(shù)做一些簡單的配置诉植。

.\packages\liba\tsconfig.json,的compilerOptions中增加jsx昵观、esModuleInterop晾腔、sourceMap三項參數(shù)。

{
  "compilerOptions": {
    "strict": true,
    "declaration": true,
    "skipLibCheck": true,
    "baseUrl": "./",
    "jsx": "react",
    "esModuleInterop": true,
    "sourceMap": true
  }
}

然后添加你要開發(fā)的組件依賴包

# 添加依賴包react
pnpm add react

添加組件文件.\packages\liba\src\Button.tsx

// .\packages\liba\src\Button.tsx

import React from "react";

export default ()=>{
    return(<button>From lib a</button>)
}

導出組件

// .\packages\liba\src\index.ts

export {default as ButtonA}  from "./Button"

生成

cd .\packages\liba
pnpm build

生成成功后會在.\packages\liba\dist\esm中看到結果啊犬。

在文檔中展示組件

前面已經(jīng)創(chuàng)建好了包liba灼擂,并創(chuàng)建了組件ButtonA,下面在文檔中展示這個組件觉至。

.\packages\docs包中剔应,添加liba的應用。

 // .\packages\docs\package.json

 "dependencies": {
    // 添加liba的依賴语御,注意版本號的寫法峻贮。
    "liba": "workspace:^1.0.0"
    // ... 其它依賴
 }

在創(chuàng)建.\packages\docs\src\libA的目錄,并新建展示文檔index.md应闯。

# .\packages\docs\src\libA\index.md
---
nav:
  title: Components
  path: /components
---

## Libiary A

Button A:

```tsx
import React from 'react';
import {ButtonA} from "liba";

export default () => {
  return(
    <div>
    <ButtonA/>
    </div>
  )
};

```

啟動文檔項目就能看到liba中的組件展示了纤控。

pnpm start

熱更新

組件展示文檔項目運行起來后,文檔自身的修改是能夠熱更新的碉纺,但是引用的liba包中的組件并不能熱更新船万,修改了組件內容后刻撒,需要在組件目錄運行pnpm build才能生效。要實現(xiàn)組件的熱更新耿导,可以在組件包目錄中使用pnpm dev來監(jiān)視文件變更并自動build声怔。

cd .\packages\liba
pnpm dev

發(fā)布

發(fā)布分為發(fā)布說明文檔和組件兩種情況。

發(fā)布文檔

將文檔發(fā)布成網(wǎng)站舱呻。

pnpm docs:build --filter docs

輸出目錄在packages\docs\docs-dist醋火,這些文件放在web服務中就可以訪問。例如使用dotnet-serve工具箱吕。

# 安裝dotnet-serve
dotnet tool install --global dotnet-serve

# 啟動網(wǎng)站
cd c
dotnet serve -o

發(fā)布組件

發(fā)布組件非常簡單胎撇,和npm的操作流程一致。在根目錄下執(zhí)行pnpm publish即可殖氏。通過npmjs.org用戶注冊等一系列操作發(fā)布成功晚树。完成后發(fā)現(xiàn)并不是我們要的結果,這樣是把整個項目作為單個包發(fā)布出去了雅采。而我們想要的是發(fā)布這三個包爵憎。

  • @pnpm-monorepo/liba
  • @pnpm-monorepo/libb
  • @pnpm-monorepo/libc

其實也非常簡單,使用filter參數(shù)過濾項目婚瓜,或者分別到各自的目錄下去發(fā)布就可以了宝鼓。

# 使用指定項目名稱的方式
pnpm --filter liba publish 
pnpm --filter libb publish 
pnpm --filter libc publish

# 使用通配符過濾的方式,注意windows下不要單引號巴刻。
pnpm --filter 'lib*' publish

# 進入到項目目錄下發(fā)布的方式
cd  .\packages\liba
pnpm publish

cd ..\libb
pnpm publish

cd ..\libc
pnpm publish

或者使用script目錄下的publish.ps1腳本愚铡。

統(tǒng)一包版本

如果希望發(fā)布的所有包版本統(tǒng)一,可使用以下命令胡陪。腳本會自動把packages目錄下的項目設置為指定版本號沥寥,并且會自動添加添加git tag。

./set-version.ps1 1.1.4

引用包

包開發(fā)完成后就是給其它項目使用了柠座,按上面的步驟發(fā)布到npm倉庫后邑雅,按常規(guī)操作用名稱引用即可。

但是在開發(fā)過程中要引用本地包怎么操作呢妈经?分倉庫內和倉庫外兩種引用情況淮野。

倉庫內

在同一倉庫內引用,比如docs項目引用liba吹泡。只需要在docs項目中執(zhí)行添加包命令骤星,并加上-w``--workspace參數(shù),表面是引用workspace中的包爆哑。

# 中項目根目錄操作需要帶過濾條件
pnpm add liba -w --filter docs

# 進入包的目錄可以直接添加
cd .\packages\docs
pnpm add liba -w

倉庫外

開發(fā)時其它倉庫需要引用本項目的包時洞难,可使用pnpm的link命令。

  1. 在被引用的倉庫執(zhí)行
# 例如liba是要被引用的庫泪漂,將liba注冊到全局倉庫
cd .\packages\liba
pnpm link . --global
  1. 在引用的倉庫執(zhí)行
# 從全局倉庫連接 liba
pnpm link liba --global

注意:連接后會在package.jsondependencies中添加liba廊营。如果你的包從來沒有發(fā)布過,以后執(zhí)行install的時候會因為找不到這個包而失敗萝勤。

常見問題

ANTD組件沒有加載CSS

在docs項目中引用ANTD組件露筒,并在文檔中增加樣式引用。

import React from 'react';
import {Button} from "libb";
import 'antd/dist/antd.css';

export default () => {
  return(
    <div>
    <Button/>
    </div>
  )
};

包修改以后不生效

我發(fā)現(xiàn)包減少輸出文件引用包的node_modules下仍然存在的情況敌卓,建議全部刪除后重新安裝慎式。

pnpm reinstall

報找不到引用包的文件

docs項目生成報找不到引用包的文件,并且錯誤信息中的文件位置在docs/src目錄下趟径,這是因為引用包編譯失敗瘪吏,沒有輸出到docs的node_modules中,因為docs在tsconfig.josn中重定義了@/*:["src/*"]蜗巧,所以不要被編譯錯誤中的文件位置誤導了掌眠。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市幕屹,隨后出現(xiàn)的幾起案子蓝丙,更是在濱河造成了極大的恐慌,老刑警劉巖望拖,帶你破解...
    沈念sama閱讀 219,039評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件渺尘,死亡現(xiàn)場離奇詭異,居然都是意外死亡说敏,警方通過查閱死者的電腦和手機鸥跟,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來盔沫,“玉大人医咨,你說我怎么就攤上這事〖艿” “怎么了腋逆?”我有些...
    開封第一講書人閱讀 165,417評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長侈贷。 經(jīng)常有香客問我惩歉,道長,這世上最難降的妖魔是什么俏蛮? 我笑而不...
    開封第一講書人閱讀 58,868評論 1 295
  • 正文 為了忘掉前任撑蚌,我火速辦了婚禮,結果婚禮上搏屑,老公的妹妹穿的比我還像新娘争涌。我一直安慰自己,他們只是感情好辣恋,可當我...
    茶點故事閱讀 67,892評論 6 392
  • 文/花漫 我一把揭開白布亮垫。 她就那樣靜靜地躺著模软,像睡著了一般。 火紅的嫁衣襯著肌膚如雪饮潦。 梳的紋絲不亂的頭發(fā)上燃异,一...
    開封第一講書人閱讀 51,692評論 1 305
  • 那天,我揣著相機與錄音继蜡,去河邊找鬼回俐。 笑死,一個胖子當著我的面吹牛稀并,可吹牛的內容都是我干的仅颇。 我是一名探鬼主播,決...
    沈念sama閱讀 40,416評論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼碘举,長吁一口氣:“原來是場噩夢啊……” “哼忘瓦!你這毒婦竟也來了?” 一聲冷哼從身側響起引颈,我...
    開封第一講書人閱讀 39,326評論 0 276
  • 序言:老撾萬榮一對情侶失蹤政冻,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后线欲,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體明场,經(jīng)...
    沈念sama閱讀 45,782評論 1 316
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,957評論 3 337
  • 正文 我和宋清朗相戀三年李丰,在試婚紗的時候發(fā)現(xiàn)自己被綠了苦锨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,102評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡趴泌,死狀恐怖舟舒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情嗜憔,我是刑警寧澤秃励,帶...
    沈念sama閱讀 35,790評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站吉捶,受9級特大地震影響夺鲜,放射性物質發(fā)生泄漏。R本人自食惡果不足惜呐舔,卻給世界環(huán)境...
    茶點故事閱讀 41,442評論 3 331
  • 文/蒙蒙 一币励、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧珊拼,春花似錦食呻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽每辟。三九已至,卻和暖如春干旧,著一層夾襖步出監(jiān)牢的瞬間渠欺,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評論 1 272
  • 我被黑心中介騙來泰國打工莱革, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留峻堰,地道東北人讹开。 一個月前我還...
    沈念sama閱讀 48,332評論 3 373
  • 正文 我出身青樓盅视,卻偏偏與公主長得像,于是被迫代替她去往敵國和親旦万。 傳聞我的和親對象是個殘疾皇子闹击,可洞房花燭夜當晚...
    茶點故事閱讀 45,044評論 2 355

推薦閱讀更多精彩內容