前端工程化實踐:Monorepo與Lerna管理

前端工程化實踐中,Monorepo(單倉庫)管理和Lerna是兩種流行的方式,用于大型項目或組件庫的組織和版本管理。

2500G計算機入門到高級架構師開發資料超級大禮包免費送!

Monorepo簡介

Monorepo(單倉庫)是指在一個Git倉庫中管理多個相關項目的開發方式。這種方式的優點在于:

集中式管理:所有項目都在一個倉庫中,方便代碼共享、版本同步和協同開發。
模塊化:可以創建獨立的模塊,方便復用和維護。
統一的CI/CD:一次配置,全倉庫生效,簡化持續集成和部署流程。
更好的依賴管理:可以更容易地管理項目間的依賴關系。

Lerna簡介

Lerna是一個命令行工具,用于在Monorepo中管理多包項目。它提供了版本管理和發布功能,使得在單個倉庫中管理多個npm包變得簡單。

Lerna的核心概念有:
  • Packages:Monorepo中的獨立npm包。
  • Versions:每個包可以有自己的版本,可以是固定的或共享的。
  • Bootstrapping:初始化所有包的依賴關系,確保每個包都能正常工作。
  • Publishing:發布包到npm,可以是逐個包發布,也可以是批量發布。

安裝Lerna

首先,確保安裝Node.js和npm。然后,在項目根目錄安裝Lerna:

npm install --save-dev lerna
# 或
yarn add --dev lerna

初始化Lerna項目

在項目根目錄運行以下命令初始化Lerna:

npx lerna init

這將創建一個lerna.json配置文件和一個packages目錄,用于存放各個包。

創建和管理包

在packages目錄下創建新包:

mkdir packages/my-package
cd packages/my-package
npm init -y
# 或
yarn init -y

在包內編寫代碼,例如index.js和package.json。

使用Lerna命令

Bootstrap:初始化所有包的依賴關系。

  npx lerna bootstrap

Add:在包之間添加依賴。

  npx lerna add @scope/my-package

Publish:發布包到npm。

  npx lerna publish

List:查看項目中的包。

  npx lerna ls

Lerna配置

lerna.json中,可以配置Lerna的行為,例如:

{"version": "independent", // 或 "fixed""packages": ["packages/*"],"command": {"publish": {"ignore": ["**/node_modules/**"]}}
}
  • version:指定版本策略,可以是fixed(所有包共享同一版本號)或independent(每個包有自己的版本號)。
  • packages:指定包含包的目錄路徑。
  • command.publish.ignore:在發布時忽略的文件或目錄。

性能優化

  • 獨立版本:使用independent版本策略,可以單獨發布每個包,避免不必要的發布。
  • Selective Publishing:使用–since或–scope參數,只發布更改的包。
  • Workspaces:配合Yarn Workspaces使用,減少安裝時間和磁盤空間占用。

Lerna的高級特性

異步操作和鎖定

Lerna支持異步操作,這在處理大型項目時非常有用。在lerna.json中設置concurrency屬性可以限制并發執行的任務數量,防止資源過度消耗。

{"concurrency": 4
}

Lerna還使用npm的package-lock.json或yarn.lock文件來確保每次安裝時的依賴一致性。當lerna bootstrap執行時,它會按照文件中的鎖定版本安裝依賴,保證所有開發者在本地構建時使用相同的依賴版本。

自定義腳本

Lerna允許在lerna.json中定義自定義腳本,以便在項目中執行特定任務。例如,創建一個預發布腳本:

{"scripts": {"prepublishOnly": "tsc"}
}

這將在發布包之前運行TypeScript編譯器。

工作流集成

Lerna可以與常見的CI/CD工具(如Jenkins、CircleCI、GitHub Actions等)集成,實現自動化測試、構建和發布。在.gitlab-ci.yml、.travis.yml或其他CI配置文件中,配置相應的Lerna命令。

例如,在GitHub Actions中:

name: CIon:push:branches: [ main ]jobs:build-and-test:runs-on: ubuntu-lateststeps:- uses: actions/checkout@v2- name: Install Dependenciesrun: npm ci- name: Bootstrap Lernarun: npm run bootstrap- name: Run Testsrun: npm test- name: Publishif: startsWith(github.ref, 'refs/tags')run: npx lerna publish from-git --yes

Monorepo的最佳實踐

  • 清晰的模塊劃分:確保每個包都有明確的邊界和用途,避免過度耦合。
  • 版本策略:根據項目需求選擇固定或獨立版本策略。
  • 合理的依賴管理:避免循環依賴,合理控制公共依賴。
  • 文檔和說明:為每個包提供清晰的README和API文檔,方便其他開發者使用。
  • 持續集成:集成自動化測試、代碼質量檢查和構建過程。
  • 代碼審查:確保代碼質量和遵循團隊規范。
  • 定期清理:定期評估和刪除不再使用的包。

