首頁文章列表【NX 開發心得】
Monorepo 2025-02-05

【NX 開發心得】

最近因為公司的需求,需要開發多個不同版型的專案,其中又有不少部分需要共用。經過一番考慮後,我們決定將原本的專案搬移至 NX,希望藉此提高開發效率、統一管理共用模組,並減少重複撰寫相同功能的時間。 如果你對 NX 有興趣,可以參考官方文件:NX 官方網站。 為什麼選擇 NX? NX 是一個強大的 Monorepo 工具,適合用來管理多個專案(Apps)與共用函式庫(Libs)。它提供強大的模組管...

最近因為公司的需求,需要開發多個不同版型的專案,其中又有不少部分需要共用。經過一番考慮後,我們決定將原本的專案搬移至 NX,希望藉此提高開發效率、統一管理共用模組,並減少重複撰寫相同功能的時間。

如果你對 NX 有興趣,可以參考官方文件:NX 官方網站

為什麼選擇 NX?

NX 是一個強大的 Monorepo 工具,適合用來管理多個專案(Apps)與共用函式庫(Libs)。它提供強大的模組管理、靜態分析、快取機制以及自動化工具,讓開發過程更順暢。

在我們的情境中,NX 主要解決了以下幾個痛點:

  • 共用模組管理:將重複的邏輯提取到 libs/,方便各專案共用。
  • 清晰的專案架構:透過 apps/ 與 libs/ 明確區分專案與函式庫,提升可維護性。
  • 更好的開發體驗:NX 提供 CLI 工具與可視化儀表板,方便管理與分析專案。

專案架構

我們目前的 NX 專案架構大致如下:

├── apps/ # 各專案(應用程式)
│   ├── app1/
│   ├── app2/
│   └── …
│
├── libs/ # 共用層
│   ├── domain/ # 邏輯層
│   │   ├── hooks/ # 共用 Hooks
│   │   ├── store/ # 狀態管理
│   ├── api/ # API 整合層
│   ├── interface/ # 介面層
│   │   ├── response/ # 回應型別定義
│   │   └── request/ # 請求型別定義
│   ├── ui/ # UI 元件庫
│   │   ├── index.ts # Client 端元件
│   │   ├── server.ts # Server 端元件
│   │   ├── components/
│   │   │   ├── client/ # Client 專用元件
│   │   │   └── server/ # Server 專用元件
│   │   └── styles/ # 共用樣式
│   ├── utils/ # 工具函數
└── …

這樣的架構讓我們可以清楚區分應用層與共用模組,當我們需要修改某個核心功能時,只要更新 libs/,所有應用程式都能同步獲得變更。

NX 的使用方式

1. 設定路徑別名

為了讓 apps/ 與 libs/ 的引用更直覺,我們在 tsconfig.base.json 中加入以下設定:

{
  "paths": {
    "@app1/*": ["apps/app1/*"],
    "@app2/*": ["apps/app2/*"],
    "@domain/*": ["libs/domain/*"],
    "@api/*": ["libs/api/*"],
    "@utils/*": ["libs/utils/*"]
     ...
  }
}

這樣在專案內部就可以使用 @app1/、@domain/、@api/、@utils/ 等等來進行引用。

2. 生成 NX 應用與函式庫

生成新的應用程式(App)

nx g @nx/next:app apps/app

生成新的函式庫(Lib)

nx g @nx/next:lib libs/my-new-lib

這樣可以快速建立一個新的函式庫,供不同專案共用。

3. 查看所有可用目標

如果想知道專案 app1 內有哪些可用的目標(例如 build、test、serve 等),可以使用:

npx nx show project app1

這些目標可以是 NX 自動生成的,或者在專案內的 project.json 中定義的。

{
  "name": "app1",
  "$schema": "../../node_modules/nx/schemas/project-schema.json",
  "sourceRoot": "apps/app1",
  "projectType": "application",
  "tags": [],
  "// targets": "to see all targets run: nx show project app1--web",
  "targets": {
    //target 內可以自己定義需要的
  }
}

下圖就是啟動nx show project app1 — web 後顯示的畫面 Snipaste_2026-01-24_17-35-25

NX 帶來的效益

🚀提高開發效率

NX 提供了模組化管理,讓團隊可以更專注在各自的功能開發上,而不用擔心重複造輪子。

🎯 改善專案維護性

透過 libs/ 層的拆分,讓邏輯更容易管理,當某個功能需要變更時,不會影響到整個專案。

結論

這次將專案搬遷到 NX 讓我們體驗到 Monorepo 的威力,不僅能有效管理多個應用程式,還能提升開發效率。如果你的團隊也面臨相似的需求,NX 也許會是一個不錯的選擇。