fullstack-guide
npx machina-cli add skill VidyFoo/antigravity-skill-engine/fullstack-guide --openclawFiles (1)
SKILL.md
4.5 KB
Frontend Development Guidelines
Purpose
Comprehensive guide for modern React development, emphasizing Suspense-based data fetching, lazy loading, proper file organization, and performance optimization.
When to Use This Skill
- Creating new components or pages
- Building new features
- Fetching data with TanStack Query
- Setting up routing with TanStack Router
- Styling components with MUI v7
- Performance optimization
- Organizing frontend code
- TypeScript best practices
Quick Start
New Component Checklist
Creating a component? Follow this checklist:
- Use
React.FC<Props>pattern with TypeScript - Lazy load if heavy component:
React.lazy(() => import()) - Wrap in
<SuspenseLoader>for loading states - Use
useSuspenseQueryfor data fetching - Import aliases (@/, ~types, ~components)
- Event handlers with
useCallback - No early returns for loading states
Core Patterns
Component Pattern
import React, { useState, useCallback } from 'react';
import { Box, Paper } from '@mui/material';
import { useSuspenseQuery } from '@tanstack/react-query';
import { featureApi } from '../api/featureApi';
import type { FeatureData } from '~types/feature';
interface MyComponentProps {
id: number;
onAction?: () => void;
}
export const MyComponent: React.FC<MyComponentProps> = ({ id, onAction }) => {
const [state, setState] = useState<string>('');
const { data } = useSuspenseQuery({
queryKey: ['feature', id],
queryFn: () => featureApi.getFeature(id),
});
const handleAction = useCallback(() => {
setState('updated');
onAction?.();
}, [onAction]);
return (
<Box sx={{ p: 2 }}>
<Paper sx={{ p: 3 }}>
{/* Content */}
</Paper>
</Box>
);
};
export default MyComponent;
Data Fetching
// Use useSuspenseQuery - No isLoading checks needed!
const { data } = useSuspenseQuery({
queryKey: ['myEntity', id],
queryFn: () => myFeatureApi.getEntity(id),
});
// data is ALWAYS defined (Suspense handles loading)
Lazy Loading
// Lazy load heavy components
const HeavyComponent = React.lazy(() => import('./HeavyComponent'));
// Wrap in SuspenseLoader
<SuspenseLoader>
<HeavyComponent />
</SuspenseLoader>
Anti-Patterns
❌ NEVER
- Early returns for loading states (causes layout shift)
- Use
anytype - Use
makeStylesorstyled()(usesxprop) - Use
react-toastify(useuseMuiSnackbar) - Direct API calls for auth (use
useAuthhook)
✅ ALWAYS
React.FC<Props>with TypeScriptuseSuspenseQueryfor data fetching- Suspense boundaries for loading states
- MUI v7
sxprop for styling - Import type for type imports
File Organization
features/ Directory
For domain-specific features with own logic and API:
features/
my-feature/
api/
myFeatureApi.ts
components/
MyFeatureMain.tsx
hooks/
useMyFeature.ts
types/
index.ts
index.ts
components/ Directory
For truly reusable UI components:
components/
SuspenseLoader/
CustomAppBar/
ErrorBoundary/
Resource Files
| Topic | File |
|---|---|
| Common patterns | common-patterns.md |
| Component patterns | component-patterns.md |
| Data fetching | data-fetching.md |
| File organization | file-organization.md |
| Loading and errors | loading-and-error-states.md |
| Routing guide | routing-guide.md |
| Styling guide | styling-guide.md |
| TypeScript standards | typescript-standards.md |
Related Skills
- frontend-design: Visual design and aesthetics
- backend-dev-guidelines: Backend API patterns that frontend consumes
Skill Status: COMPLETE ✅ Line Count: < 500 ✅ Progressive Disclosure: 8 resource files ✅
Source
git clone https://github.com/VidyFoo/antigravity-skill-engine/blob/main/.agent/skills/1-dev/fullstack-guide/SKILL.mdView on GitHub Overview
这是一个覆盖 React/TS/Node/Supabase 的全栈开发规范百科,聚焦 Suspense 数据获取、懒加载、特征目录化的文件组织,以及性能优化。通过实际模式与示例,帮助在创建组件、页面、特征、获取数据、样式和路由,以及前后端协作中遵循最佳实践。
How This Skill Works
它通过核心模式如组件模式、数据获取和懒加载展示具体实现;使用 useSuspenseQuery 进行数据获取,React.lazy 和 SuspenseLoader 处理懒加载,采用 features/ 目录组织领域特征,并通过导入别名 (@/, ~types, ~components) 与 MUI 的 sx 风格实现高效前端结构。
When to Use It
- 创建新组件或页面
- 实现新特征或功能
- 进行数据获取(TanStack Query/useSuspenseQuery)
- 配置路由与样式(TanStack Router、MUI v7)
- 优化性能并整理前端代码
Quick Start
- Step 1: 使用 TypeScript 的 React.FC<Props 制作新组件
- Step 2: 如组件较重,使用 React.lazy 引入并用 SuspenseLoader 包裹
- Step 3: 用 useSuspenseQuery 获取数据并配置导入别名
Best Practices
- 使用 React.FC<Props> 与 TypeScript
- 对数据获取使用 useSuspenseQuery
- 为加载/错误使用 Suspense 边界
- 使用 MUI v7 的 sx 样式,避免 makeStyles
- 通过 import 路径别名(@/, ~types, ~components)导入并导入类型
Example Use Cases
- MyComponent: TS+React.FC,useSuspenseQuery 获取 feature 数据
- HeavyComponent: React.lazy 加载并用 SuspenseLoader 包裹
- Feature 目录结构:features/my-feature/ 组织 api、hooks、types
- 数据获取示例:useSuspenseQuery 的 queryKey 与 queryFn
- 样式示例:MUI v7 sx 用于布局与样式
Frequently Asked Questions
Add this skill to your agents