メインコンテンツへスキップ
Code & Craft
ツール比較 約8分で読めます

Storybook 完全入門|コンポーネントカタログの作り方【2026年版】

Storybook の導入から活用まで完全解説。コンポーネントカタログの作成、インタラクションテスト、デザインシステム構築など実務で使える内容を網羅。

Storybook は、UIコンポーネントを独立して開発・テスト・ドキュメント化できるツールです。React、Vue、Svelte、Angular などあらゆるフレームワークに対応し、デザインシステムの構築には欠かせない存在となっています。2026年現在、世界中で 100万以上のプロジェクトで採用されています。

Storybook とは何か

Storybook は、コンポーネントをアプリケーションから切り離して表示・操作できる開発環境です。

主な用途:

  • コンポーネントカタログ: チームで共有できる UI ライブラリ
  • 独立した開発: ページの完成を待たずにコンポーネントを開発
  • ビジュアルテスト: 見た目のリグレッションを検出
  • ドキュメント: コンポーネントの使い方を自動生成
  • デザイナーとの協業: 動作するコンポーネントをデザイナーに見せる

インストール

# 既存プロジェクトに追加
npx storybook@latest init

# 新規プロジェクト
npx storybook@latest init --type react

対応フレームワークを自動検出し、必要な設定を生成してくれます。

ディレクトリ構造

.storybook/
  ├── main.ts          # 設定ファイル
  ├── preview.ts       # グローバル設定
  └── manager.ts       # UI カスタマイズ

src/
  └── components/
      ├── Button.tsx
      └── Button.stories.tsx  # ストーリー

基本的なストーリーの書き方

React の例

// Button.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Button } from './Button';

const meta: Meta<typeof Button> = {
  title: 'Components/Button',
  component: Button,
  tags: ['autodocs'],
  argTypes: {
    variant: {
      control: 'select',
      options: ['primary', 'secondary', 'danger'],
    },
    size: {
      control: 'select',
      options: ['sm', 'md', 'lg'],
    },
  },
};

export default meta;
type Story = StoryObj<typeof Button>;

export const Primary: Story = {
  args: {
    variant: 'primary',
    children: 'Primary Button',
  },
};

export const Secondary: Story = {
  args: {
    variant: 'secondary',
    children: 'Secondary Button',
  },
};

export const Large: Story = {
  args: {
    variant: 'primary',
    size: 'lg',
    children: 'Large Button',
  },
};

コンポーネントの起動

npm run storybook

http://localhost:6006 で Storybook が開き、左サイドバーに定義したストーリーが表示されます。

アドオン(Addons)

Storybook の強力さは、豊富なアドオンエコシステムにあります。

必須アドオン

// .storybook/main.ts
export default {
  addons: [
    '@storybook/addon-essentials',  // 基本機能
    '@storybook/addon-links',       // ストーリー間リンク
    '@storybook/addon-a11y',        // アクセシビリティチェック
    '@storybook/addon-interactions', // ユーザー操作シミュレーション
  ],
};

addon-essentials に含まれる機能

  • Actions: イベント発火の確認
  • Controls: プロップスを動的に変更
  • Viewport: レスポンシブ確認
  • Backgrounds: 背景色の切替
  • Measure: 要素のサイズ計測
  • Outline: 要素の境界表示
  • Docs: 自動ドキュメント生成

インタラクションテスト

Storybook 7 以降、コンポーネントのインタラクションテストが可能になりました。

import { expect, within, userEvent } from '@storybook/test';

export const LoginForm: Story = {
  args: {},
  play: async ({ canvasElement }) => {
    const canvas = within(canvasElement);

    // 入力
    await userEvent.type(canvas.getByLabelText('Email'), 'test@example.com');
    await userEvent.type(canvas.getByLabelText('Password'), 'password');

    // クリック
    await userEvent.click(canvas.getByRole('button', { name: 'Login' }));

    // アサーション
    await expect(canvas.getByText('Welcome')).toBeInTheDocument();
  },
};

アクセシビリティのチェック

@storybook/addon-a11y をインストールすると、各ストーリーのアクセシビリティ問題を自動検出します。

Storybook UI に「Accessibility」タブが追加される

violations(違反)、passes(合格)、incomplete(不完全)が表示

具体的な修正方法を提示

Webアクセシビリティ WCAG 2.2 完全対応ガイド と併せて活用すると効果的です。

デザイントークンの統合

CSS 変数やカラーパレットを Storybook に統合できます。