其他Monorepo管理工具

除了Lerna,還有其他一些工具可以用于Monorepo管理,每個工具都有其特點和適用場景:

Yarn Workspaces

Yarn的Workspaces特性直接內置在包管理器中,無需額外的命令行工具。它允許在一個倉庫中管理多個依賴,并自動解決跨包依賴。Workspaces適合那些主要使用Yarn作為包管理器的項目。

Rush (Pika)

Rush是Microsoft開發的一個Monorepo管理工具,專注于速度和可擴展性。Rush使用自定義的依賴解析算法,支持多項目和多包類型,包括TypeScript、JavaScript、C++等。Rush還提供了豐富的命令行工具和配置選項。

Nx ( Nrwl.io)

Nx 是一個開源的Monorepo管理工具,最初為Angular項目設計,但現在支持多種框架和技術,如React、Vue、Node.js等。Nx 提供了一整套工作流工具,包括代碼生成、測試、性能分析和并行構建。它還支持微前端架構。

Monorepo的挑戰

雖然Monorepo有許多優點,但也存在一些挑戰:

  • 版本沖突:在大型項目中,管理不同包的版本可能會變得復雜。
  • 構建時間:隨著項目規模的增長,構建和測試的時間可能顯著增加。
  • 學習曲線:新成員可能需要更多時間來熟悉Monorepo的結構和工作流程。
  • 依賴管理:解決跨包依賴和避免循環依賴可能需要額外的注意。

選擇Monorepo還是Polyrepo?

選擇Monorepo還是Polyrepo(多倉庫)取決于項目需求、團隊規模和偏好。Monorepo適合需要頻繁共享代碼和組件的大型項目,而Polyrepo則適用于小項目或需要獨立開發和發布的組件。

在做出決定時,應考慮以下因素:

  • 代碼共享:如果項目間有很多共享代碼,Monorepo可能是更好的選擇。
  • 團隊協作:如果團隊需要緊密合作,Monorepo可以簡化協同開發。
  • 構建時間:如果項目很大,Monorepo可能導致較長的構建時間。
  • 項目獨立性:如果項目彼此獨立,Polyrepo可能更合適。

2500G計算機入門到高級架構師開發資料超級大禮包免費送!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/12193.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/12193.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/12193.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

web入門練手案例(二)

下面是一下web入門案例和實現的代碼,帶有部分注釋,倘若代碼中有任何問題或疑問,歡迎留言交流~ 數字變色Logo 案例描述 “Logo”是“商標”的英文說法,是企業最基本的視覺識別形象,通過商標的推廣可以讓消費者了解企…

第一個Rust程序

在安裝好Rust以后,我們就可以編寫程序了。 首先,我們執行下面的命令,盡量讓你的rust版本和我的版本相同,或者比我的版本大。 zhangdapengzhangdapeng:~$ cargo --version cargo 1.78.0 (54d8815d0 2024-03-26) zhangdapengzhangd…

C語言(指針)2

Hi~!這里是奮斗的小羊,很榮幸各位能閱讀我的文章,誠請評論指點,關注收藏,歡迎歡迎~~ 💥個人主頁:小羊在奮斗 💥所屬專欄:C語言 本系列文章為個人學習筆記&#x…

聽說SOLIDWORKS科研版可以節約研發成本?

近幾年來,政府越來越重視科研帶動產業,績效優良的產業技術研究院對于國家和地區的學術成果轉化、技術創新、產業發展等具有不可忽視的促進和帶動作用。研究院會承擔眾多新產業的基礎研究工作,而常規的基礎研究需要長期的積累,每個…

JAVA畢業設計141—基于Java+Springboot+Vue的物業管理系統(源代碼+數據庫)

畢設所有選題: https://blog.csdn.net/2303_76227485/article/details/131104075 基于JavaSpringbootVue的物業管理系統(源代碼數據庫)141 一、系統介紹 本項目前后端分離,分為管理員、員工、用戶三種角色(角色權限可自行分配) 1、用戶: …

Nginx詳解:高性能HTTP和反向代理服務器

Nginx詳解:高性能HTTP和反向代理服務器 一、引言 Nginx(發音為“engine x”)是一個開源的高性能HTTP和反向代理服務器,也是一個IMAP/POP3/SMTP代理服務器。由于其出色的性能和穩定性,Nginx已經成為互聯網上最受歡迎的…

asp.net結課作業中遇到的問題解決4

目錄 1、vs2019每次運行一次項目之后,樣式表的格式就算在vs2019上改變了,在瀏覽器中顯示的還是以前的樣式,所以應該如何修改 2、如何實現選擇下拉框之后,顯示所選擇的這個類型的書籍的名稱 3、如何實現點擊首頁顯示的書籍&#…

