performance-optimization
3
总安装量
2
周安装量
#61946
全站排名
安装命令
npx skills add https://github.com/dseirz-rgb/worker --skill performance-optimization
Agent 安装分布
opencode
2
gemini-cli
2
antigravity
2
claude-code
2
github-copilot
2
codex
2
Skill 文档
Performance Optimization (æ§è½ä¼åå¸)
â¡ æ ¸å¿ç念: æ§è½ä¼åè¦ææ°æ®æ¯æï¼å æµéåä¼åï¼é¿å è¿æ©ä¼åã
ð´ 第ä¸ååï¼æµéä¼å
ä¸è¦åæè§ä¼åï¼ç¨æ°æ®è¯´è¯ï¼
â é误æè·¯: "è¿ä¸ªç»ä»¶çèµ·æ¥æ
¢ï¼å 个 memo å§"
â
æ£ç¡®æè·¯: "ç¨ Profiler æµéååç°è¿ä¸ªç»ä»¶é渲æ 50 次ï¼éè¦ä¼å"
â é误æè·¯: "æ°æ®åºæ¥è¯¢åºè¯¥å ç´¢å¼"
â
æ£ç¡®æè·¯: "EXPLAIN åææ¾ç¤ºå
¨è¡¨æ«æï¼éè¦å¨ user_id åå ç´¢å¼"
ä¼åä¼å 级: æ¶æé®é¢ > ç®æ³é®é¢ > 代ç é®é¢ > å¾®ä¼å
When to Use This Skill
ä½¿ç¨æ¤æè½å½ä½ éå°ï¼
- 页é¢é¦æ¬¡å è½½æ¶é´è¿é¿ (>3s)
- ç»ä»¶äº¤äºååºè¿é (>100ms)
- API ååºæ¶é´è¿é¿ (>500ms)
- æ°æ®åºæ¥è¯¢è¶ æ¶ææ ¢æ¥è¯¢
- å åå ç¨æç»å¢é¿
- ç¨æ·å馔å¡é¡¿”ã”æ ¢”
Not For / Boundaries
æ¤æè½ä¸éç¨äºï¼
- åè½å°æªå®æç代ç ï¼å 宿åä¼åï¼
- æ²¡ææ§è½é®é¢ç代ç ï¼é¿å è¿æ©ä¼åï¼
- 䏿¬¡æ§èæ¬æå·¥å ·ï¼æå ¥äº§åºæ¯ä½ï¼
Quick Reference
ð¯ æ§è½è¯æå·¥ä½æµ
é®é¢æ¥å â å¤ç°é®é¢ â æµéåºå â å®ä½ç¶é¢ â 宿½ä¼å â éªè¯ææ
â
æ æ³å¤ç° â æ¶éæ´å¤ä¿¡æ¯ï¼ç¯å¢ãæ°æ®éãæä½æ¥éª¤ï¼
ð æ§è½è¯ææ¸ å
å端æ§è½æ£æ¥
| æ£æ¥é¡¹ | å·¥å · | åæ ¼æ å |
|---|---|---|
| 馿¬¡å 容ç»å¶ (FCP) | Lighthouse | <1.8s |
| æå¤§å 容ç»å¶ (LCP) | Lighthouse | <2.5s |
| 馿¬¡è¾å ¥å»¶è¿ (FID) | Lighthouse | <100ms |
| 累积å¸å±åç§» (CLS) | Lighthouse | <0.1 |
| ç»ä»¶éæ¸²ææ¬¡æ° | React DevTools | æ ä¸å¿ è¦æ¸²æ |
| Bundle å¤§å° | webpack-bundle-analyzer | <200KB (gzip) |
| å¾çä¼å | Lighthouse | ä½¿ç¨ WebP/AVIF |
API æ§è½æ£æ¥
| æ£æ¥é¡¹ | å·¥å · | åæ ¼æ å |
|---|---|---|
| ååºæ¶é´ (P50) | çæ§ç³»ç» | <200ms |
| ååºæ¶é´ (P99) | çæ§ç³»ç» | <1000ms |
| ååºä½å¤§å° | Network Tab | <100KB |
| è¯·æ±æ°é | Network Tab | é¦å± <20 个 |
| ç¼åå½ä¸ç | çæ§ç³»ç» | >80% |
æ°æ®åºæ§è½æ£æ¥
| æ£æ¥é¡¹ | å·¥å · | åæ ¼æ å |
|---|---|---|
| æ¥è¯¢æ¶é´ | EXPLAIN ANALYZE | <100ms |
| æ«æè¡æ° | EXPLAIN | 使ç¨ç´¢å¼ |
| è¿æ¥æ° | æ°æ®åºçæ§ | <80% æå¤§è¿æ¥ |
| æ ¢æ¥è¯¢æ°é | æ ¢æ¥è¯¢æ¥å¿ | 0 |
ð§ å¸¸è§æ§è½é®é¢éæ¥
| çç¶ | å¯è½åå | è§£å³æ¹æ¡ |
|---|---|---|
| 页é¢ç½å±æ¶é´é¿ | Bundle è¿å¤§ | 代ç åå²ãæå è½½ |
| æ»å¨å¡é¡¿ | å表æªèæå | ä½¿ç¨ react-window |
| è¾å ¥å»¶è¿ | é¢ç¹é渲æ | useMemo/useCallback |
| API æ ¢ | N+1 æ¥è¯¢ | æ¹éæ¥è¯¢ãDataLoader |
| æ°æ®åºæ ¢ | 缺å°ç´¢å¼ | æ·»å å¤åç´¢å¼ |
| å åæ³æ¼ | æªæ¸ ç订é | useEffect cleanup |
æ§è½ä¼å工使µ
Phase 1: é®é¢å®ä½
# 1. å端æ§è½åæ
# ä½¿ç¨ Chrome DevTools Performance 颿¿å½å¶
# ä½¿ç¨ React DevTools Profiler åæç»ä»¶
# 2. API æ§è½åæ
# ä½¿ç¨ Network 颿¿æ¥ç请æ±çå¸å¾
# æ£æ¥ååºæ¶é´åååºä½å¤§å°
# 3. æ°æ®åºæ§è½åæ
# ä½¿ç¨ EXPLAIN ANALYZE åææ¥è¯¢è®¡å
EXPLAIN ANALYZE SELECT * FROM users WHERE email = 'test@example.com';
Phase 2: åºåæµé
// å端æ§è½æµé
import { Profiler } from 'react';
function onRenderCallback(
id: string,
phase: 'mount' | 'update',
actualDuration: number,
baseDuration: number,
) {
console.log(`${id} ${phase}: ${actualDuration.toFixed(2)}ms`);
}
<Profiler id="MyComponent" onRender={onRenderCallback}>
<MyComponent />
</Profiler>
// API æ§è½æµé
const start = performance.now();
const response = await fetch('/api/data');
const duration = performance.now() - start;
console.log(`API ååºæ¶é´: ${duration.toFixed(2)}ms`);
Phase 3: 宿½ä¼å
æ ¹æ®å®ä½çé®é¢ç±»åï¼åè对åºçä¼åæåï¼
- React ç»ä»¶ä¼å â
references/react-patterns.md - API ååºä¼å â
references/api-optimization.md - æ°æ®åºæ¥è¯¢ä¼å â
references/query-optimization.md
Phase 4: ææéªè¯
# 1. 对æ¯ä¼åååçææ
# 2. ä½¿ç¨ Playwright è¿è¡æ§è½å彿µè¯
# 3. çæ§ç产ç¯å¢ææ åå
Examples
Example 1: å表渲æå¡é¡¿
Input: “ç¨æ·åè¡¨é¡µé¢æ»å¨æ¶å¾å¡ï¼æ 1000+ æ¡æ°æ®”
è¯æ:
- æå¼ React DevTools Profiler
- åç°æ¯æ¬¡æ»å¨é½éæ¸²æææå表项
- é®é¢ï¼æªä½¿ç¨èæå表
è§£å³æ¹æ¡:
pnpm add @tanstack/react-virtual
import { useVirtualizer } from '@tanstack/react-virtual';
function UserList({ users }: { users: User[] }) {
const parentRef = useRef<HTMLDivElement>(null);
const virtualizer = useVirtualizer({
count: users.length,
getScrollElement: () => parentRef.current,
estimateSize: () => 50,
});
return (
<div ref={parentRef} style={{ height: '400px', overflow: 'auto' }}>
<div style={{ height: `${virtualizer.getTotalSize()}px`, position: 'relative' }}>
{virtualizer.getVirtualItems().map((virtualItem) => (
<div
key={virtualItem.key}
style={{
position: 'absolute',
top: 0,
transform: `translateY(${virtualItem.start}px)`,
}}
>
<UserCard user={users[virtualItem.index]} />
</div>
))}
</div>
</div>
);
}
Example 2: API ååºæ ¢
Input: “è·åç¨æ·è¯¦æ ç API ååºéè¦ 2 ç§”
è¯æ:
- æ£æ¥ API æ¥å¿ï¼åç°å¤æ¬¡æ°æ®åºæ¥è¯¢
- é®é¢ï¼N+1 æ¥è¯¢ï¼è·åç¨æ·åï¼é个è·åå ³èæ°æ®ï¼
è§£å³æ¹æ¡:
// â ä¼ååï¼N+1 æ¥è¯¢
const users = await db.select().from(usersTable);
for (const user of users) {
user.posts = await db.select().from(postsTable).where(eq(postsTable.userId, user.id));
}
// â
ä¼ååï¼JOIN æ¥è¯¢
const usersWithPosts = await db
.select()
.from(usersTable)
.leftJoin(postsTable, eq(usersTable.id, postsTable.userId));
Example 3: ç»ä»¶é¢ç¹é渲æ
Input: “è¾å ¥æ¡æåæ¶æ´ä¸ªè¡¨åé½å¨éªç”
è¯æ:
- React DevTools æ¾ç¤ºç¶ç»ä»¶æ¯æ¬¡è¾å ¥é½é渲æ
- é®é¢ï¼ç¶ææåè¿é«ï¼å¯¼è´æ å ³ç»ä»¶é渲æ
è§£å³æ¹æ¡:
// â ä¼ååï¼ç¶æå¨ç¶ç»ä»¶
function Form() {
const [name, setName] = useState('');
const [email, setEmail] = useState('');
return (
<div>
<NameInput value={name} onChange={setName} />
<EmailInput value={email} onChange={setEmail} />
<ExpensiveComponent /> {/* æ¯æ¬¡è¾å
¥é½é渲æ */}
</div>
);
}
// â
ä¼ååï¼ç¶æä¸æ² + memo
const ExpensiveComponent = memo(function ExpensiveComponent() {
// ...
});
function NameInput() {
const [name, setName] = useState(''); // ç¶æä¸æ²å°åç»ä»¶
return <input value={name} onChange={(e) => setName(e.target.value)} />;
}
References
references/index.md: 导èªç´¢å¼references/react-patterns.md: React æ§è½ä¼å模å¼references/api-optimization.md: API ååºä¼åçç¥references/query-optimization.md: Drizzle ORM æ¥è¯¢ä¼å
Maintenance
- Sources: React 宿¹ææ¡£, Web Vitals, Drizzle ORM ææ¡£
- Last Updated: 2025-01-01
- Known Limits:
- æ§è½æ åå 项ç®èå¼ï¼éæ ¹æ®å®é æ åµè°æ´
- æäºä¼åå¯è½å¢å 代ç å¤æåº¦ï¼éæè¡¡