TL;DR

複数のパッケージを 1 つのリポジトリで管理するコード管理の戦略。英語では Monorepo と書く。

なぜ必要か

同じリポジトリ内のパッケージを互いに参照できる。また、node_modules を共有するので、ディスクの容量を節約できる。

仕組み

Web フロントエンドでは、npm などのパッケージマネージャが提供する Workspace の機能で実現することが多い。

Next.js では、設定ファイル(next.config.js)の transpilePackages にパッケージを足すと、そのパッケージを自動でトランスパイルしてバンドルできる。

例

Bun では、npm とほとんど同じ package.json で Workspace を作れる。

{
  "name": "my-monorepo",
  "private": true,
  "workspaces": ["packages/*"]
}

pnpm では、pnpm-workspace.yaml を別に作る必要がある。また、Workspace 内の別のパッケージを依存に含めるには、"workspace:*" のような接頭辞を付ける。

自分の理解

Bun と npm の違いは、コマンドぐらいだと思う。pnpm の Workspace には少し苦戦したので、Bun で npm と同じように書けるのはありがたい。pnpm で書いた例は trpc-frere-memoir にある。

関連

出典