高清模擬視頻采集卡CVBS四合一信號采集設備解析

介紹一款新產品——LCC261高清視頻采集與編解碼一體化采集卡。這款高品質的產品擁有卓越的性能表現和豐富多樣的功能特性,能夠滿足廣大用戶對于高清視頻采集、處理以及傳輸的需求。 首先,讓我們來了解一下LCC261的基本信息。它是一款基于靈卡技術研發的高…

Shell三劍客之sed

前言: Shell三劍客是grep、sed和awk三個工具的簡稱,因功能強大,使用方便且使用頻率高,因此被戲稱為三劍客,熟練使用這三個工具可以極大地提升運維效率。 sed是一個流編輯器,用于對文本進行編輯、替換、刪除等操作。sed…

LeetCode2095刪除鏈表的中間節點

題目描述 給你一個鏈表的頭節點 head 。刪除 鏈表的 中間節點 ,并返回修改后的鏈表的頭節點 head 。長度為 n 鏈表的中間節點是從頭數起第 ?n / 2? 個節點(下標從 0 開始),其中 ?x? 表示小于或等于 x 的最大整數。對于 n 1、…

深入探索Android簽名機制:從v1到v3的演進之旅

引言 在Android開發的世界中,APK的簽名機制是確保應用安全性的關鍵環節。隨著技術的不斷進步,Android簽名機制也經歷了從v1到v3的演進。本文將帶你深入了解Android簽名機制的演變過程,揭示每個版本背后的技術細節,并探討它們對開…

淺談下MYSQL表設計的幾條規則

作為后端開發人員,避免不了和數據庫打交道,可是我們怎么能夠設計出高效,可維護,可擴展的數據庫設計呢,在這里我總結了幾個點,供大家參考。 在寫之前,可能需要重復下數據庫設計的范式原則&#…

docker-compose.yml文件詳解

創建 docker-compose.yml 文件是使用 Docker Compose 管理多容器應用的第一步。這個 YAML 格式的文件詳細描述了服務、網絡和卷等組件以及它們之間的關系。下面是對一個典型 docker-compose.yml 文件結構的詳解: 基本結構 一個基本的 docker-compose.yml 文件通常…

水雨情監測系統—實時監測水位信息

TH-SW3水雨情監測系統是一種專門用于實時監測和收集水文氣象數據的自動化系統。它能夠實時獲取區域內降雨和水情數據,并將其存儲到數據庫中進行分析處理,從而為防汛指揮人員提供及時準確的信息服務。 水雨情監測系統的主要功能包括實時監測水位、流速、流…

C++類與對象基礎探秘系列(二)

目錄 類的6個默認成員函數 構造函數 構造函數的概念 構造函數的特性 析構函數 析構函數的概念 析構函數的特性 拷貝構造函數 拷貝構造函數的概念 拷貝構造函數的特性 賦值運算符重載 運算符重載 賦值運算符重載 const成員 const修飾類的成員函數 取地址及const取地址操作…

MySQL文檔_下載

可能需要:MySQL下載–》更新版本–》遷移數據庫到MySQL 以下都不重要【只要確定好需要安裝版本,找到對應的版本下載,安裝,設置即可】 下載、安裝: Determine whether MySQL runs and is supported on your platform…

iCloud如何高效利用:提升蘋果生態體驗

iCloud如何高效利用:提升蘋果生態體驗 引言 iCloud是蘋果公司提供的云服務,它允許用戶在蘋果設備之間無縫同步數據和內容。隨著數字化生活的不斷發展,有效地管理和利用iCloud對于提高工作效率和生活質量變得越來越重要。本文將詳細介紹如何…

Debian12安裝后更換為國內鏡像源,切換root用戶,解決用戶名不在sudoers文件中此事將被報告

選擇Debian作為編程開發最佳Linux的理由: Debian是面向程序員的最古老,最出色的Linux發行版之一。Debian提供了具有.deb軟件包管理兼容性的超穩定發行版。Debian為程序員提供了許多最新功能。因此,它具有一個特殊的編程空間。Debian是開發人員…

彌合孤島:克服構建 DevOps 文化的挑戰

持續變革正在發生軟件開發行業。DevOps 因其對自動化、協作和持續改進的關注而成為優化軟件交付并彌合開發和運營團隊之間鴻溝的重要方法。然而,過渡到真正的 DevOps 文化并非沒有挑戰。本文探討了您在追求 DevOps 時可能面臨的障礙并提供了解決方案。 01 了解 Dev…

數據結構 順序表1

1. 何為順序表: 順序表是一種線性數據結構,是由一組地址連續的存儲單元依次存儲數據元素的結構,通常采用數組來實現。順序表的特點是可以隨機存取其中的任何一個元素,并且支持在任意位置上進行插入和刪除操作。在順序表中&#xf…