// .storybook/preview.ts
import '@/styles/tokens.css';
import '@/styles/global.css';

export default {
  parameters: {
    backgrounds: {
      default: 'light',
      values: [
        { name: 'light', value: '#ffffff' },
        { name: 'dark', value: '#0f172a' },
      ],
    },
    viewport: {
      viewports: {
        mobile: { name: 'Mobile', styles: { width: '375px', height: '667px' } },
        tablet: { name: 'Tablet', styles: { width: '768px', height: '1024px' } },
        desktop: { name: 'Desktop', styles: { width: '1440px', height: '900px' } },
      },
    },
  },
};

MDX での詳細ドキュメント

より詳細なドキュメントは MDX で記述できます。

{/* Button.mdx */}
import { Meta, Story, Canvas } from '@storybook/blocks';
import * as ButtonStories from './Button.stories';

<Meta of={ButtonStories} />

# Button Component

汎用的なボタンコンポーネントです。プライマリアクションに使います。

## 使い方

```tsx
<Button variant="primary" onClick={handleClick}>
  クリック
</Button>

バリエーション

プロップス

```

デプロイと共有

Chromatic(Storybook の公式ホスティング)

npx chromatic --project-token=<your-token>

PR ごとにビジュアルリグレッションテストを実行し、変更点をハイライトします。

GitHub Pages

npm run build-storybook

# dist/ を GitHub Pages にデプロイ

Vercel / Netlify / Cloudflare Pages

# package.json
"scripts": {
  "build-storybook": "storybook build"
}

ビルドコマンドを storybook build、出力ディレクトリを storybook-static に設定するだけでデプロイできます。

Storybook Test Runner

Storybook の各ストーリーを Jest ベースでテスト実行できます。

npm install --save-dev @storybook/test-runner

# テスト実行
npm run test-storybook

play 関数で定義したインタラクションがすべて自動実行され、失敗があれば CI が失敗します。

Figma との連携

Figma のデザインを Storybook の各ストーリーに紐付けられます。

export const Primary: Story = {
  args: { /* ... */ },
  parameters: {
    design: {
      type: 'figma',
      url: 'https://www.figma.com/file/...',
    },
  },
};

デザイナーとの連携がスムーズになります。詳しくは Figma からコーディングを効率化するワークフロー も参考にしてください。

パフォーマンス最適化

1. オンデマンドロード

// .storybook/main.ts
export default {
  features: {
    storyStoreV7: true,  // 高速化
  },
};

2. Static を活用

変更が少ないストーリーは static ファイルとして事前ビルド。

3. 不要なアドオンを削除

使っていないアドオンは読み込みを遅くします。

大規模プロジェクトでの活用

モノレポでの構成

packages/
  ├── ui/
  │   ├── src/
  │   │   ├── Button/
  │   │   │   ├── Button.tsx
  │   │   │   └── Button.stories.tsx
  │   │   └── Input/
  │   └── package.json
  └── app/
      └── package.json
// .storybook/main.ts
export default {
  stories: [
    '../packages/ui/src/**/*.stories.@(js|jsx|ts|tsx)',
  ],
};

命名規則

Components/Atoms/Button
Components/Molecules/SearchBar
Components/Organisms/Header
Pages/Home

Atomic Design の原則に沿った階層構造が見やすくなります。

よくある質問

Q: Next.js プロジェクトで使える?

A: はい。@storybook/nextjs フレームワークを使えば、Next.js の Image コンポーネントや Router もモックされます。

Q: CSS-in-JS は動く?

A: はい。styled-components、Emotion、Vanilla Extract など主要な CSS-in-JS ライブラリに対応しています。

Q: Tailwind CSS は?

A: もちろん対応しています。preview.ts で global.css をインポートするだけです。

Q: テスト置き換えになる?

A: ユニットテストの代替にはなりませんが、ビジュアルテスト + インタラクションテストとして活用できます。

まとめ

Storybook を導入すると、以下が実現できます。

  • コンポーネント駆動開発: ページに依存せず独立して開発
  • デザインシステムの構築: チームで共有できる UI ライブラリ
  • 自動ドキュメント: コンポーネントの使い方を見える化
  • ビジュアルテスト: 見た目のリグレッション検出
  • デザイナーとの協業: 動く UI でレビュー

まずは小さなコンポーネント(Button、Input 等)からストーリーを書き始めるのがおすすめです。効果を実感したら徐々に範囲を広げていきましょう。

参考リンク

#Storybook #コンポーネント #デザインシステム #テスト
シェア: