React
関数コンポーネントのみ
常に名前付きエクスポートの TSX 関数コンポーネントを使用してください。プロパティ
{ComponentName}Props という名前の型を作成する。 分割代入を使用する。 React.FC を使用しない。
単一変数によるプロップスのスプレッドは禁止
状態管理
グローバル状態には Jotai の atom を使用
- prop drilling よりも atom を優先する
- 状態管理に
useRefを使用しない —useStateまたは atom を使用する - リストには atom ファミリーとセレクターを使用する
不要な再レンダーを避ける
useEffectとデータ取得は同一階層のサイドカーコンポーネントに切り出すuseEffectよりもイベントハンドラー(handleClick、handleChange)を優先するReact.memo()は使用しない — 代わりに根本原因を修正するuseCallbackおよびuseMemoの使用を制限する
TypeScript
interfaceよりtype— より柔軟で、合成しやすい- enum より文字列リテラル — ただし GraphQL コード生成の enum と内部ライブラリ API は除く
anyは禁止 — 厳格な TypeScript を適用- 型インポートは禁止 — 通常のインポートを使用(Oxlint の
typescript/consistent-type-importsで強制) - Zod を使用して、型未定義オブジェクトを実行時に検証する
JavaScript
命名について
- 変数: camelCase、意味がわかる名前(
valueではなくemail、fmではなくfieldMetadata) - 定数: SCREAMING_SNAKE_CASE
- 型/クラス: PascalCase
- ファイル/ディレクトリ: kebab-case (
.component.tsx,.service.ts,.entity.ts) - イベントハンドラー:
handleClick(ハンドラー関数としてonClickは使用しない) - コンポーネントのプロップス: コンポーネント名を接頭辞に付ける(
ButtonProps) - スタイル付きコンポーネント:
Styledを接頭辞に付ける(StyledTitle)
スタイリング
Linaria の styled components を使用する。 テーマの値を使用し、px、rem、色のハードコードは避ける。
インポート
相対パスの代わりにエイリアスを使用する:フォルダ構成
- モジュールは他のモジュールからインポートしてよいが、
ui/は依存関係を持たない状態を保つこと。 - モジュール専用コードには
internal/サブフォルダを使用する。 - コンポーネントは 300 行未満、サービスは 500 行未満