溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

前端工程Monorepo項目管理方式是什么

發(fā)布時間:2022-07-11 10:17:14 來源:億速云 閱讀:169 作者:iii 欄目:開發(fā)技術

這篇“前端工程Monorepo項目管理方式是什么”文章的知識點大部分人都不太理解,所以小編給大家總結了以下內容,內容詳細,步驟清晰,具有一定的借鑒價值,希望大家閱讀完這篇文章能有所收獲,下面我們一起來看看這篇“前端工程Monorepo項目管理方式是什么”文章吧。

    什么是 Monorepo?

    Monorepo 其實不是一個新的概念,在軟件工程領域,它已經有著十多年的歷史了。概念上很好理解,就是把多個項目放在一個倉庫里面,相對立的是傳統(tǒng)的 MultiRepo 模式,即每個項目對應一個單獨的倉庫來分散管理。

    前端工程Monorepo項目管理方式是什么

    現代的前端工程已經越來越離不開 Monorepo 了,無論是業(yè)務代碼還是工具庫,越來越多的項目已經采用 Monorepo 的方式來進行開發(fā)。Google 寧愿把所有的代碼都放在一個 Monorepo 工程下面,Vue 3、Yarn、Npm7 等等知名開源項目的源碼也是采用 Monorepo 的方式來進行管理的。

    一般 Monorepo 的目錄如下所示,在 packages 存放多個子項目,并且每個子項目都有自己的package.json:

    ├── packages
    |   ├── pkg1
    |   |   ├── package.json
    |   ├── pkg2
    |   |   ├── package.json
    ├── package.json

    那 Monorepo 究竟有什么魔力,讓大家如此推崇,落地如此之廣呢?

    MultiRepo 之痛

    要想知道 Monorepo 的優(yōu)勢,首先得弄清楚之前的開發(fā)方式有什么痛點。

    之前傳統(tǒng)的方式MultiRepo當中,每個項目都對應單獨的一個代碼倉庫。我之前也是用這種方式開發(fā)的,是真真切切地感受到了這種方式帶來的諸多弊端?,F在就和大家一一分享一下。

    1.代碼復用

    在維護多個項目的時候,有一些邏輯很有可能會被多次用到,比如一些基礎的組件、工具函數,或者一些配置,你可能會想: 要不把代碼直接 copy 過來,多省事兒!但有個問題是,如果這些代碼出現 bug、或者需要做一些調整的時候,就得修改多份,維護成本越來越高。

    那如何來解決這個問題呢?比較好的方式是將公共的邏輯代碼抽取出來,作為一個 npm 包進行發(fā)布,一旦需要改動,只需要改動一份代碼,然后 publish 就行了。

    但這真的就完美解決了么?我舉個例子,比如你引入了 1.1.0 版本的 A 包,某個工具函數出現問題了,你需要做這些事情:

    • 去修改一個工具函數的代碼

    • 發(fā)布1.1.1版本的新包

    • 項目中安裝新版本的 A。

    可能只是改了一行代碼,需要走這么多流程。然而開發(fā)階段是很難保證不出 bug 的,如果有個按鈕需要改個樣式,又需要把上面的流程重新走一遍......停下來想想,這些重復的步驟真的是必須的嗎?我們只是想復用一下代碼,為什么每次修改代碼都這么復雜?

    上述的問題其實是 MultiRepo普遍存在的問題,因為不同的倉庫工作區(qū)的割裂,導致復用代碼的成本很高,開發(fā)調試的流程繁瑣,甚至在基礎庫頻繁改動的情況下讓人感到很抓狂,體驗很差。

    2.版本管理

    在 MultiRepo 的開發(fā)方式下,依賴包的版本管理有時候是一個特別玄學的問題。比如說剛開始一個工具包版本是 v1.0.0,有諸多項目都依賴于這個工具包,但在某個時刻,這個工具包發(fā)了一個 break change 版本,和原來版本的 API 完全不兼容。而事實上有些項目并沒有升級這個依賴,導致一些莫名的報錯。

    當項目多了之后,很容易出現這種依賴更新不及時的情況。這又是一個痛點。

    3.項目基建

    由于在 MultiRepo 當中,各個項目的工作流是割裂的,因此每個項目需要單獨配置開發(fā)環(huán)境、配置 CI 流程、配置部署發(fā)布流程等等,甚至每個項目都有自己單獨的一套腳手架工具。

    其實,很容易發(fā)現這些項目里的很多基建的邏輯都是重復的,如果是 10 個項目,就需要維護 10 份基建的流程,邏輯重復不說,各個項目間存在構建、部署和發(fā)布的規(guī)范不能統(tǒng)一的情況,這樣維護起來就更加麻煩了。

    Monorepo 的收益

    說清楚 MultiRepo 的痛點之后,相信你也大概能理解為什么要誕生Monorepo這個技術了?,F在就來細致地分析一下Monorepo到底給現代的前端工程帶來了哪些收益。

    首先是工作流的一致性,由于所有的項目放在一個倉庫當中,復用起來非常方便,如果有依賴的代碼變動,那么用到這個依賴的項目當中會立馬感知到。并且所有的項目都是使用最新的代碼,不會產生其它項目版本更新不及時的情況。

    其次是項目基建成本的降低,所有項目復用一套標準的工具和規(guī)范,無需切換開發(fā)環(huán)境,如果有新的項目接入,也可以直接復用已有的基建流程,比如 CI 流程、構建和發(fā)布流程。這樣只需要很少的人來維護所有項目的基建,維護成本也大大減低。

    再者,團隊協(xié)作也更加容易,一方面大家都在一個倉庫開發(fā),能夠方便地共享和復用代碼,方便檢索項目源碼,另一方面,git commit 的歷史記錄也支持以功能為單位進行提交,之前對于某個功能的提交,需要改好幾個倉庫,提交多個 commit,現在只需要提交一次,簡化了 commit 記錄,方便協(xié)作。

    Monorepo 的落地

    如果你還從來沒接觸過 Monorepo 的開發(fā),到這可能你會疑惑了: 剛剛說了這么多 Monorepo 的好處,可是我還是不知道怎么用啊!是直接把所有的代碼全部搬到一個倉庫就可以了嗎?

    當然不是,在實際場景來落地 Monorepo,需要一套完整的工程體系來進行支撐,因為基于 Monorepo 的項目管理,絕不是僅僅代碼放到一起就可以的,還需要考慮項目間依賴分析、依賴安裝、構建流程、測試流程、CI 及發(fā)布流程等諸多工程環(huán)節(jié),同時還要考慮項目規(guī)模到達一定程度后的性能問題,比如項目構建/測試時間過長需要進行增量構建/測試按需執(zhí)行 CI等等,在實現全面工程化能力的同時,也需要兼顧到性能問題。

    因此,要想從零開始定制一套完善的 Monorepo 的工程化工具,是一件難度很高的事情。不過社區(qū)已經提供了一些比較成熟的方案,我們可以拿來進行定制,或者對于一些上層的方案直接拿來使用。

    其中比較底層的方案比如 lerna,封裝了 Monorepo 中的依賴安裝、腳本批量執(zhí)行等等基本的功能,但沒有一套構建、測試、部署的工具鏈,整體 Monorepo 功能比較弱,但要用到業(yè)務項目當中,往往需要基于它進行頂層能力的封裝,提供全面工程能力的支撐。

    當然也有一些集成的 Monorepo 方案,比如rushstack,提供從初始化、開發(fā)、構建、測試到部署的全流程能力,有一套比較完整的 Monorepo 基礎設施,適合直接拿來進行業(yè)務項目的開發(fā)。不過由于這些頂層方案內部各種流程和工具鏈都已經非常完善了,如果要基于這些方案來定制,適配和維護的成本過高,基本是不可行的。

    以上就是關于“前端工程Monorepo項目管理方式是什么”這篇文章的內容,相信大家都有了一定的了解,希望小編分享的內容對大家有幫助,若想了解更多相關的知識內容,請關注億速云行業(yè)資訊頻道。

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI