mcpField
S
senior-frontend

senior-frontend

github.com/composio-community開発2.0k1.7k 回インストール14 週間前に更新
リポジトリ

senior-frontend について

senior-frontendは、ReactとNext.jsアプリの開発・最適化を支援するスキルです。プロジェクトのひな形作成、コンポーネント生成、バンドル分析、フロントエンドのパターンを扱います。

主な機能

  1. 01Next.jsとReactのプロジェクトひな形作成
  2. 02TypeScriptとTailwind CSSの設定
  3. 03コンポーネント、テスト、Storybookの生成
  4. 04バンドル最適化の分析
  5. 05ReactとNext.jsの実装パターン
  6. 06アクセシビリティのガイド

活用シーン

  1. 01ReactまたはNext.jsプロジェクトの開始
  2. 02テスト付きコンポーネントやフックの生成
  3. 03バンドルを縮小できる依存関係の特定
  4. 04フロントエンドコードのアクセシビリティ確認

インストール

コマンドをコピーしてターミナルで実行します。

$npx skills add https://github.com/composio-community/awesome-claude-plugins --skill senior-frontend

インストール後、Claude Code で/senior-frontendを入力して読み込まれたか確認します。

詳細

シニアフロントエンド

React/Next.js アプリケーション向けのフロントエンド開発パターン、パフォーマンス最適化、自動化ツールです。

プロジェクトのスキャフォールディング

TypeScript、Tailwind CSS、ベストプラクティスに基づく設定を備えた、新しい Next.js または React プロジェクトを生成します。

スキャフォールダーのオプション
オプション説明
--template nextjsApp Router と Server Components を備えた Next.js 14 以降
--template reactTypeScript を使用した React + Vite
--features authNextAuth.js による認証を追加
--features apiReact Query + API クライアントを追加
--features formsReact Hook Form + Zod によるバリデーションを追加
--features testingVitest + Testing Library を追加
生成される構成(Next.js)
my-app/
├── app/
│   ├── layout.tsx        # Root layout with fonts
│   ├── page.tsx          # Home page
│   ├── globals.css       # Tailwind + CSS variables
│   └── api/health/route.ts
├── components/
│   ├── ui/               # Button, Input, Card
│   └── layout/           # Header, Footer, Sidebar
├── hooks/                # useDebounce, useLocalStorage
├── lib/                  # utils (cn), constants
├── types/                # TypeScript interfaces
├── tailwind.config.ts
├── next.config.js
└── package.json

コンポーネントの生成

TypeScript、テスト、Storybook のストーリーを含む React コンポーネントを生成します。

ジェネレーターのオプション
オプション説明
--type client'use client' を指定したクライアントコンポーネント(デフォルト)
--type server非同期のサーバーコンポーネント
--type hookカスタム React フック
--with-testテストファイルを含める
--with-storyStorybook のストーリーを含める

バンドル分析

package.json とプロジェクト構成を分析し、バンドルを最適化できる箇所を特定します。

置き換えを検討する大きな依存関係
パッケージサイズ代替
moment290KBdate-fns(12KB)または dayjs(2KB)
lodash71KBツリーシェイキングに対応した lodash-es
axios14KBネイティブの fetch または ky(3KB)
jquery87KBネイティブの DOM API
@mui/material大きいshadcn/ui または Radix UI

React のパターン

複合コンポーネント
const Tabs = ({ children }) => {
  const [active, setActive] = useState(0);
  return (
    <TabsContext.Provider value={{ active, setActive }}>
      {children}
    </TabsContext.Provider>
  );
};

Tabs.List = TabList;
Tabs.Panel = TabPanel;
カスタムフック
function useDebounce<T>(value: T, delay = 500): T {
  const [debouncedValue, setDebouncedValue] = useState(value);

  useEffect(() => {
    const timer = setTimeout(() => setDebouncedValue(value), delay);
    return () => clearTimeout(timer);
  }, [value, delay]);

  return debouncedValue;
}

Next.js の最適化

サーバーコンポーネントとクライアントコンポーネント

デフォルトではサーバーコンポーネントを使用します。以下が必要な場合に限り、'use client' を追加します。

  • イベントハンドラー(onClick、onChange)
  • 状態(useState、useReducer)
  • エフェクト(useEffect)
  • ブラウザー API
画像の最適化
import Image from 'next/image';

// Above the fold - load immediately
<Image
  src="/hero.jpg"
  alt="Hero"
  width={1200}
  height={600}
  priority
/>

// Responsive image with fill
<div className="relative aspect-video">
  <Image
    src="/product.jpg"
    alt="Product"
    fill
    sizes="(max-width: 768px) 100vw, 50vw"
    className="object-cover"
  />
</div>

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

  1. セマンティック HTML:適切な要素(<button>、<nav>、<main>)を使用する
  2. キーボード操作:すべてのインタラクティブ要素にフォーカスできるようにする
  3. ARIA ラベル:アイコンや複雑なウィジェットにラベルを設定する
  4. 色のコントラスト:通常のテキストでは最低 4.5:1 を確保する
  5. フォーカスインジケーター:フォーカス状態を視認できるようにする
// Accessible button
<button
  type="button"
  aria-label="Close dialog"
  onClick={onClose}
  className="focus-visible:ring-2 focus-visible:ring-blue-500"
>
  <XIcon aria-hidden="true" />
</button>

クイックリファレンス

Tailwind CSS ユーティリティ
import { cn } from '@/lib/utils';

<button className={cn(
  'px-4 py-2 rounded',
  variant === 'primary' && 'bg-blue-500 text-white',
  disabled && 'opacity-50 cursor-not-allowed'
)} />
TypeScript のパターン
// Props with children
interface CardProps {
  className?: string;
  children: React.ReactNode;
}

// Generic component
interface ListProps<T> {
  items: T[];
  renderItem: (item: T) => React.ReactNode;
}

function List<T>({ items, renderItem }: ListProps<T>) {
  return <ul>{items.map(renderItem)}</ul>;
}

コメント