モノレポ(monorepo)とマルチレポ(multirepo)


## `tsconfig.json` の `"paths"` 設定：モジュールのインポートをスマートに

`"paths"` 設定は、TypeScript（またはJavaScript）のプロジェクト設定ファイル（`tsconfig.json` や `jsconfig.json`）内で、**モジュールのインポートパスを独自に定義する機能**です。これは、特定のモジュール名が指定されたときに、それが実際のファイルシステムのどこにあるべきかをコンパイラに教える役割を果たします。

特に、複数のプロジェクトや共有ライブラリを一つのリポジトリで管理する「**モノレポ**」という開発スタイルにおいて、この`"paths"`設定は非常に強力なツールとなります。

-----

### `"paths"` を使わない場合：相対パスの課題

`"paths"` 設定を使わない場合、私たちは通常、\*\*相対パス（Relative Paths）\*\*を使ってモジュールをインポートします。相対パスとは、現在のファイルの位置を基準にして、インポートしたいファイルの場所を示す方法です。

#### 相対パスの例：

以下のようなモノレポのプロジェクト構造を考えてみましょう。

```
my-monorepo/
├── packages/
│   ├── ui-kit/         // 共有UIコンポーネントのライブラリ
│   │   └── src/
│   │       ├── components/
│   │       │   └── Button.ts
│   │       └── index.ts // ui-kit のエントリポイント
│   └── utils/          // 共有ユーティリティ関数のライブラリ
│       └── src/
│           ├── format.ts
│           └── index.ts // utils のエントリポイント
└── apps/
    ├── web-app/        // ウェブアプリケーション
    │   └── src/
    │       └── pages/
    │           └── Home.ts // ここからインポートする
    └── mobile-app/     // モバイルアプリケーション
        └── src/
            └── screens/
                └── Dashboard.ts // ここからインポートする
```

例えば、`apps/web-app/src/pages/Home.ts` から `packages/ui-kit/src/components/Button.ts` をインポートしたい場合：

```typescript
// apps/web-app/src/pages/Home.ts からのインポート
import { Button } from '../../../packages/ui-kit/src/components/Button';
```

そして、同じく `apps/web-app/src/pages/Home.ts` から `packages/utils/src/format.ts` をインポートしたい場合：

```typescript
// apps/web-app/src/pages/Home.ts からのインポート
import { formatCurrency } from '../../../packages/utils/src/format';
```

#### 相対パスの課題点：

1.  **パスが長くて複雑になる**: プロジェクトの階層が深くなったり、共通ライブラリが遠い場所にあると、`../../../` のような記述が増え、パスが非常に長くなります。
2.  **可読性の低下**: 長いパスは一目で内容を把握しにくく、コードの可読性を損ないます。
3.  **メンテナンス性の低下**: ファイルやフォルダの移動があった場合、そのファイルに依存しているすべての場所で相対パスを修正する必要があり、大規模なリファクタリングが手間になります。
4.  **入力ミス**: 長いパスは手動で入力する際にミスが発生しやすく、開発効率が落ちます。
5.  **どこから来たコードか不明**: `../../` の羅列では、そのモジュールがアプリケーション固有のものなのか、共通ライブラリなのかが分かりにくいです。

-----

### `"paths"` を使った場合：エイリアスによる簡潔なインポート

`"paths"` 設定を利用すると、これらの相対パスの課題を解決し、より直感的でメンテナンス性の高いインポートが可能になります。

`tsconfig.json` (または `jsconfig.json`) で次のように設定します。

```json
// tsconfig.json の一部
{
  "compilerOptions": {
    "baseUrl": "./", // プロジェクトのルートを基準にする
    "paths": {
      // @my-company/ui-kit というエイリアスを、実際のパスにマッピング
      "@my-company/ui-kit": ["packages/ui-kit/src/index.ts"],
      // @my-company/utils というエイリアスを、実際のパスにマッピング
      "@my-company/utils": ["packages/utils/src/index.ts"],
      // 例: 特定のファイルを直接エイリアスすることも可能
      "~config/*": ["src/config/*"]
    }
  }
}
```

この設定があれば、上記で挙げたインポートが次のように変わります。

```typescript
// apps/web-app/src/pages/Home.ts からのインポート（`paths` 使用）
import { Button } from '@my-company/ui-kit'; // 短く、分かりやすい！
import { formatCurrency } from '@my-company/utils'; // どこから来たか一目瞭然！
```

#### `"paths"` のメリット：

1.  **パスの簡潔化**: 長い相対パスを記述する必要がなくなり、コードがすっきりします。
2.  **可読性の向上**: エイリアス名（例: `@my-company/ui-kit`）を見るだけで、それが何という共有ライブラリや機能であるかが一目で分かります。
3.  **メンテナンス性の向上**: 実際のファイルパスが変わっても、`tsconfig.json` の設定だけを修正すればよく、多数のインポート文を修正する手間が省けます。
4.  **開発効率の向上**: 短く分かりやすいエイリアスは入力しやすく、コード補完も効きやすくなります。
5.  **モノレポとの相性**: モノレポのように複数のプロジェクトや共有ライブラリが複雑に配置されている環境で、特にその真価を発揮します。

-----

このように、`"paths"` 設定は、特にモノレポのような複雑なプロジェクト構造において、モジュールのインポートを圧倒的に簡単かつ効率的にするための強力なツールです。