Monorepoとは?npm workspacesを使ったクロスプロジェクトコード共有の完全ガイド
· 約9分
現代のフロントエンドおよびフルスタック開発において、プロダクトが拡大するにつれて、「複数のプロジェクトで同じコードベースを共有する必要がある」という状況によく直面します。例えば、ユーザー向けのメインサイト(Client App)と内部スタッフ向けの管理画面(Admin Panel)などです。これらは独立して稼働しますが、同じUIコンポーネントライブラリ、API呼び出しロジック、または型定義を共有することがよくあります。
もし両方のプロジェクトに同じコードをコピペしてしまうと、将来ロジックを変更する際に、エンジニアは複数のプロジェクトで何度も変更作業を行わなければならず、見落としやバージョンの不一致が生じるリスクが高まります。この問題を解決するために、**Monorepo(モノレポ)**アーキテクチャが登場しました。そして、現在のNode.jsエコシステムにおいて、npm workspaces は最も導入しやすいツールの1つです。
Monorepoアーキテクチャとは?

Monorepo(Monolithic Repository)とは、複数の異なるプロジェクトやパッケージを、すべて単一のGitリポジトリ内で管理することを指します。これと相対するのが従来のPolyrepo(Multi-repo)であり、各プロジェクトが独立したリポジトリを持つ構成です。
Monorepoの主なメリット
- 信頼できる唯一の情報源 (Single Source of Truth):すべてのコードが同じツリー構造の下にあり、チームメンバーが常に一貫したコードベースを参照できるようになります。
- コードの共有が簡単:クロスプロジェクトで共有モジュールを参照する際、ローカルでのシンボリックリンク (Symlink) を使うだけで済みます。テストのためにパッケージをいちいち npm registry に公開する必要はありません。
- 依存関係の一貫性:サードパーティの依存パッケージ(ReactやLodashなど)をルートディレクトリに巻き上げ (Hoist) することで、すべてのサブプロジェクトで使用されるパッケージバージョンを完全に一致させ、バージョンの競合を防ぎ、ストレージのスペースを節約できます。
- 大規模なリファクタリングが容易:共有モジュールのAPIが変更された場合、そのモジュールに依存するすべてのプロジェクトが同じリポジトリ内にあるため、エンジニアは一度に変更を行い、TypeScriptコンパイラを使って潜在的なエラーをすべて検出できます。
npm workspacesについて
npm v7 バージョン以降、npm は公式に Workspaces のサポートを組み込みました。これは、同じローカルファイルシステム内の複数のパッケージの依存関係を管理するためのCLIネイティブ機能を提供します。ルートディレクトリの package.json を設定するだけで、npm は自動的にサブプロジェクトの依存関係を整理し、相互参照できるようにしてくれます。