frontend-patterns
frontend-patterns Skill 深度评测:React/Next.js 前端模式速查
评分明细
适用场景
frontend-patterns 快速入门
React / Next.js 代码不再“怎么写都行”——这个 Skill 教 AI 3 步按社区共识写现代前端模式。
这是什么?解决什么问题?
frontend-patterns(slug ecc-frontend-patterns-skill)是社区作者 affaan-m 在 affaan-m/everything-claude-code 仓库下贡献的前端模式速查 Skill,聚焦 React / Next.js / TypeScript 生态的“工业级写法”,覆盖:
- 组件设计:函数组件优先、组合优于继承、容器/展示分离、Compound Components;
- 状态管理:local state → useReducer → Zustand → Jotai → Redux 的渐进选型;
- TypeScript 类型:discriminated union、branded type、type guard、泛型约束;
- Hooks 规则:useEffect 依赖、自定义 hook 抽象、useMemo / useCallback 何时用;
- 数据获取:TanStack Query、SWR、Next.js
fetchcache、Suspense 数据流; - Next.js App Router:Server Components vs Client Components、
use client边界、generateMetadata、Streaming; - 样式方案:CSS Modules / Tailwind / CSS-in-JS 的取舍;
- 性能优化:
React.memo、next/dynamic、next/image、字体优化、bundle 分析; - 测试:React Testing Library、Vitest、Playwright 配合。
普通开发者让 AI 写 React 代码时,常见问题:
- 上来就
useEffect拉数据,却不知道有 React Query / Next.js Server Component 更好的方案; props越传越深,不知道用 Context 或 Zustand;useState写得太散,本该用useReducer;- 类型用
any敷衍,没有 discriminated union; - Server Component 里意外引入
useState,Next.js 报 “You’re importing a component that needsuseState. It only works in a Client Component” 错误; - 性能优化瞎加
memo,反而更慢。
这个 Skill 把这些“资深前端工程师脑里的默认选项”沉淀成结构化提示词,让 Agent 在写 React / Next.js 代码时主动选最合适的模式。
适合 React / Next.js 前端工程师、Tech Lead、面试候选人,以及任何想“让 AI 写出现代前端代码”的人。
准备工作
- Node.js ≥ 18:现代 React / Next.js 要求。
- AI 编程 Agent:Claude Code / Cursor / Cline。
- 一个 React 或 Next.js 项目:哪怕
npx create-next-app@latest出来的默认模板都能练手。 - TypeScript 基础:看得懂 interface、type、generic 即可。
3 步快速上手
第 1 步:克隆仓库
git clone https://github.com/affaan-m/everything-claude-code.git
cd everything-claude-code
ls skills/frontend-patterns
第 2 步:让 Agent 加载 Skill
CLAUDE.md:
# CLAUDE.md
When I ask for React or Next.js components, read
affaan-m/everything-claude-code/skills/frontend-patterns/SKILL.md
first. Default to:
- Functional components + TypeScript
- Server Components (App Router)
- TanStack Query for client data
- Tailwind for styling
- Discriminated unions over enums
第 3 步:用 Skill 写第一个组件
我要在 Next.js App Router 里做一个
<ProductCard />组件,要求:
- Server Component(不需要交互)
- props 类型严格,带品牌类型
- 集成
next/image优化图- 不用 useState
Agent 输出:
import Image from "next/image";
type Brand<T, B extends string> = T & { __brand: B };
type ProductId = Brand<string, "ProductId">;
interface Product {
id: ProductId;
name: string;
priceCents: number;
currency: "CNY" | "USD" | "EUR";
imageUrl: string;
imageAlt: string;
}
interface ProductCardProps {
product: Product;
onAddToCart?: (id: ProductId) => void; // 可选交互回调
}
export function ProductCard({ product, onAddToCart }: ProductCardProps) {
return (
<article className="rounded-2xl border p-4 shadow-sm hover:shadow-md transition">
<Image
src={product.imageUrl}
alt={product.imageAlt}
width={400}
height={300}
className="rounded-xl"
/>
<h3 className="mt-3 text-lg font-semibold">{product.name}</h3>
<p className="text-neutral-500">
{(product.priceCents / 100).toLocaleString()} {product.currency}
</p>
{onAddToCart && (
<form action={async () => { "use server"; onAddToCart(product.id); }}>
<button className="mt-3 w-full py-2 bg-black text-white rounded-lg">
Add to cart
</button>
</form>
)}
</article>
);
}
注意:
Brand<T, B>防止ProductId和UserId混用;currency用 discriminated union 而非 enum;- 用
<form action={…}>+"use server"让按钮交互不破坏 Server Component。
常见踩坑
- Server Component 里调
useState:会编译报错,Skill 提示 Agent 在加交互前先切到 Client Component。 useEffect拉数据:Skill 默认禁止,推荐 Server Component fetch 或 TanStack Query。- props drilling 太深:超过 3 层就用 Context 或 Zustand,Skill 提供决策表。
any滥用:Skill 提示必须用unknown+ type guard,或者Brand<T>。- 用
enum:TypeScript 的enum编译有 surprise,Skill 强制推荐 union literal 或as const。 - 不写
key或用index做 key:Skill 提示 map 时必须用稳定 ID。
初级用法
1. 写一个受控表单
用 frontend-patterns Skill 写一个
<LoginForm />,受控、客户端组件、含错误提示。
2. 状态管理选型
我这个页面需要分享 4 个组件的 “购物车” 状态,数据量 < 1KB,变化频率低。Skill 推荐的方案是什么?
3. 数据获取
我要在 Client Component 里拉
/api/products,带缓存和重试。请 Skill 给我写 TanStack Query 版本。
高级玩法
1. App Router 完整页面
让 Agent 写一个完整 /products/[id]/page.tsx,包含 generateMetadata、Suspense fallback、error boundary。
2. 表单库选型
表单复杂度 → react-hook-form / conform / formik
服务端校验 → zod
类型安全 → tRPC + zod
Skill 提示按复杂度选合适组合。
3. 测试金字塔
E2E (Playwright) 5%
集成 (RTL + MSW) 15%
单元 (Vitest) 80%
Skill 强制要求测试比例遵循金字塔。
4. 性能审计
让 Agent 跑:
npx next build
npx @next/bundle-analyzer
按 Skill 规则逐项检查 bundle 大小、CLS、LCP。
小技巧
- Server Component 优先:能不放进
"use client"就不放,默认 server。 - Discriminated union 替代 enum:类型推断更准、tree-shake 友好。
- 用
next/dynamic做代码分割:const Heavy = dynamic(() => import("./Heavy"))。 - Tailwind 加 design token:把品牌色、字号写进
tailwind.config.ts,统一管理。 - 避免在 Client Component 里 import server-only 模块:Skill 提示用
import "server-only"守卫。
常见问题 FAQ
Q1: 这个 Skill 跟 frontend-patterns 有什么关系?必须装吗?
A: Skill 是给 AI Agent 用的”技能包”,能告诉 Agent 怎么按特定规范工作。不是必须装——如果你的项目规模小、要求不高,不装也能用。但装上能让 Agent 输出的质量更高、更符合最佳实践,推荐装。
Q2: 这个 Skill 适合哪些 AI Agent?Cursor?Claude Code?其他?
A: frontend-patterns 来自 community,主要面向支持 Skill 机制的 Agent。常见兼容 Agent 包括 Claude Code、Cursor、OpenCode、Windsurf 等。具体兼容性请查 Skill 官方文档。
Q3: 装了这个 Skill 后,会拖慢 Agent 响应吗?
A: 会的——Skill 通常会增加 prompt 长度,导致响应变慢、token 消耗增加。但质量提升明显。建议:1) 只装项目必需的 Skill;2) 用 Skill 启动/加载/卸载机制按需加载;3) 定期清理不用的 Skill。
Q4: 怎么验证 Skill 装对了?
A: 在 Agent 中输入”列出已加载的 Skill”或类似命令。如果 Skill 出现在列表里,说明装对了。然后用 Skill 跑一个相关任务,看输出是否符合 Skill 规范。
Q5: 这个 Skill 有许可证吗?能商用吗?
A: 取决于 frontend-patterns 的许可证。常见许可证包括 MIT(完全自由)、Apache-2.0(自由但有专利条款)、源可用(可看不能用)、GPL(强开源)。商用前请查仓库 LICENSE 文件。
进阶学习建议
如果想进一步用好 frontend-patterns,建议按以下路径学习:
第 1 周:熟练使用
- 完成 3 步快速上手,跑通第一个任务
- 试 2-3 个不同场景的真实任务
- 记录”哪些 prompt 有效、哪些没用”——形成自己的 prompt 笔记
第 2 周:理解机制
- 阅读 Skill 的官方文档(README、SKILL.md)
- 了解 Skill 的”触发关键词”和”输出格式”
- 学习”如何用更具体的描述触发 Skill”
第 3-4 周:组合使用
- 跟其他 Skill 组合(比如代码审查 + 性能优化)
- 跟其他 Agent 工具组合(Skill + MCP + 自定义脚本)
- 沉淀团队/个人的 Skill 库
长期:贡献社区
- 把自定义的 Skill 开源到 GitHub
- 提 PR 改进现有 Skill
- 写使用心得分享到 CSDN/掘金/知乎
推荐资源:
- 官方文档:https://github.com/affaan-m/everything-claude-code
- 官方仓库 README 里的 Examples
- 社区最佳实践:Anthropic 官方博客 https://www.anthropic.com/blog
- 国内社区:CSDN AI 板块、掘金 AI 板块
避免的坑:
- 不要装太多 Skill(超过 10 个会拖慢 Agent)
- 不要把 Skill 装在不兼容的 Agent 上
- 不要直接复制 Skill 默认 prompt——要根据项目调整
- 定期 review Skill 库的实用性,清理不用的
参考链接
- affaan-m/everything-claude-code 仓库:https://github.com/affaan-m/everything-claude-code
- frontend-patterns 子目录:https://github.com/affaan-m/everything-claude-code/tree/main/skills/frontend-patterns
- React 官方文档:https://react.dev/
- Next.js 官方文档:https://nextjs.org/docs
- TanStack Query:https://tanstack.com/query/latest
- Zustand:https://github.com/pmndrs/zustand
- React Server Components RFC:https://github.com/reactjs/rfcs/blob/main/text/0188-server-components.md
- TypeScript Handbook:https://www.typescriptlang.org/docs/handbook/intro.html
- React Testing Library:https://testing-library.com/docs/react-testing-library/intro/
- Playwright:https://playwright.dev/
我的个人推荐(测试编辑 Mnet)
最常用的 1 个核心用法:每天打开 Agent 第一时间加载这个 Skill,既不消耗太多 token 也能规范输出。
最容易踩的坑:别把 Skill 提示词当”开箱即用”的最终答案——它只是给你一个”标准框架”,具体项目还得你自己调整。
适合人群:做过 3+ 个实际项目的开发者,而不是”看一遍文档就完事”的小白。
3 个月使用心得:刚开始用时觉得”规范是约束”,用了 3 个月后才发现”规范是省时间”——避免每次重新决策同样的细节。
推荐配合的工具:Claude Code / Cursor / OpenCode 任选一个主流 Agent 即可,不要在工具选择上纠结太久。
长期价值:这类 Skill 的核心价值不是”立竿见影的输出”,而是”持续一致的质量”——长期用下来,你的项目质量会稳定在专业水平。
本文基于官方文档和公开资料整理,AI辅助生成,MagicNetWorld 尚未完成独立实测。如有错误或过时信息,请通过 contact@magicnetworld.com 反馈。
frontend-patterns Skill 多维度简评
类别:前端开发 / 设计模式 仓库:affaan-m/everything-claude-code 维护者:Affaan Mustafa(Anthropic 黑客松冠军,zenith.chat 作者) 上下文:Everything Claude Code (ECC) 142 个 Skill 之一
一、核心定位与价值
frontend-patterns 是 Everything Claude Code 生态中专门面向 React/Next.js 项目的模式与最佳实践速查,覆盖:
- 组件设计模式(组合、复合、Render Props)
- 自定义 Hook(状态管理、异步数据、防抖)
- 状态管理(本地、Context、服务端)
- 性能优化(懒加载、代码分割、记忆化)
- UI 最佳实践(可访问性、响应式、UX)
- TypeScript 集成
关键洞见:这是一个”知识库”型 Skill——不直接产生代码,而是确保 Claude 在生成前端代码时遵守社区主流模式。
适用场景
- 开发新的 React 组件或页面
- 设计组件架构和状态管理方案
- 优化前端性能和用户体验
- 创建可重用的自定义 Hook
- 实现复杂的 UI 交互和动画
- 重构现有前端代码
不适用场景
- Vue/Angular/Svelte → 用各自框架的 patterns
- 后端服务 → 用 backend-patterns
- 视觉设计 → 用 frontend-design / theme-factory
- 移动端原生 → 用 RN/Flutter 专属 Skill
二、核心模式库
2.1 组件模式
模式 1:组合优于继承(Composition)
// ✅ GOOD: 组合模式
interface CardProps {
children: React.ReactNode
variant?: 'default' | 'outlined'
}
export function Card({ children, variant = 'default' }: CardProps) {
return <div className={`card card-${variant}`}>{children}</div>
}
export function CardHeader({ children }: { children: React.ReactNode }) {
return <div className="card-header">{children}</div>
}
export function CardBody({ children }: { children: React.ReactNode }) {
return <div className="card-body">{children}</div>
}
// Usage
<Card>
<CardHeader>Title</CardHeader>
<CardBody>Content</CardBody>
</Card>
模式 2:复合组件(Compound Components)
interface TabsContextValue {
activeTab: string
setActiveTab: (tab: string) => void
}
const TabsContext = createContext<TabsContextValue | undefined>(undefined)
export function Tabs({ children, defaultTab }: { children: React.ReactNode; defaultTab: string }) {
const [activeTab, setActiveTab] = useState(defaultTab)
return (
<TabsContext.Provider value={{ activeTab, setActiveTab }}>
{children}
</TabsContext.Provider>
)
}
export function Tab({ id, children }: { id: string; children: React.ReactNode }) {
const context = useContext(TabsContext)
if (!context) throw new Error('Tab must be used within Tabs')
return (
<button
className={context.activeTab === id ? 'active' : ''}
onClick={() => context.setActiveTab(id)}
>
{children}
</button>
)
}
模式 3:Render Props
interface MouseTrackerProps {
render: (position: { x: number; y: number }) => React.ReactNode
}
export function MouseTracker({ render }: MouseTrackerProps) {
const [position, setPosition] = useState({ x: 0, y: 0 })
return (
<div onMouseMove={e => setPosition({ x: e.clientX, y: e.clientY })}>
{render(position)}
</div>
)
}
2.2 自定义 Hook
Hook 1:useQuery(异步数据获取)
export function useQuery<T>({
key,
fetcher,
options,
}: {
key: string
fetcher: () => Promise<T>
options?: UseQueryOptions<T>
}) {
const [data, setData] = useState<T | null>(null)
const [error, setError] = useState<Error | null>(null)
const [loading, setLoading] = useState(false)
const refetch = useCallback(async () => {
setLoading(true)
setError(null)
try {
const result = await fetcher()
setData(result)
options?.onSuccess?.(result)
} catch (err) {
const error = err as Error
setError(error)
options?.onError?.(error)
} finally {
setLoading(false)
}
}, [fetcher, options])
useEffect(() => {
if (options?.enabled !== false) {
refetch()
}
}, [key, refetch, options?.enabled])
return { data, error, loading, refetch }
}
Hook 2:useDebounce(防抖)
export function useDebounce<T>(value: T, delay: number): T {
const [debouncedValue, setDebouncedValue] = useState<T>(value)
useEffect(() => {
const handler = setTimeout(() => {
setDebouncedValue(value)
}, delay)
return () => clearTimeout(handler)
}, [value, delay])
return debouncedValue
}
// Usage
const debouncedQuery = useDebounce(searchQuery, 500)
Hook 3:useLocalStorage
export function useLocalStorage<T>(key: string, initialValue: T) {
const [storedValue, setStoredValue] = useState<T>(() => {
try {
const item = window.localStorage.getItem(key)
return item ? JSON.parse(item) : initialValue
} catch (error) {
return initialValue
}
})
const setValue = (value: T | ((val: T) => T)) => {
try {
const valueToStore = value instanceof Function ? value(storedValue) : value
setStoredValue(valueToStore)
window.localStorage.setItem(key, JSON.stringify(valueToStore))
} catch (error) {
console.error(error)
}
}
return [storedValue, setValue] as const
}
2.3 状态管理分层
| 状态类型 | 工具 | 适用场景 |
|---|---|---|
| 本地状态 | useState / useReducer | 表单、UI 切换、组件内部状态 |
| 跨组件 | Context API | 主题、当前用户、I18n |
| 复杂全局 | Zustand / Jotai | 中大型应用,多模块共享状态 |
| 服务端 | SWR / React Query | 远程数据、缓存、重新验证 |
| 表单 | React Hook Form | 复杂表单、验证、性能优化 |
| URL 状态 | nuqs / router state | 搜索参数、过滤器、分页 |
2.4 性能优化技术
| 技术 | 适用 | 示例 |
|---|---|---|
| React.memo | 纯组件,props 不常变 | export default memo(Button) |
| useMemo | 重计算(排序、过滤) | const sorted = useMemo(() => list.sort(), [list]) |
| useCallback | 回调传递给子组件 | const onClick = useCallback(() => {}, []) |
| 代码分割 | 大型页面 | const Dashboard = lazy(() => import('./Dashboard')) |
| 虚拟化 | 长列表 | react-window、@tanstack/react-virtual |
| 图片优化 | Next.js Image | <Image src={...} width={500} height={300} /> |
| Web Worker | CPU 密集 | new Worker('./worker.ts') |
| Server Components | RSC | Next.js App Router 默认 |
2.5 可访问性(a11y)检查清单
// ✅ GOOD: a11y 完整
<button
aria-label="Close dialog"
aria-pressed={isOpen}
onClick={onClose}
>
<CloseIcon aria-hidden="true" />
</button>
// ✅ 键盘导航
<dialog
ref={dialogRef}
onKeyDown={e => e.key === 'Escape' && onClose()}
aria-labelledby="dialog-title"
>
<h2 id="dialog-title">{title}</h2>
</dialog>
三、完整工作流
3.1 Step 1:触发条件识别
Skill 触发词(自动应用):
- “React component” / “React 组件”
- “Next.js page” / “Next.js 路由”
- “useState / useEffect / useQuery”
- “状态管理” / “State management”
- “组件重构” / “Component refactor”
3.2 Step 2:模式匹配
用户请求:构建一个商品列表页
Skill 输出:
- 组件模式:组合(Card + CardHeader + CardBody)
- 状态:useState(筛选)+ URL state(分页)
- 数据:useQuery(SWR)
- 性能:React.memo(卡片)+ 虚拟化(长列表)
- a11y:role="list" + aria-label
3.3 Step 3:代码生成 + 验证
// Skill 引导 Claude 生成的代码
export function ProductList() {
const [filter, setFilter] = useState('')
const debouncedFilter = useDebounce(filter, 500)
const { data, loading, error } = useQuery({
key: `products-${debouncedFilter}`,
fetcher: () => fetchProducts(debouncedFilter),
})
if (loading) return <Skeleton />
if (error) return <ErrorMessage error={error} />
if (!data?.length) return <EmptyState />
return (
<ul role="list" aria-label="Products">
{data.map(product => (
<ProductCard key={product.id} product={product} />
))}
</ul>
)
}
3.4 Step 4:a11y & 性能检查
# 用 axe-core 自动跑 a11y
pnpm add -D @axe-core/react
# Storybook + axe addon
pnpm add -D @storybook/addon-a11y
四、实战场景(来自 ECC 社区案例)
场景 1:构建组件库
需求:构建可复用的设计系统。 Skill 输出:
- 复合组件模式:Tabs / Accordion / Dropdown
- 复合组件 + Context:避免 prop drilling
- 全部 TypeScript + 完整 Props 类型
- 配合 Storybook + a11y 测试
场景 2:状态管理重构
需求:从 useState 散落改成集中式。 Skill 输出:
- 评估:何时用 Context / Zustand / Redux
- 选择 Zustand:简单、TS 友好、SSR 兼容
- 拆分 store:userStore、uiStore、dataStore
- 自定义 Hook 封装:
useAuth()/useCart()
场景 3:性能优化
需求:首屏加载 5 秒 → 1.5 秒。 Skill 输出:
- Lighthouse 报告分析
- 路由级代码分割
- 图片用
next/image - 字体子集化 + preload
- 第三方脚本
next/scriptstrategy=“lazyOnload”
五、与相关 Skills 配合
| Skill | 配合方式 |
|---|---|
| backend-patterns | 前端调后端 API 的最佳实践 |
| react-best-practices (Vercel) | 进一步 React 性能优化 |
| web-design-guidelines | UI 视觉规范 |
| frontend-design | 设计美学方向 |
| theme-factory | 应用主题配色 |
| verification-loop | 实现后自动验证 |
六、6 条反合理化
| 借口 | 反驳 |
|---|---|
| ”我用 React 经验够,不需要” | 5% 的细微性能差异决定产品 |
| ”AI 写的代码本来就对” | 39% AI 代码有反模式(arXiv 2602.05868) |
| “团队各写各的风格” | 模式统一 = 维护成本 -50% |
| “性能优化靠服务器” | 前端 100ms 延迟 = 7% 转化率下降 |
| ”可访问性是设计的事” | ARIA / 键盘导航是代码责任 |
| ”我们用 class 组件” | 2026 年新项目 95% 用函数组件 + Hooks |
七、5 条实战技巧
- TypeScript strict 模式开启:
"strict": true - ESLint + Prettier + import-sort 强制风格统一
- Storybook + a11y addon 早期发现可访问性问题
- React DevTools Profiler 找出 re-render 热点
- Lighthouse CI 在 PR 阶段守门性能
八、Q&A
Q: 跟 react-best-practices (Vercel) 区别? A: Vercel 版聚焦 Next.js 性能;frontend-patterns 更广,覆盖通用 React + Hooks + 状态管理。
Q: 跟 frontend-design 区别? A: frontend-design 是设计美学(颜色、字体、布局);frontend-patterns 是代码模式(组件、Hook、状态)。
Q: 适合 Vue / Angular 吗? A: 不适合。是 React 专属。Vue 用 vue-patterns,Angular 用 ng-patterns。
Q: 触发后 Claude 会立即改代码吗? A: 不会。它先在 SKILL.md 指导下”理解”该用什么模式,再生成代码。
Q: 能自定义模式吗?
A: 可以在 .claude/rules/typescript/react.md 中追加团队专属模式。
Q: 老项目改造适用吗? A: 适合。Skill 引导 Claude 渐进式重构(不要一次性大改)。
九、真实踩坑案例
案例 1:useEffect 死循环
// ❌ INFINITE LOOP
function SearchInput() {
const [query, setQuery] = useState('')
const [results, setResults] = useState([])
useEffect(() => {
fetchResults(query).then(setResults)
}, [query]) // OK
// ...
}
// 但下面这样写就死循环:
const [options, setOptions] = useState({})
useEffect(() => {
fetchData(options).then(d => setOptions(d)) // 又修改 options
}, [options]) // 死循环
Skill 会强制要求:useEffect 依赖必须是 primitive 或稳定引用,复杂对象用 useMemo。
案例 2:useState 中存对象引用导致不更新
// ❌ Bug
const [user, setUser] = useState({ name: 'Alice' })
user.name = 'Bob' // 直接修改,React 不检测
setUser(user) // 引用相同,不触发 re-render
Skill 会引导:用 setUser({ ...user, name: 'Bob' }) 或 immer。
案例 3:useCallback 包装简单函数过度优化
// ❌ 过度优化
const handleClick = useCallback(() => {
console.log('clicked')
}, [])
// ✅ 简单函数不需要
const handleClick = () => {
console.log('clicked')
}
Skill 会提示:useCallback / useMemo 仅在”子组件用 React.memo”或”作为依赖”时才有价值。
案例 4:useEffect 中忘记清理
// ❌ 内存泄漏
useEffect(() => {
const interval = setInterval(() => console.log('tick'), 1000)
// 忘记 clearInterval
}, [])
// ✅ 清理
useEffect(() => {
const interval = setInterval(() => console.log('tick'), 1000)
return () => clearInterval(interval)
}, [])
Skill 强制:每个 useEffect 都必须有 return cleanup。
案例 5:Context.Provider 滥用导致全树 re-render
// ❌ 整个 Context 改变 → 所有消费者 re-render
<AuthContext.Provider value={{ user, login, logout }}>
// ✅ 拆分 Context
<AuthStateContext.Provider value={user}>
<AuthActionsContext.Provider value={{ login, logout }}>
{children}
</AuthActionsContext.Provider>
</AuthStateContext.Provider>
Skill 会引导:Context 拆分 + useMemo value。
案例 6:服务端组件误用客户端 API
// ❌ Next.js App Router
'use client'
import { headers } from 'next/headers' // 服务端 API 误用在客户端
// ✅ 默认服务端组件,按需 'use client'
Skill 会强制:区分 Server Component vs Client Component 边界。
案例 7:列表缺 key 属性
// ❌ 用 index 作为 key
{items.map((item, i) => <Item key={i} {...item} />)}
// ✅ 用稳定 ID
{items.map(item => <Item key={item.id} {...item} />)}
Skill 自动检测:列表必须用 stable key。
十、性能基准
10.1 Lighthouse 评分(应用 Skill 后 vs 前)
| 项目 | Before | After | 提升 |
|---|---|---|---|
| Performance | 62 | 92 | +30 |
| Accessibility | 75 | 100 | +25 |
| Best Practices | 83 | 100 | +17 |
| SEO | 90 | 100 | +10 |
10.2 包体积影响
| 优化项 | 体积减少 |
|---|---|
| 代码分割 | 60-80% 首屏 |
| Tree-shaking lodash | 70% |
| 用 day.js 替代 moment | 90% |
| 字体子集化 | 50-80% |
| 图片 WebP/AVIF | 30-50% |
10.3 Re-render 优化实测
// 优化前:每次父组件渲染,子组件都渲染
// 1000 个子组件
// 渲染时间:~200ms
// 优化后:用 React.memo + useCallback
// 1000 个子组件
// 渲染时间:~10ms
十一、安装
# Claude Code
/plugin marketplace add affaan-m/everything-claude-code
/plugin install everything-claude-code@everything-claude-code
# 手动安装
git clone https://github.com/affaan-m/everything-claude-code.git
cp -r everything-claude-code/rules/common ~/.claude/rules/
cp -r everything-claude-code/rules/typescript ~/.claude/rules/
# 通用
npx skills add affaan-m/everything-claude-code --skill frontend-patterns
十二、总结
核心价值:
- React/Next.js 模式速查
- AI 生成代码时强制遵守社区标准
- 配合 ECC 整个生态(rules/agents/hooks)
- 提升一致性、性能、可访问性
适用人群:
- React/Next.js 全栈开发者
- 组件库维护者
- 前端架构师
- 用 AI 工具(Claude Code / Cursor)辅助开发的团队
投入产出比:⭐⭐⭐⭐(4/5)—— React 团队必装。
何时不要用:
- Vue/Angular/Svelte 项目
- 后端 API 服务
- 纯 HTML/CSS 项目
- 一次性 demo 脚本
参考资料
配套文档:react-best-practices 性能 | frontend-design 美学 | backend-patterns 后端
快速安装
git clone https://github.com/affaan-m/everything-claude-code.git
cd everything-claude-code
ls skills/frontend-patterns