精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

現代 Monorepo 工程技術選型,聊聊我的思考

開發 新聞
看了本文我想大家應該理解了 PNPM + Turborepo + Changesets 這個技術選型的原因以及要怎么做。

前言

相信很多關注 Monorepo 生態的同學,應該大都看過這篇文章 monorepo.tools [1] ,其中列舉了現存的幾個主流的 Monorepo 相關的工具:

  • Bazel (by Google) [2]
  • Lage (by Microsoft) [3]
  • Lerna [4]
  • Nx (by Nrwl) [5]
  • Rush (by Microsoft) [6]
  • Turborepo (by Vercel) [7]

相應地,在這篇文章中也對各類工具進行了一一介紹。并且,我相信每個看過這篇文章的同學,都會留下這么個疑問: 這么多 Monorepo Tool,我要如何進行選型?

這里,我給出的答案是 PNPM + Turborepo + Changesets。那么,又為什么是這 3 者呢?下面,我將會分別圍繞這 3 個技術展開,來一一解答這個選型的原因以及怎么做。

PNPM

PNPM 的動機( Motivation [8] ),如它在官方文檔介紹的所說: “Saving disk space and boosting installation speed”,節省磁盤空間和提高安裝速度 。除開這個動機描述的顯著優點外, PNPM 內置了對 Monorepo 的支持 [9] ,并解決了很多令人詬病的問題。

其中,比較經典的就是 Phantom dependencies(幻影依賴)。由于,默認情況下 yarn 、 npm 安裝的依賴都是會被提升。所以,有時候你可能會遇到 Monorepo 項目中的某個包中的 package.json 沒有安裝這個依賴,結果實際代碼中卻使用了這個依賴...

雖說,PNPM 可以解決這個問題,但是, 默認情況 下 PNPM 安裝的依賴也是會被提升的。如果,需要 PNPM 禁止依賴提升,我們可以通過在 Monorepo 項目工作區下的 .npmrc 文件中 配置 [10] ,例如只提升 lodash :

hoist-pattern[]=*lodash*

當然,還有一些其他的問題,有興趣的同學可以看 ELab 團隊寫的這篇文章 《Monorepo 的這些坑,我們幫你踩過了!》 [11] 。

那么,在簡單解答了為什么用 PNPM 后,下面我們來看一下要怎么用?

Workspace 配置

要使用 PNPM 的 Monorepo 很簡單,只需要在 Monorepo 項目的工作區下新建 pnpm-workspace.yaml 文件并配置:

packages:
- 'packages/**'

接下來,則是記憶常用依賴和多包任務執行相關的命令。由于,我們的技術選型中有 Turborepo,它會負責多包任務的執行。所以,這里只需要記憶 常用依賴相關的命令 。

常用依賴相關命令

pnpm i

