2024/11/03

使用NX 體驗 Monorepo的美好

什麼是 Monorepo?為什麼要使用它?

隨著軟體專案的成長,特別是在多模組、多應用程式的環境下,管理代碼的挑戰也隨之增加。傳統的 Multi-Repo 策略(每個模組使用獨立儲存庫)在版本一致性和依賴管理方面存在不少痛點,特別是當需要頻繁更新和協作時,容易引發衝突和整合困難。

Monorepo 是一種更集中的管理方式。透過將所有模組放在一個儲存庫中,開發團隊可以更容易地維持一致的依賴版本和共享代碼。這種方法在大型專案中具備幾個顯著優勢:

  • 依賴一致性:Monorepo 確保所有模組使用相同版本的依賴,避免因為版本衝突而引起的問題。
  • 跨模組重用和同步:允許模組之間共享代碼,並在單一提交中完成多個模組的變更,方便同步更新。
  • 統一的 CI/CD 管理:可以使用一套測試和構建流程來處理所有模組,簡化 CI/CD 配置。
  • 增量編譯和快取:通過增量構建和快取技術(如 NX 的增量編譯),Monorepo 能顯著減少重複編譯的時間,提高開發效率。

NX:專為 Monorepo 優化的開發工具

NX 是一個強大的 Monorepo 工具,專為管理多模組、多應用的專案而設計。它支援增量編譯、自動快取、依賴視覺化等功能,幫助開發團隊減少不必要的構建,提升整體開發效率。此外,NX 還具有任務調度、代碼生成和豐富的插件生態,適合大型團隊的專案開發需求。

此外,NX 可以與高效的包管理器 pnpm 搭配使用。pnpm 具備高度優化的快取和依賴管理能力,使得構建和測試更加高效。接下來,我們將介紹如何使用 NX 和 pnpm 建立並管理一個 Monorepo 專案,並說明其主要操作指令。


安裝 NX 和 pnpm

首先,確保已安裝 Node.js,然後使用以下命令來安裝 pnpm:

npm install -g pnpm

接著,使用 pnpm 安裝 NX CLI:

pnpm add -g nx

建立 NX 工作區

安裝完畢後,使用 NX 的 create-nx-workspace 指令來建立工作區。例如,要創建一個名稱為 my-workspace 的工作區:

nx create-nx-workspace@latest my-workspace

執行此命令後,NX 會提示選擇一個預設配置(如 React、Angular、Next.js 或空白工作區)。選擇所需配置(例如 React),NX 將自動生成一個標準化的 Monorepo 架構,包含 apps/libs/ 目錄,分別用於存放應用程式和可重用的函式庫。

配置 pnpm 工作區

要讓 pnpm 正確識別和管理 NX 工作區內的所有專案,請在根目錄的 package.json 中添加 workspaces 設定:


{
  "name": "my-workspace",
"private": true,
"workspaces": ["apps/*", "libs/*"]
}

這樣,pnpm 就能高效地管理 Monorepo 中所有應用程式和函式庫的依賴關係。

創建應用程式與函式庫

NX 提供了多種 CLI 指令來簡化專案管理。可以使用 nx generate(或簡寫 nx g)來創建新的應用程式或函式庫。例如,要創建一個名為 my-new-app 的 React 應用程式:

nx g @nx/react:app apps/my-new-app

該指令會在 apps/my-new-app 路徑下創建一個新的應用程式,並自動處理所有依賴。

構建與運行應用程式

應用程式建立後,可以使用 NX 的構建和運行指令來開發。要構建 my-new-app 應用程式,可以執行:

nx build my-new-app

NX 的快取機制使構建過程更高效,並減少了不必要的重複編譯。要在本地伺服器上啟動應用程式以進行測試,則可以使用 nx serve

nx serve my-new-app

此命令會將應用程式運行於 http://localhost:4200,方便開發測試。

測試應用程式

NX 提供 nx test 指令來執行單元測試。以下命令將運行 my-new-app 的所有測試案例:

nx test my-new-app

該命令會根據預設或自定義的測試配置來執行測試,幫助開發者快速驗證應用程式功能。

管理快取與 nx reset

NX 的快取功能極大提升了大型專案的開發效率。不過,如果發現因快取導致的非預期行為,可以通過 nx reset 清除快取:

nx reset

執行該命令後,NX 將從頭構建所有模組,確保結果基於最新代碼。

增量編譯與依賴管理

NX 支援增量編譯,能夠僅針對受影響的模組進行構建,顯著減少編譯時間。使用 nx affected 指令即可執行增量編譯:

nx affected --target=build

這項功能特別適合大型專案,可顯著提升構建效率。

結論

NX 和 pnpm 的組合讓 Monorepo 的管理變得更加高效。NX 提供了優秀的增量編譯和快取功能,而 pnpm 的快取和依賴管理進一步加速了整個流程。這使得 Monorepo 成為多模組、大型專案中一種優秀的選擇。