---
title: "模組化和包管理"
date: "2026-07"
category: "設計模式與架構"
tags: ["設計模式與架構"]
description: "pnpm workspace 是個很有意思的用法，可以把各個子目錄正式化為統一管理的程式模組，讓各個模組存在轉為可以通過 @xxx/xxx 形式引入的包..."
source: "https://enriquemark.com/zh-hant/posts/%E6%A8%A1%E5%9D%97%E5%8C%96%E5%92%8C%E5%8C%85%E7%AE%A1%E7%90%86"
---

`pnpm workspace` 是個很有意思的用法，可以把各個子目錄正式化為統一管理的程式模組，讓各個模組存在轉為可以通過 `@xxx/xxx` 形式引入的包。這種把多個模組聚合在一個倉庫的架構，就叫做monorepo，他的好處就是all in one，全放在一起管理，而不需要在多個倉庫（或者分散的資料夾，邏輯上和倉庫類似）中跳來跳去，在維護和版控管理上要方便的多。

比如原先是

```
  backend/       ← 后端，有自己的 package.json
  frontend/      ← 前端，有自己的 package.json
  shared/        ← 共享类型（靠手抄同步到 frontend）
```

而利用 `pnpm workspace` 就可以將整個專案轉為

```
 project/
  ├── pnpm-workspace.yaml        ← 新增：声明 packages/* 是工作区成员
  └── packages/
      ├── backend/               ← 原 backend
      ├── frontend/
      └── shared/                ← 变成一个真正的包：@editorial/shared
```

這對於跨模組要共享同樣型別或者契約來說是非常方便的。原先的分離資料夾形式還需要手動去核對，時間長非常容易飄，尤其是相對目錄這種東西，一旦未來需要調整結構，基本上整個程式碼就得全改。因此，最簡便且規整的方式就是將其抽象為包，交給包管理器統一調配。如果未來需要調整、擴展，都只需要在這個基礎上順延即可，非常方便。

同時還有依賴管理方面，也可以讓所有模組的依賴進行統一管理，而不是各寫各的。從供應鏈安全和可能的穩健性上來說，都比分散在各自的內部要好的多。對於ai時代的程式設計來說，相較於 [基於過程的質量控制](/zh-hant/posts/基于过程的质量控制) 裡面提過的利用「微服務」來隔離各個倉庫，monorepo 的代價會更低一點。尤其是運維上，搞個k8s多少還是負擔太大了。整體上來說，微前端或者monorepo這種輕量級的模組化管理手段還是我更青睞的形式。

不過ai時代最大的優勢就是「程式碼富裕」，架構開始逐漸勝於純粹的「程式碼增量」。過去工程師可能會因為編碼成本過高而放棄清晰且隔離的架構，因為整體上的維護和開發成本會增加。但今天，ai時代的開發成本被壓縮到極致，反而是維護成本開始成為短板。此時，架構清晰的優勢就會勝出——好測試、穩健性且低耦合的程式碼，在可維護性上遠比龐雜的程式碼要更容易。尤其是對於ai開發來說，比起讓它在依託難以名狀的麵條裡面遨遊，一改改成全局崩塌，還不如讓它在清晰且界限明確的島嶼之間秩序通行。至少對於後者來說，即便出現問題，其邊界也能嚴格控制在島嶼內部，但若是前者，連鎖反應就可能導致塌陷式的全面崩塌。從穩健性上來說，顯然是島嶼勝出。