在 PNPM 中,安裝依賴可以用 pnpm i 來完成。在 Monorepo 的場景下,默認情況下 pnpm i 會安裝所有的依賴(包括 packages/* )。此外, pnpm i 還需要用到 3 個選項(Option):

  • --filter <package>,安裝依賴到指定的 package,不聲明要安裝的依賴包則默認安裝 package.json 中的所有依賴
  • --prod, P,安裝依賴到 dependencies
  • --dev, D,安裝依賴到 devDependencies

pnpm remove

在 PNPM 中,刪除在 package.json 中的某個依賴,可以用 pnpm remove 完成。它的選項(Option)使用和 pnpm i 大同小異。其中,不同地是當我們在工作區想要刪除 packages 中所有包的 package.json 中的某個依賴的時候,需要使用 -r ,例如移除所有包中的 lodash :

pnpm remove lodash -r

當然,可能還有同學有一些其他的訴求,有興趣的同學可以移步文檔了解,這里不做展開。

Changesets

經常維護開源項目的同學都知道的一點,每次包(Package)的發布,需要修改 package.json 的 version 字段,以及同步更新一下本次發布修改的 CHANGELOG.md。

這么一來,就會凸顯一個問題,每次發布都需要手動地去更新 version 、更新 CHANGELOG.md,未免 有點繁瑣 。并且,用過 Lerna 的同學,應該都知道 Lerna 內置了對這塊的支持。

但是,無論是 PNPM 又或者是下面要說的 Turborepo 都不支持這塊,所以 2 者的官方文檔都給大家推薦了用于支持這塊能力的工具,例如 Changesets [12] 、 Beachball [13] 、 Auto [14] 等。

那么,這里我們要介紹的就是 Changesets。下面,我們來看一下在前面建好的 PNPM 的 Monorepo 項目中如何使用 Changesets。首先,需要執行在 Monorepo 項目的工作區下,執行如下 2 個命令:

pnpm i -DW @changesets/cli
pnpm changeset init

前者是安裝 Changesets 的 CLI,后者是初始化 .changeset 文件夾以及對應的文件:

.changeset
-- config.json
|__ README.md

這里,我們來看一下 config.json [15] 文件:

{
"$schema": "https://unpkg.com/@changesets/config@1.6.4/schema.json",
"changelog": "@changesets/cli/changelog",
"commit": false,
"linked": [],
"access": "restricted",
"baseBranch": "master",
"updateInternalDependencies": "patch",
"ignore": []
}

除開 $schema 這個不需要修改的字段, config.json 文件中列了 7 個字段,各個字段分別代表的作用為:

  • changelog 設置 CHANGELOG.md 生成方式,可以設置 false 不生成,也可以設置為定義生成行為的文件地址或依賴名稱,例如 Changsets 提供的 `changelog-git` [16] 。其中,定義生成行為的文件固定代碼模版為:
async function getReleaseLine() {}
async function getDependencyReleaseLine() {}
export default {
getReleaseLine,
getDependencyReleaseLine
}
  • commit 設置是否把執行 changeset add 或 changeset publish 操作時對修改用 Git 提交
  • linked 設置共享版本的包,而不是獨立版本的包,例如一個組件庫中主題和單獨的組件的關系,也就是修改 Version 的時候,共享的包需要同步一起更新版本
  • access 設置執行 npm publish 的 --access 選項,通常情況下我們是公共的包,所以設置 public 即可(注意,它會被 package.json 中的 access 字段重寫)
  • baseBranch 設置默認的 Git 分支,例如現在 GitHub 的默認分支應該是 main
  • updateInternalDependencies 設置互相依賴的包版本更新機制,它是一個枚舉( major|minor|patch ),例如設置為 minor 時,只有當依賴的包新了 minor 版本或者才會對應地更新 package.json 的 dependencies 或 devDependencies 中對應依賴的版本
  • ignore 設置不需要發布的包,這些會被 Changesets 忽略

在初始化 .changeset 文件夾后,就可以正常使用 changeset 相關的命令,主要是這 3 個命令:

  • pnpm chageset 用于生成本次修改的要添加到 CHANGELOG.md 中的描述
  • pnpm changeset version 用于生成本次修改后的包的版本
  • pnpm changeset publish 用于發布包

此外,如果是在業務場景下,我們通常需要把包發到公司 私有的 NPM Registry ,而這有很多種配置方式。但是, 需要注意 的是 Changesets 只支持在每個包中聲明 publicConfig.registry 或者配置 process.env.npm_config_registry ,對應的代碼會是這樣:

// https://github.com/changesets/changesets/blob/main/packages/cli/src/commands/publish/npm-utils.ts
function getCorrectRegistry(packageJson?: PackageJSON): string {
const registry =
packageJson?.publishConfig?.registry ?? process.env.npm_config_registry;
return !registry || registry === "https://registry.yarnpkg.com"
? "https://registry.npmjs.org"
: registry;
}

可以看到,如果在前面說的這 2 種情況下獲取不到 registry 的話,Changesets 都是按公共的 Registry 去查找或者發布包的。

Turborepo

說起 Turborepo,可能大家會有點陌生。但是,對于 Vercel [17] 我想大家都知道(畢竟 Rich Harris [18] 、Sebastian Markb?ge 等都加入了),Turbrepo 則是 Vercel 旗下的一個開源項目。Turborepo 是用于為 JavaScript/TypeScript 的 Monorepo 提供一個極快的構建系統,簡單地理解就是用 Turborepo 來執行 Monorepo 項目的中構建(或者其他)任務會 非常快 !

關于 Turborepo 其他優勢,其 官方文檔 [19] 寫的很詳盡,有興趣的同學可以自行了解~

所以,你可以理解成 快 是選擇 Turborepo 負責 Monorepo 項目多包任務執行的原因。而在 Turborepo 中執行多包任務是通過 turbo run <script> 。不過, turbo run 和 lerna run 直接使用有所不同,它需要配置 turbo.json 文件,注冊每個需要執行的 script 命令。

在 Turborepo 中有個 Pipelines [20] 的概念,它是由 turbo.json 文件中的 pipline 字段的配置描述,它會在執行 turbo run 命令的時候,根據對應的配置進行 有序的執行 和 緩存輸出的文件 。

舉個例子,通常情況下我們一個 Monorepo 項目中的每個包可能會有 dev 、 build 、 test 、 clean 等 4 個命令,那么對應的 turbo.json 的配置會是這樣:

{
"pipeline": {
"build": {
"dependsOn": ["^build"],
"outputs": ["dist/**"]
},
"clean": {
"dependsOn": ["^clean"]
},
"test": {
"dependsOn": ["build" "lint"]
},
"dev": {
"cache": false
}
}
}

可以看到, pipeline 中的每個 key 則對應著每個需要執行的 turbo run 命令的名稱,其中 dependsOn 、 outputs 、 cache 等 3 個字段分別作用為:

  • dependsOn 表示當前命令所依賴的命令,^ 表示 dependencies 和 devDependencies 的所有依賴都執行完 build,才執行 build
  • outputs 表示命令執行輸出的文件緩存目錄,例如我們常見的 dist、coverage 等
  • cache 表示是否緩存,通常我們執行 dev 命令的時候會結合 watch 模式,所以這種情況下關閉掉緩存比較切合實際需求

這樣一來,我們就可以使用諸如 turbo run build test 的命令,它則會按 pipeline 的配置依次執行對應的命令。

當然,如果你想每個命令都支持單獨執行,可以直接配置為 {} 即可。此外,如果要使用 turbo run 命令,還需要在 package.json 中聲明 packageManage 字段為指定的包管理工具及版本,例如 "packageManager": "pnpm@6.30.0" 。

結語

閱讀到此處,我想大家應該理解了 PNPM + Turborepo + Changesets 這個技術選型的原因以及要怎么做。當然,這個選型只是我個人的思考所得出的答案,相信也有同學仍然鐘情于 Lerna,又或者喜歡 Rush 一把梭,這些觀點并無對錯,本質上這也是編程的魅力所在, 各個輪子都有其存在的價值 。

責任編輯:張燕妮 來源: Code center
相關推薦

2023-04-11 08:02:26

單測技術JUnit框架

2023-08-23 18:56:46

2021-03-25 09:41:43

前端Monorepo技術熱點

2016-10-21 15:58:51

容器容器技術Docker

2022-06-08 13:25:51

數據

2012-07-12 09:37:23

Instagram工程技術

2024-01-22 10:18:32

平臺工程開發人員技術

2023-12-07 07:02:00

大倉權限設計

2018-07-23 15:35:17

機器學習特征工程技能數據科學

2020-09-25 07:40:39

技術開發選型

2021-03-10 09:33:51

技術研發管理

2022-03-18 08:57:17

前端數據流選型

2023-03-31 13:53:00

低代碼平臺選型

2018-02-27 15:10:38

區塊鏈分布式系統工程技術

2024-09-03 11:37:48

2021-02-22 09:30:09

go開發環境桌面系統

2017-05-05 10:55:31

Web應用登錄工程身份驗證

2025-03-14 08:00:59

TypeScript編譯器Go
點贊
收藏

51CTO技術棧公眾號

91在线看国产| 91精品亚洲| 欧美性xxxxxx少妇| 一区二区三区国产福利| 一级特黄aa大片| 欧美久色视频| 亚洲精品综合精品自拍| 亚洲欧美视频二区| 欧美四级在线| 波多野结衣一区二区三区| 国产精品久久久久久久av大片| 99鲁鲁精品一区二区三区| 国产欧美自拍一区| 欧美日韩免费高清一区色橹橹 | 国产精品中文在线| 九九热国产精品视频| 欧美热在线视频精品999| 这里只有精品电影| 欧洲av无码放荡人妇网站| 国产黄色在线观看| 久久久精品免费网站| 成人在线视频电影| 特级西西444www大胆免费看| 精品白丝av| 久久久av一区| 中文字幕 自拍| 久久丝袜视频| 制服视频三区第一页精品| 日批视频在线免费看| 在线观看a级片| 国产精品麻豆一区二区 | 国产影视一区| 亚洲国产美女久久久久| 992tv人人草| 福利一区视频| 午夜精品久久久久久不卡8050| 一区二区免费在线观看| 国产小视频免费在线网址| 成人av资源站| 97se在线视频| 97人妻精品一区二区三区软件 | 深夜视频在线免费| 国产很黄免费观看久久| 国产一区二区在线免费| www.av88| 日本不卡一区二区三区高清视频| 7m精品福利视频导航| 国产一级一片免费播放放a| 久久久久久久久久久久久久久久久久| 在线午夜精品自拍| 制服 丝袜 综合 日韩 欧美| 啄木系列成人av电影| 日韩av中文字幕在线| 国产精品一区二区人妻喷水| 视频精品一区二区三区| 日韩一区二区电影网| 992kp免费看片| a一区二区三区亚洲| 欧美高清www午色夜在线视频| www.超碰97.com| 亚洲三级电影| 日韩一级二级三级| 4438x全国最大成人| 亚洲三级av| 欧美成人一区二区| 国产成人精品一区二区三区在线观看 | 国产主播av在线| 亚洲图片久久| 精品香蕉在线观看视频一| 国产夫妻性爱视频| 国产不卡一区| 深夜福利一区二区| www.xxxx日本| 国产综合婷婷| 欧美—级a级欧美特级ar全黄| 天堂网avav| 欧美色图首页| 欧美在线视频免费| 国产乡下妇女三片| 国内精品第一页| 波多野结衣精品久久| 日本韩国免费观看| 久久亚洲一区二区三区四区| 日韩在线三区| 18在线观看的| 欧美性猛交xxxx免费看久久久| www黄色在线| 日本久久一区| 精品日韩一区二区| 国产成人无码一区二区在线观看| 国产在线观看91一区二区三区| 色综合伊人色综合网站| 真实国产乱子伦对白在线| 国产亚洲精品久久久久婷婷瑜伽| 国产精品白嫩美女在线观看 | 久久99精品久久久久久国产越南| 亚洲伊人久久综合| 无码国产精品一区二区免费16| 国产日韩欧美精品在线| 日本老太婆做爰视频| 超碰成人av| 欧美三级视频在线| 国产人成视频在线观看| 欧美日韩伦理| 久久久免费高清电视剧观看| 特级西西444www大胆免费看| 成熟亚洲日本毛茸茸凸凹| 神马影院午夜我不卡| 国产探花视频在线观看| 91福利区一区二区三区| 精品无码av一区二区三区| 一区二区三区韩国免费中文网站| 久久久精品亚洲| 男人天堂2024| 成人黄色a**站在线观看| 亚洲精品tv久久久久久久久| caoprom在线| 制服.丝袜.亚洲.中文.综合| 中文字幕人妻一区二区| 狠狠入ady亚洲精品| 国产精品美女午夜av| 天天综合网在线| 亚洲欧美日韩国产中文在线| 爱情岛论坛成人| 巨人精品**| 欧美黑人性猛交| 91成人国产综合久久精品| 久久久噜噜噜久久人人看 | 色爱综合区网| 欧美丰满嫩嫩电影| 欧美激情视频二区| 国产精品主播| 国产美女精品在线观看| 2020国产在线视频| 欧美精品日韩一本| 国产精品美女高潮无套| 免播放器亚洲| 国产精品12| 少女频道在线观看高清 | 国精品人妻无码一区二区三区喝尿| 国产精品午夜在线观看| 国内外免费激情视频| 日韩av影院| 午夜精品久久久久久久99黑人| 性猛交富婆╳xxx乱大交天津| 成人免费在线观看入口| 欧美日韩中文不卡| 日本大胆欧美| 国产日韩欧美视频在线| 在线观看黄av| 欧美日韩国产另类一区| 91麻豆精品久久毛片一级| 青娱乐精品视频| 日韩av大全| 国产精品久久乐| 自拍视频国产精品| 一级片在线免费观看视频| 国产精品美女视频| 天天干天天色天天干| 国产精品久久占久久| 成人黄色片网站| 日本中文字幕视频在线| 欧美一区二区在线不卡| 波多野结衣亚洲色图| 国产jizzjizz一区二区| 男女猛烈激情xx00免费视频| 奇米影视777在线欧美电影观看 | 777久久精品一区二区三区无码 | 欧美大肚乱孕交hd孕妇| 欧美成人aaaaⅴ片在线看| 成人a区在线观看| 国产精品无码专区av在线播放 | 大陆极品少妇内射aaaaaa| 亚洲视频精选| 欧美综合第一页| 国产福利在线| 欧美一区二区三区视频免费播放 | 欧美性69xxxx肥| 久久久久久久毛片| 精品一区二区三区在线播放| 成人在线免费观看视频网站| 亚洲精品3区| 国产日韩在线视频| 国产桃色电影在线播放| 亚洲欧美日韩天堂一区二区| 天天综合久久综合| 亚洲精品视频自拍| 朝桐光av一区二区三区| 奇米一区二区三区| 成人在线观看毛片| 色哟哟精品丝袜一区二区| 国产精品日韩久久久久| 黄色大片在线| 在线观看亚洲视频| 人人妻人人澡人人爽久久av| 在线亚洲人成电影网站色www| 天天综合天天做| 91麻豆免费看片| 黄色aaaaaa| 国产免费成人| 99久re热视频精品98| 午夜欧洲一区| 91传媒视频在线观看| 九九热线视频只有这里最精品| www国产精品com| 欧美一区二区三区少妇| 9191精品国产综合久久久久久| 日本网站在线播放| 日韩一区欧美一区| 亚洲自拍偷拍一区二区| 国产成人啪免费观看软件| 成人免费视频久久| 伊人久久婷婷| 中文字幕久久综合| 免费视频国产一区| 国产精品视频入口| 亚洲日日夜夜| 国产精品久久久久久久久借妻| a国产在线视频| 不用播放器成人网| 大胆av不用播放器在线播放| 亚洲国产成人精品电影| 国产精品人人爽| 欧美日精品一区视频| 婷婷激情五月网| 亚洲国产中文字幕在线视频综合| 亚洲区一区二区三| 中文一区二区在线观看| 麻豆精品免费视频| 99热这里都是精品| 男人添女人荫蒂国产| 久久精品久久综合| 国产aaaaa毛片| 久久亚洲风情| 37pao成人国产永久免费视频| 亚洲激情二区| 国产av熟女一区二区三区| 91超碰成人| 宅男一区二区三区| 欧美hd在线| 亚洲午夜精品一区二区| heyzo久久| 色综合久久av| 欧美日韩性在线观看| 日韩精品伦理第一区| 国产成人影院| 亚洲v国产v在线观看| 欧洲杯半决赛直播| 五月天久久综合网| 久久福利综合| 精品一区二区成人免费视频| 外国成人免费视频| 欧美 日韩 国产 在线观看| 欧美成人直播| 免费看污污视频| 欧美三区不卡| 免费在线观看亚洲视频| 久久精品五月| 欧美精品成人网| 毛片基地黄久久久久久天堂| 污版视频在线观看| 经典一区二区三区| 国产又粗又猛大又黄又爽| 国产成人在线免费| 精品熟女一区二区三区| 26uuu欧美| 日韩福利在线视频| 亚洲欧美日韩久久| 久久在线视频精品| 欧美日韩亚洲精品内裤| 波多野结衣二区三区| 欧美精品一级二级三级| 亚洲国产精品18久久久久久| 日韩av中文字幕在线免费观看| 国产香蕉视频在线看| 久久精品99久久久香蕉| 黑人另类精品××××性爽| 欧美影院久久久| 福利一区二区| 国产精品传媒毛片三区| 国产不卡一二三区| 好色先生视频污| 99国产精品久久久久久久 | 日韩三级av在线| 色妹子一区二区| 国产特黄一级片| 日韩精品在线观看视频| 欧美性天天影视| 韩国三级电影久久久久久| 桃子视频成人app| 成人片在线免费看| 俺要去色综合狠狠| 国产在线视频综合| 日日夜夜免费精品视频| 韩国三级hd中文字幕有哪些| 99国产精品视频免费观看| 又色又爽的视频| 亚洲成精国产精品女| 在线观看中文字幕码| 亚洲国产高清高潮精品美女| 在线看av的网址| 97视频在线观看视频免费视频| 精品自拍视频| 久久青青草原一区二区| 99久久夜色精品国产亚洲狼 | 麻豆91精品视频| 性色av蜜臀av浪潮av老女人| 国产精品理论片| 在线观看黄网站| 日韩欧美国产一二三区| 国产精品久久久久久久龚玥菲 | 亚洲砖区区免费| 香蕉久久国产| 国产国语老龄妇女a片| 国产精品高清亚洲| 亚洲va在线观看| 精品久久久久久亚洲综合网| 免费不卡视频| 国产精品va在线| 国产精品香蕉| 日韩一级特黄毛片| 久久精品国产99| 久久av无码精品人妻系列试探| 亚洲高清免费观看 | 国产成人自拍网| 午夜激情福利电影| 欧美中文一区二区三区| 亚洲三区在线观看无套内射| 欧美激情在线狂野欧美精品| 欧美影院视频| 亚洲一区二区三区加勒比| 日本成人超碰在线观看| 91激情视频在线观看| 一本一道波多野结衣一区二区| 日本xxxxwww| 97精品伊人久久久大香线蕉 | 久久99久久98精品免观看软件| 欧美群妇大交群的观看方式| 成人77777| 国产精品高潮呻吟久久av野狼 | 午夜久久久久久久久久影院| 亚洲精品久久久久久久久久久久| 久久五月精品中文字幕| 97久草视频| 伊人色**天天综合婷婷| √天堂资源在线| 亚洲女与黑人做爰| 国产日韩在线观看一区| 久久成人综合视频| 伊人亚洲精品| 九九久久九九久久| 国产成人免费视频网站高清观看视频| 婷婷久久综合网| 欧美成人伊人久久综合网| 久久av色综合| 狠狠色综合欧美激情| 国产一区导航| 美女被到爽高潮视频| 欧美色图在线观看| 欧美三级黄网| 99国产高清| 亚洲精品影视| 美女洗澡无遮挡| 欧美丝袜丝交足nylons| 成人三级网址| 国产精品欧美久久| 国产精品久久国产愉拍| 亚洲最大成人综合网| 欧美剧情片在线观看| 羞羞的网站在线观看| 国产一区二区三区四区hd| 久久午夜影视| 天天色影综合网| 欧美成人女星排名| 国产免费不卡| 一区二区免费在线观看| 成人动漫一区二区| 激情视频网站在线观看| 精品国产欧美成人夜夜嗨| 日韩国产在线不卡视频| 欧美在线观看成人| 中文字幕不卡在线观看| www.成人免费视频| 欧美专区福利在线| 亚洲成av人片乱码色午夜| 免费a v网站| 欧美亚洲综合在线| 毛片在线导航| 日本一区二区在线视频观看| 国产一区二区美女| www.毛片.com| 欧美成人激情图片网| 日韩在线黄色| 欧美国产日韩另类| 欧美日韩在线免费| 国产美女在线观看| 欧美日韩精品综合| 国产黄色精品视频| 中文字幕在线播放日韩| 国内精品美女av在线播放|