• システム開発に関わる内容をざっくりと書いていく

atomic-design(Reactにて)についてキャッチアップ

アトミックデザインと構成ルール:ReactのUI設計を整える

Reactでの開発が進むにつれて、「どこに何を置くべきか分からない問題」が出てくる。
特にチーム開発になると、誰が書いたどのコンポーネントを使えばいいのか混乱する
そんな問題を解決してくれるのが、アトミックデザイン


アトミックデザインってなに?

UIを5つのレイヤーに分けて整理する設計手法

  1. Atoms:ボタン・テキストフィールドなど最小単位
  2. Molecules:Atomsの組み合わせ(例:フォーム)
  3. Organisms:ページ内のセクション単位(例:ヘッダー)
  4. Templates:レイアウト骨格
  5. Pages:最終的なページとして使う部分

これを守っておけば、どんな規模でも設計が破綻しにくくなる


各レイヤーの役割と実装イメージ

🧬 1. Atoms(原子)

UIの最小構成単位。基本的には「何の責務も持たない部品」。

tsx
<TextInput label="ユーザー名" value={username} onChange={handleChange} />
<PrimaryButton onClick={handleSubmit}>ログイン</PrimaryButton>
  • 再利用性重視
  • 状態を持たない
  • MUIのラッパーやカスタムスタイルをよく置く

⚛️ 2. Molecules(分子)

複数のAtomsを組み合わせて、ちょっとした機能を持った部品にしたもの。

tsx
<LoginForm onSubmit={handleLogin} />
  • 入力フォームなど
  • 状態やバリデーションを含んでもOK
  • イベントハンドラを受け取る形が多い

🧠 3. Organisms(有機体)

アプリケーションにおける機能ブロック単位

tsx
<Header isLoggedIn={true} onLogout={handleLogout} />
<Footer />
  • 複数のMoleculesやAtomsを統合
  • 見た目にも機能にもそれなりのサイズがある
  • 多くの場合、ドメイン固有の意味を持つ(例:ProductList, ArticleCard)

🧩 4. Templates(テンプレート)

ページレイアウトの骨格を定義するレイヤー。

tsx
<MainTemplate isLoggedIn={isLoggedIn} onLogout={handleLogout}>
{children}
</MainTemplate>
  • 共通の構造(ヘッダー+メイン+フッターなど)を提供
  • 各ページでの使い回しが前提
  • 状態をあまり持たず、propsで受け取る

📄 5. Pages(ページ)

最終的にルーティングに使われるページ単位のコンポーネント。

tsx
<LoginPage />
  • 状態管理、データ取得なども含んでOK
  • ビジネスロジックの集約地点
  • Templatesを使ってレイアウトする

ディレクトリ構成のルール例

bash
src/
├── components/
│ ├── atoms/
│ ├── molecules/
│ ├── organisms/
│ └── templates/
└── pages/

ここまできたら、「ファイルを置く場所に迷わない」
チーム内でもルールが明確になるので、他人のコードもすぐに追えるようになる。


実装で気をつけること

✅ 責務の分離

  • Atomsはデザインだけ、Molecules以上から機能が乗ってくる
  • 状態やロジックをどの階層に持たせるか意識

✅ 粒度の調整

  • 小さくしすぎて逆に読みにくくなるパターンもある
  • 「再利用したいかどうか」「汎用性があるか」で判断するのが◎

✅ 型定義とprops設計

  • 各レイヤーでpropsの型をしっかり定義しておくと安心
  • イベント関数や状態は親から明示的に渡す(バケツリレーに注意)

アトミックデザイン導入のメリット

  • コンポーネントの粒度が揃う
  • UIの再利用性が爆上がり
  • ディレクトリ構成が明確で管理しやすい
  • チーム開発がやりやすくなる

まとめ

  • アトミックデザインは「部品→機能→構造→ページ」へ段階的にUIを組む設計思想
  • 責任と役割が明確になることで、保守しやすいアプリが作れる
  • ファイルや責務の整理で悩む時間が減る
  • 実務でもかなり導入されている手法なので、覚えておいて損なし

👇 サンプル:アトミックデザイン採用ログイン画面