Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】🚀 Mastering Monorepos with Lerna + Yarn Workspaces

2025年09月17日に「Dev.to」が公開したITニュース「🚀 Mastering Monorepos with Lerna + Yarn Workspaces」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

複数のアプリやライブラリをまとめて管理する「モノレポ」は複雑だが、Lernaを使えば開発を効率化できる。Lernaはモノレポ内のアプリのビルドや公開を一元化し、Yarn Workspacesで依存関係を最適に共有する。Module Federationにより、実行時のコード連携も柔軟になるため、モノレポでの開発・管理がシンプルになる。

ITニュース解説

複数のアプリケーションや共有ライブラリを同時に開発・管理する際、それぞれのプロジェクトがバラバラに存在する状態では、依存関係の更新や連携作業が非常に煩雑になり、開発効率の低下を招くことがある。このような課題を解決し、開発プロセスをスムーズにするための手法として「モノレポ」という考え方があり、LernaやYarn Workspacesといったツールがその実践を強力に支援する。

システム開発におけるコード管理の方式は、大きく分けて「ポリレポ」と「モノレポ」の二つがある。ポリレポは、個々のアプリケーションやライブラリがそれぞれ独立したリポジトリ(コードを管理する場所)で管理される方式を指す。これはシンプルで、それぞれのプロジェクトの独立性が高いという利点がある一方で、共有ライブラリが更新された際に、そのライブラリを利用している全てのアプリケーションのリポジトリを個別に更新・テストする必要が生じ、全体としての管理コストが高くなる傾向がある。特に、多くのサービスやマイクロサービスを開発している企業では、この連携の複雑さが大きな負担となる場合も少なくない。

これに対し、モノレポは、全てのアプリケーションやライブラリを単一の巨大なリポジトリの下にまとめて管理する方式である。一見すると、一つのリポジトリに全てのコードが入るため、管理がより複雑になるように思えるかもしれない。しかし、Lernaのようなツールを活用することで、このモノレポの運用が格段に容易になり、多くの利点をもたらす。モノレポでは、コードベース全体を一元的に把握できるため、共有ライブラリの更新が他のアプリケーションに与える影響をすぐに確認でき、テストやデプロイの計画も立てやすくなる。また、依存関係の管理、ビルド、テスト、そしてパッケージの公開といった一連の作業を一つの場所で統一的に行うことが可能になる。

Lernaは、モノレポ環境における開発ワークフローを効率化するための核となるツールである。Lernaを使用する場合、モノレポの最上位ディレクトリ(ルート)にlerna.jsonという設定ファイルを配置し、そのファイル内でモノレポ内のどのディレクトリが個別のパッケージ(アプリケーションやライブラリ)として扱われるべきかをLernaに指定する。例えば、ルートディレクトリの下に/app1(アプリケーション1)、/app2(アプリケーション2)、/shared-lib(共通ライブラリ)といったサブディレクトリが存在する場合、これらをLernaが管理するパッケージとして定義する。

モノレポのルートには、全体のpackage.jsonファイルも存在する。このファイル内で、"workspaces"という設定項目を使い、"packages": ["app1", "app2", "shared-lib"]のように記述することで、Yarn Workspaces(またはnpm Workspaces)がこれらのサブディレクトリをワークスペースとして認識する。Lernaの真骨頂は、モノレポ内の複数のパッケージに対して、一括でコマンドを実行できる点にある。package.json"scripts"セクションに、"start": "lerna run --parallel start""build": "lerna run build"といったLernaコマンドを記述すると、開発者はルートディレクトリでnpm run startを実行するだけで、app1app2の両方のアプリケーションを同時に起動させることができる。同様に、npm run buildと入力すれば、モノレポ内の全てのパッケージが一度にビルドされる。これにより、個々のプロジェクトディレクトリに移動してコマンドを一つずつ実行する手間が省け、開発プロセスが大幅に簡素化されるのだ。

Lernaと並んで、モノレポの効率的な運用に不可欠なのがYarn Workspacesである。これは、先に述べたpackage.json"workspaces"設定と密接に関連している。Yarn Workspacesは、モノレポ内の複数のパッケージ間で共通の依存関係を効率的に共有し、管理するための機能を提供する。具体的には、モノレポのルートディレクトリに一つのnode_modulesディレクトリだけが作成され、そこで全ての依存パッケージが一元的に管理される。これにより、個々のパッケージがそれぞれ独自のnode_modulesを持つ場合に比べてディスクスペースを節約できるだけでなく、依存関係のインストール時間も短縮される。また、全てのパッケージが同じ依存関係のバージョンを使用するため、バージョン不整合による問題を未然に防ぎ、開発の一貫性を保つことができる。この仕組みによって、依存関係の管理における複雑さが大幅に軽減され、より安定した開発環境が提供される。

さらに、モノレポによってコードが一元化された上で、WebpackのModule Federationという技術を利用することで、より高度な柔軟性を実現できる。Module Federationは、それぞれのアプリケーションが独立してビルド・デプロイされていながらも、実行時に(つまり、ブラウザ上で動作している間に)別のアプリケーションのコードやコンポーネントを動的にロードして利用できる仕組みを提供する。例えば、app1app2が共通のユーザーインターフェースコンポーネントを使用する場合、Module Federationを用いることで、その共有コンポーネントを一度だけビルドして公開し、app1app2が実行時にそのコンポーネントをネットワーク経由でロードして利用できる。この最大の利点は、共有コンポーネントの更新があった際に、そのコンポーネントを利用している全てのアプリケーションを再ビルドしたり、再デプロイしたりする必要がない点である。共有コンポーネントだけを更新・デプロイすれば、他のアプリケーションは自動的に最新版のコンポーネントを利用するようになるため、システムの保守性やデプロイの柔軟性が飛躍的に向上する。モノレポによる開発の一元化と、Module Federationによる実行時の動的な連携が組み合わさることで、大規模で複雑なWebアプリケーションの開発と運用はさらに強力になる。

まとめると、Lernaはモノレポ環境におけるパッケージのビルド、テスト、そして公開といった一連の作業を大幅に簡素化する役割を果たす。Yarn Workspacesは、モノレポ内の複数のパッケージ間での依存関係の共有を最適化し、管理の効率を高める。そして、Module Federationは、モノレポ内で開発されたアプリケーションが、実行時に動的にコードを共有し、連携できるという柔軟性をもたらすのである。これらのツールと概念を理解し活用することで、システムエンジニアは複数のアプリケーションやライブラリを効率的に管理し、より複雑で大規模なシステム開発をスムーズに進めることができるようになる。

関連コンテンツ

【ITニュース解説】🚀 Mastering Monorepos with Lerna + Yarn Workspaces | いっしー@Webエンジニア