Install
npx skillscat add geckou/project-starter/new-component Install via the SkillsCat registry.
SKILL.md
new-component
apps/web/src/components/ 配下に React コンポーネントを作成する。
手順
- ユーザーにコンポーネント名と用途を確認する
apps/web/src/components/にファイルを作成する- ネストが必要な場合はディレクトリを作る(例:
components/dashboard/StatsCard.tsx)。
Button / Modal 等の汎用 UI は@geckou/ui-reactから取るので新規作成しない
- ネストが必要な場合はディレクトリを作る(例:
- Server Component か Client Component かをユーザーに確認する
- イベントハンドラ・useState・useEffect がある → Client Component
- データ取得のみ → Server Component
テンプレート
Server Component
import type { ReactNode } from 'react'
type Props = {
children?: ReactNode
}
// 分割代入を空にすると no-empty-pattern で lint エラーになる。
// 受け取る props が無いうちは props をまとめて受けるか、children を置く
export function ComponentName({ children }: Props) {
return <div>{children}</div>
}Client Component
'use client'
import type { ReactNode } from 'react'
type Props = {
children?: ReactNode
}
// 分割代入を空にすると no-empty-pattern で lint エラーになる。
// 受け取る props が無いうちは props をまとめて受けるか、children を置く
export function ComponentName({ children }: Props) {
return <div>{children}</div>
}ルール
- named export を使う(default export は page.tsx のみ)
- シングルクォートを使う
- Tailwind CSS のクラスでスタイリングする
- セマンティックな HTML を意識する(
divの乱用を避ける) - Props の型は同ファイル内に
typeで定義する(interfaceは使わない) - 大きくなったら
@geckou/shared/typesに型を移動する - ファイル名・コンポーネント名はパスカルケース(例:
UserProfile.tsx) - アイコンは汎用なものを
@geckou/ui-reactから取る。プロジェクト固有のアイコンだけcomponents/icons/に配置する - 同じ要素を繰り返し使う場合は積極的にコンポーネント化する
- 略語は避ける(
btn→button,msg→message) - 変数は
constを使う。配列は複数形にする(users,items)