StorybookとTailwind CSSで始めるヘルスダッシュボード向けコンポーネントライブラリ構築
StorybookとTailwind CSSを使用して、ヘルスダッシュボード向けの再利用可能なテーマ対応Reactコンポーネントライブラリを構築するための実践的なステップバイステップチュートリアルです。
このページの内容
はじめに
ヘルステック(健康技術)の世界を飛び回る中で、直感的で一貫性のあるユーザーインターフェースを構築することが非常に重要です。患者のバイタルサイン(生命兆候)を表示する場合でも、健身(フィットネす)の目標を追跡する場合でも、预约((アポイントメント)を管理する場合でも、明確で信頼性の高いUIは大きな違いを生みます。しかし、新しいプロジェクトごとにゼロからこれらのインターフェースを構築するのは非効率で、不整合が生じやすくなります。
そこで、专門的な(专门の)コンポーネントライブラリの出番です。再利用可能で、適切に文書化され、簡単にテーマ変更できるコンポーネントのセットを作成することで、開発速度を大幅に向上させ、デザイナーと開発者の間の协作を改善し、製品全体を通して一貫したユーザーエクスペリエンスを確保することができます。
このチュートリアルでは、現代的(モダンな)フロントエンドツールの強力で三位一体の組み合わせを使用してヘルスダッシュボード用のコンポーネントライブラリを構築します:React、Storybook、Tailwind CSS です。バイタルサインを表示するための MetricCard やステータスインジケーター用の Pill など、いくつかのコアコンポーネントを構築し、共有と再利用の準備を整えます。
前提条件:
- ReactとJavaScriptへの確実な理解
- お使いのマシンにNode.jsとnpm/yarnがインストールされていること
- コマンドラインへの基本的な熟悉
問題の理解
ヘルスダッシュボード用のUI開発には固有の課題があります:
| 課題 | 影響 | 解決策 |
|---|---|---|
| データ密度 | 情報のオーバーロード | 一貫したコンポーネントパターン |
| 一貫性 | ユーザーの混乱 | 共有デザイン言語 |
| スケーラビリティ | CSSの肥大化 | 再利用可能なテーマ変更可能なコンポーネント |
コンポーネントライブラリは、UIの単一の情報源を提供することで这些问题を解決します。
コンポーネントライブラリのアーキテクチャ
以下の図は、コンポーネントライブラリ開発ワークフローを示しています:
前提条件とプロジェクトセットアップ
さあ、実践に移って開発環境を設定しましょう。高速でモダンなReactセットアップにViteを使用します。
まず、Viteを使用して新しいReactプロジェクトを作成します:
npm create vite@latest health-dashboard-library --template react-ts
cd health-dashboard-library
npm install
次に、Storybookをインストールします。新しいプロジェクトディレクトリに移動し、Storybookのinitコマンドを実行します:
npx storybook@latest init
このコマンドはReactを使用している事を検出し、Storybookに必要なすべての依存関係と構成ファイルをセットアップします。
最後に、スタイリングニーズにTailwind CSSを追加しましょう。
npm install -D tailwindcss postcss autoprefixer
npx tailwindcss init -p
これにより tailwind.config.js と postcss.config.js ファイルが作成されます。次に、tailwind.config.js を構成して、どのファイルにTailwindクラス名が含まれているかを指定します:
// tailwind.config.js
/** @type {import('tailwindcss').Config} */
export default {
content: [
"./index.html",
"./src/**/*.{js,ts,jsx,tsx}",
],
theme: {
extend: {},
},
plugins: [],
}
最後に、./src/index.css ファイルを作成し、Tailwind directivesを追加します。これはTailwindのすべてのスタイルのエントリポイントです。
/* src/index.css */
@tailwind base;
@tailwind components;
@tailwind utilities;
Storybookがこれらのスタイルを取得するように、.storybook/preview.ts にこのCSSファイルをインポートします:
// .storybook/preview.ts
import type { Preview } from "@storybook/react";
import '../src/index.css'; // この行を追加
const preview: Preview = {
parameters: {
// ... 既存のパラメータ
},
};
export default preview;
これで、StorybookとVite開発サーバーの両方を起動できます:
# Storybookを実行する場合
npm run storybook
# Viteアプリを実行する場合(オプション)
npm run dev
ステップ1:MetricCardコンポーネントの構築
ハートレート、血圧、歩数などの主要な指標を表示する方法がなければ、ヘルスダッシュボードは不完全です。MetricCard コンポーネントを作成しましょう。
実施内容
プロパティとして label、value、および unit を受け取るシンプルで再利用可能なカードを構築します。Tailwind CSSでスタイリングされた、クリーンでモダンな外観になります。
実装
src/components/MetricCard.tsx にコンポーネント用の新しいファイルを作成します:
// src/components/MetricCard.tsx
import React from 'react';
export interface MetricCardProps {
label: string;
value: string | number;
unit: string;
}
export const MetricCard: React.FC<MetricCardProps> = ({ label, value, unit }) => {
return (
<div className="bg-white rounded-lg shadow-md p-6 w-full max-w-xs text-center transform hover:scale-105 transition-transform duration-300">
<div className="text-gray-500 text-sm font-medium uppercase tracking-wider">{label}</div>
<div className="text-4xl font-bold text-gray-800 my-2">
{value}
<span className="text-2xl text-gray-600 ml-1">{unit}</span>
</div>
</div>
);
};
動作の仕組み
これは MetricCardProps を受け取る简单な関数型Reactコンポーネントです。スタイリングにはJSXに直接Tailwindのユーティリティクラスを使用します。このアプローチにより、スタイルがコンポーネントロジックと共存し、何が起きているかを確認しやすくなります。
Storyの作成
次に、このコンポーネントを視覚化して文書化するためのStorybook Storyを作成しましょう。src/components/MetricCard.stories.tsx を作成します:
// src/components/MetricCard.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { MetricCard } from './MetricCard';
const meta: Meta<typeof MetricCard> = {
title: 'Dashboard/MetricCard',
component: MetricCard,
tags: ['autodocs'],
argTypes: {
label: { control: 'text', description: 'The label for the metric' },
value: { control: 'text', description: 'The value of the metric' },
unit: { control: 'text', description: 'The unit for the metric value' },
},
};
export default meta;
type Story = StoryObj<typeof MetricCard>;
export const HeartRate: Story = {
args: {
label: 'Heart Rate',
value: '72',
unit: 'bpm',
},
};
export const StepsTaken: Story = {
args: {
label: 'Steps Taken',
value: '8,452',
unit: 'steps',
},
};
npm run storybook を実行すると、インタラクティブなコントロールでプロパティを変更できるStorybook UIに MetricCard コンポーネントが表示されます!
ステップ2:ステータス用の「Pill」コンポーネントの作成
ステータスインジケーターは、「正常」、「高」、「アクティブ」などの健康ダッシュボードで一般的です。Pill コンポーネントはこれに最適です。
実施内容
variant プロパティに基づいて色が変わる小さくて錠剤形状のコンポーネントを作成します。
実装
src/components/Pill.tsx にコンポーネントファイルを作成します:
// src/components/Pill.tsx
import React from 'react';
export interface PillProps {
text: string;
variant?: 'success' | 'warning' | 'danger' | 'info';
}
export const Pill: React.FC<PillProps> = ({ text, variant = 'info' }) => {
const baseClasses = 'inline-block px-3 py-1 text-xs font-semibold rounded-full';
const variantClasses = {
success: 'bg-green-100 text-green-800',
warning: 'bg-yellow-100 text-yellow-800',
danger: 'bg-red-100 text-red-800',
info: 'bg-blue-100 text-blue-800',
};
return (
<span className={`${baseClasses} ${variantClasses[variant]}`}>
{text}
</span>
);
};
動作の仕組み
このコンポーネントは variantClasses オブジェクトを使用して variant プロパティを特定のTailwind CSSクラスにマッピングします。これはコンポーネント内の条件付きスタイリングを処理するクリーンな方法です。
Storyの作成
src/components/Pill.stories.tsx にStoryを作成しましょう:
// src/components/Pill.stories.tsx
import type { Meta, StoryObj } from '@storybook/react';
import { Pill } from './Pill';
const meta: Meta<typeof Pill> = {
title: 'Dashboard/Pill',
component: Pill,
tags: ['autodocs'],
argTypes: {
text: { control: 'text' },
variant: {
control: { type: 'select' },
options: ['success', 'warning', 'danger', 'info'],
},
},
};
export default meta;
type Story = StoryObj<typeof Pill>;
export const Success: Story = {
args: {
text: 'Normal',
variant: 'success',
},
};
export const Warning: Story = {
args: {
text: 'Elevated',
variant: 'warning',
},
};
export const Danger: Story = {
args: {
text: 'High',
variant: 'danger',
},
};
実行中のStorybookインスタンスを確認し、さまざまなvariantをテストするためのドロップダウンを備えた新しい Pill コンポーネントを見つけます。
すべてをまとめる:ダッシュボードビュー
コンポーネントを組み合わせてヘルスダッシュboardsのごく一部をシミュレートするシンプルなStoryを作成しましょう。
新しいStoryファイル src/stories/HealthDashboard.stories.tsx を作成します:
// src/stories/HealthDashboard.stories.tsx
import React from 'react';
import type { Meta, StoryObj } from '@storybook/react';
import { MetricCard } from '../components/MetricCard';
import { Pill } from '../components/Pill';
const DashboardView = () => (
<div className="p-8 bg-gray-50 min-h-screen">
<h1 className="text-3xl font-bold text-gray-800 mb-2">Patient Vitals</h1>
<div className="flex items-center space-x-2 mb-8">
<Pill text="Live" variant="success" />
<Pill text="Monitoring Active" variant="info" />
</div>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-6">
<MetricCard label="Heart Rate" value="72" unit="bpm" />
<MetricCard label="Blood Pressure" value="120/80" unit="mmHg" />
<MetricCard label="Oxygen Saturation" value="98" unit="%" />
<MetricCard label="Temperature" value="36.6" unit="°C" />
</div>
</div>
);
const meta: Meta = {
title: 'Pages/HealthDashboard',
component: DashboardView,
};
export default meta;
type Story = StoryObj<typeof meta>;
export const Default: Story = {};
このStoryは、シンプルかつ分離されたコンポーネントから複雑なUIをどれほど簡単に構成できるかを示しています。これがコンポーネントライブラリ構築の核となるパワーです。
本番環境へのデプロイ:ライブラリのバンドル
ライブラリを共有する準備ができたら、配布可能な形式にバンドルする必要があります。そのためにViteを構成できます。
「ライブラリモード」を有効にするために vite.config.ts を変更します:
// vite.config.ts
import { defineConfig } from 'vite'
import react from '@vitejs/plugin-react'
import { resolve } from 'path'
import dts from 'vite-plugin-dts'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [react(), dts()], // 型定義を生成するためのdtsプラグイン
build: {
lib: {
entry: resolve(__dirname, 'src/index.ts'), // ライブラリのエントリポイント
name: 'HealthDashboardLibrary',
fileName: 'health-dashboard-library',
},
rollupOptions: {
external: ['react', 'react-dom'], // Reactをバンドルしない
output: {
globals: {
react: 'React',
'react-dom': 'ReactDOM',
},
},
},
},
})
すべてのコンポーネントをエクスポートするエントリポイントファイル src/index.ts も必要です:
// src/index.ts
export * from './components/MetricCard';
export * from './components/Pill';
npm run build を実行すると、ViteはバンドルされたJavaScriptとCSSファイルを含む dist フォルダを作成し、npmまたはプライベートレジストリに公开发信する準備が整います。
結論
React、Storybook、Tailwind CSSでコンポーネントライブラリを作成するための現代的なフロントエンドプロジェクトを正常にセットアップしました。2つの essential ダッシュボードコンポーネントを構築し、Storybookで文書化し、本番環境での使用のためにライブラリをバンドルするようにプロジェクトを構成しました。
この基盤は驚くほど強力です。これで以下が可能になります:
- チャート、テーブル、ナビゲーション要素など、より複雑なコンポーネントでライブラリを擴大する
- Tailwindの構成を使用して色、フォント、スペーシングを簡単に変更できるテーマシステムを実装する
- ライブラリをnpmに公开发信して、組織全体で再利用可能なパッケージにする
コンポーネントライブラリの構築は、開発速度、一貫性、保守性において大きな配当をもたらす投資です。
参考资料
よくある質問
Q: これが自分に該当するかどうかはどのようにしてわかりますか? A: 個人の病歴と家族歴について医療提供者と相談し、個々のリスク因子を評価し、適切な次のステップを決定してください。
Q: 医師にどのような質問をするべきですか? A: 良い質問には次のようなものがあります:「結果は何を意味のですか?」「私のオプションは何ですか?」「どのような生活習慣の改善が役立ちますか?」「いつフォローアップする必要がありますか?」
Q: 役立つ可能性のある生活習慣の改善はありますか? A: ほとんどの健康状態は、基本的な対策から恩恵を受けます:バランスの取れた栄養、定期的な身体活動(週150分以上)、質の高い睡眠(7〜9時間)、ストレス管理,以及び禁煙です。
医療に関する免責事項
本文は教育目的のみを目的としており、医学的アドバイスを構成するものではありません。健康、治療、またはケアに関する決定する前に、常に資格のある医療提供者と相談してください。個人の状況は異なり、一个人に適切なものが別の人に適切でない場合があります。
緊急事態が発生した場合は、直ちに119(または最寄りの緊急番号)に連絡してください。