@kood/claude-code 0.4.0 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +53 -7
- package/package.json +2 -1
- package/templates/.claude/PARALLEL_AGENTS.md +737 -0
- package/templates/.claude/agents/analyst.md +416 -0
- package/templates/.claude/agents/architect.md +569 -0
- package/templates/.claude/agents/code-reviewer.md +132 -133
- package/templates/.claude/agents/dependency-manager.md +93 -94
- package/templates/.claude/agents/deployment-validator.md +64 -65
- package/templates/.claude/agents/designer.md +655 -0
- package/templates/.claude/agents/document-writer.md +500 -0
- package/templates/.claude/agents/explore.md +499 -0
- package/templates/.claude/agents/git-operator.md +74 -75
- package/templates/.claude/agents/implementation-executor.md +138 -109
- package/templates/.claude/agents/ko-to-en-translator.md +18 -22
- package/templates/.claude/agents/lint-fixer.md +250 -93
- package/templates/.claude/agents/planner.md +356 -0
- package/templates/.claude/agents/refactor-advisor.md +135 -136
- package/templates/.claude/commands/bug-fix.md +296 -207
- package/templates/.claude/commands/git-all.md +199 -46
- package/templates/.claude/commands/git-session.md +113 -57
- package/templates/.claude/commands/lint-fix.md +219 -153
- package/templates/.claude/commands/lint-init.md +113 -76
- package/templates/.claude/commands/pre-deploy.md +190 -124
- package/templates/.claude/commands/refactor.md +407 -162
- package/templates/.claude/commands/version-update.md +138 -37
- package/templates/.claude/instructions/context-engineering/ANTHROPIC_CONTEXT_ENGINEERING.md +178 -0
- package/templates/.claude/instructions/context-engineering/references/claude-4x.md +215 -0
- package/templates/.claude/instructions/context-engineering/references/core-principles.md +137 -0
- package/templates/.claude/instructions/context-engineering/references/examples.md +351 -0
- package/templates/.claude/instructions/context-engineering/references/techniques.md +162 -0
- package/templates/.claude/instructions/parallel-agent-execution.md +874 -0
- package/templates/.claude/skills/docs-creator/AGENTS.md +238 -0
- package/templates/.claude/{commands/docs-creator.md → skills/docs-creator/SKILL.md} +61 -75
- package/templates/.claude/skills/docs-refactor/AGENTS.md +270 -0
- package/templates/.claude/{commands/docs-refactor.md → skills/docs-refactor/SKILL.md} +30 -44
- package/templates/.claude/skills/execute/SKILL.md +451 -0
- package/templates/.claude/skills/figma-to-code/AGENTS.md +287 -0
- package/templates/.claude/skills/figma-to-code/SKILL.md +225 -225
- package/templates/.claude/skills/figma-to-code/references/design-tokens.md +75 -73
- package/templates/.claude/skills/figma-to-code/references/figma-mcp-tools.md +73 -73
- package/templates/.claude/skills/figma-to-code/references/layout-mapping.md +104 -104
- package/templates/.claude/skills/figma-to-code/references/responsive-design.md +99 -99
- package/templates/.claude/skills/figma-to-code/references/verification.md +91 -91
- package/templates/.claude/skills/global-uiux-design/AGENTS.md +317 -0
- package/templates/.claude/skills/global-uiux-design/SKILL.md +738 -0
- package/templates/.claude/skills/global-uiux-design/references/accessibility.md +401 -0
- package/templates/.claude/skills/global-uiux-design/references/color-system.md +275 -0
- package/templates/.claude/skills/global-uiux-design/references/design-philosophy.md +206 -0
- package/templates/.claude/skills/global-uiux-design/references/design-systems.md +446 -0
- package/templates/.claude/skills/korea-uiux-design/AGENTS.md +307 -0
- package/templates/.claude/skills/korea-uiux-design/SKILL.md +170 -0
- package/templates/.claude/skills/nextjs-react-best-practices/AGENTS.md +95 -116
- package/templates/.claude/skills/nextjs-react-best-practices/SKILL.md +134 -152
- package/templates/.claude/skills/nextjs-react-best-practices/rules/advanced-event-handler-refs.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/advanced-use-latest.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-api-routes.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-defer-await.md +22 -22
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-dependencies.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-parallel.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/async-suspense-boundaries.md +21 -21
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-barrel-imports.md +18 -18
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-conditional.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-defer-third-party.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-dynamic-imports.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/bundle-preload.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/client-event-listeners.md +9 -9
- package/templates/.claude/skills/nextjs-react-best-practices/rules/client-swr-dedup.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-batch-dom-css.md +13 -13
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-function-results.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-property-access.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-cache-storage.md +10 -10
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-combine-iterations.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-early-exit.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-hoist-regexp.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-index-maps.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-length-check-first.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-min-max-loop.md +16 -16
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-set-map-lookups.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/js-tosorted-immutable.md +17 -17
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-activity.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-animate-svg-wrapper.md +11 -11
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-conditional-render.md +8 -8
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-content-visibility.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-hoist-jsx.md +6 -6
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-hydration-no-flicker.md +14 -14
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rendering-svg-precision.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-defer-reads.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-dependencies.md +7 -7
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-derived-state.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-functional-setstate.md +34 -34
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-lazy-state-init.md +15 -15
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-memo.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/rerender-transitions.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-after-nonblocking.md +24 -24
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-cache-lru.md +10 -10
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-cache-react.md +4 -4
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-parallel-fetching.md +5 -5
- package/templates/.claude/skills/nextjs-react-best-practices/rules/server-serialization.md +6 -6
- package/templates/.claude/skills/plan/SKILL.md +594 -0
- package/templates/.claude/skills/prd/SKILL.md +496 -0
- package/templates/.claude/skills/ralph/AGENTS.md +393 -0
- package/templates/.claude/skills/ralph/SKILL.md +1035 -0
- package/templates/.claude/skills/tanstack-start-react-best-practices/AGENTS.md +100 -121
- package/templates/.claude/skills/tanstack-start-react-best-practices/SKILL.md +139 -157
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-defer-await.md +22 -22
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-dependencies.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-loader.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-parallel.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-barrel-imports.md +18 -18
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-conditional.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-defer-third-party.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-lazy-routes.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/bundle-preload.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-event-listeners.md +9 -9
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/client-tanstack-query.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-batch-dom-css.md +13 -13
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-function-results.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-property-access.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-cache-storage.md +10 -10
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-combine-iterations.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-early-exit.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-hoist-regexp.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-index-maps.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-length-check-first.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-min-max-loop.md +16 -16
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-set-map-lookups.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/js-tosorted-immutable.md +17 -17
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-animate-svg-wrapper.md +11 -11
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-conditional-render.md +8 -8
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-content-visibility.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-hoist-jsx.md +6 -6
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rendering-svg-precision.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-defer-reads.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-dependencies.md +7 -7
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-derived-state.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-functional-setstate.md +34 -34
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-lazy-state-init.md +15 -15
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-memo.md +5 -5
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/rerender-transitions.md +4 -4
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-cache-lru.md +12 -12
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-deferred-data.md +14 -14
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-parallel-fetching.md +9 -9
- package/templates/.claude/skills/tanstack-start-react-best-practices/rules/server-serialization.md +6 -6
- package/templates/.claude/commands/agent-creator.md +0 -370
- package/templates/.claude/commands/command-creator.md +0 -524
- package/templates/.claude/commands/execute.md +0 -469
- package/templates/.claude/commands/git.md +0 -98
- package/templates/.claude/commands/plan.md +0 -531
- package/templates/.claude/commands/prd.md +0 -629
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tanstack-start-react-best-practices
|
|
3
|
-
description: TanStack Start
|
|
3
|
+
description: TanStack Start와 React 성능 최적화 가이드. React 컴포넌트, TanStack Start 페이지 작성/리뷰/리팩토링 시 최적 성능 패턴 보장. React 컴포넌트, TanStack Router 라우트, 데이터 페칭, 번들 최적화, 성능 개선 작업에 트리거.
|
|
4
4
|
license: MIT
|
|
5
5
|
metadata:
|
|
6
6
|
author: vercel
|
|
@@ -8,41 +8,23 @@ metadata:
|
|
|
8
8
|
adapted_for: tanstack-start
|
|
9
9
|
---
|
|
10
10
|
|
|
11
|
-
# TanStack Start React
|
|
11
|
+
# TanStack Start React 베스트 프랙티스
|
|
12
12
|
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
---
|
|
16
|
-
|
|
17
|
-
<communication>
|
|
18
|
-
|
|
19
|
-
## User Communication
|
|
20
|
-
|
|
21
|
-
**IMPORTANT: Always communicate with the user in Korean (한국어), even though this document is in English.**
|
|
22
|
-
|
|
23
|
-
When:
|
|
24
|
-
- Asking questions
|
|
25
|
-
- Providing summaries
|
|
26
|
-
- Explaining decisions
|
|
27
|
-
- Reporting progress
|
|
28
|
-
|
|
29
|
-
Use Korean for all user-facing communication while applying these English guidelines internally.
|
|
30
|
-
|
|
31
|
-
</communication>
|
|
13
|
+
React와 TanStack Start 애플리케이션 성능 최적화 가이드. 7개 카테고리, 38개 규칙 포함. 영향도별 우선순위로 자동 리팩토링과 코드 생성 가이드 제공.
|
|
32
14
|
|
|
33
15
|
---
|
|
34
16
|
|
|
35
17
|
<when_to_use>
|
|
36
18
|
|
|
37
|
-
##
|
|
19
|
+
## 사용 시점
|
|
38
20
|
|
|
39
|
-
|
|
|
40
|
-
|
|
41
|
-
|
|
|
42
|
-
|
|
|
43
|
-
|
|
|
44
|
-
|
|
|
45
|
-
|
|
|
21
|
+
| 상황 | 설명 |
|
|
22
|
+
|------|------|
|
|
23
|
+
| **컴포넌트 작성** | React 컴포넌트, TanStack Start 라우트 신규 작성 |
|
|
24
|
+
| **데이터 페칭** | 클라이언트/서버 사이드 데이터 페칭 구현 |
|
|
25
|
+
| **코드 리뷰** | 성능 이슈 검토 |
|
|
26
|
+
| **리팩토링** | 기존 React/TanStack Start 코드 개선 |
|
|
27
|
+
| **최적화** | 번들 크기, 로딩 시간 최적화 |
|
|
46
28
|
|
|
47
29
|
</when_to_use>
|
|
48
30
|
|
|
@@ -50,17 +32,17 @@ Use Korean for all user-facing communication while applying these English guidel
|
|
|
50
32
|
|
|
51
33
|
<categories>
|
|
52
34
|
|
|
53
|
-
##
|
|
35
|
+
## 카테고리별 우선순위
|
|
54
36
|
|
|
55
|
-
|
|
|
56
|
-
|
|
57
|
-
| 1 |
|
|
58
|
-
| 2 |
|
|
59
|
-
| 3 |
|
|
60
|
-
| 4 |
|
|
61
|
-
| 5 | Re-render
|
|
62
|
-
| 6 |
|
|
63
|
-
| 7 | JavaScript
|
|
37
|
+
| 우선순위 | 카테고리 | 영향도 | 접두사 |
|
|
38
|
+
|---------|---------|--------|--------|
|
|
39
|
+
| 1 | Waterfall 제거 | **CRITICAL** | `async-` |
|
|
40
|
+
| 2 | 번들 크기 최적화 | **CRITICAL** | `bundle-` |
|
|
41
|
+
| 3 | 서버 사이드 성능 | HIGH | `server-` |
|
|
42
|
+
| 4 | 클라이언트 데이터 페칭 | MEDIUM-HIGH | `client-` |
|
|
43
|
+
| 5 | Re-render 최적화 | MEDIUM | `rerender-` |
|
|
44
|
+
| 6 | 렌더링 성능 | MEDIUM | `rendering-` |
|
|
45
|
+
| 7 | JavaScript 성능 | LOW-MEDIUM | `js-` |
|
|
64
46
|
|
|
65
47
|
</categories>
|
|
66
48
|
|
|
@@ -68,81 +50,81 @@ Use Korean for all user-facing communication while applying these English guidel
|
|
|
68
50
|
|
|
69
51
|
<rules>
|
|
70
52
|
|
|
71
|
-
##
|
|
72
|
-
|
|
73
|
-
### 1.
|
|
74
|
-
|
|
75
|
-
|
|
|
76
|
-
|
|
77
|
-
| `async-defer-await` |
|
|
78
|
-
| `async-parallel` |
|
|
79
|
-
| `async-dependencies` |
|
|
80
|
-
| `async-loader` |
|
|
81
|
-
|
|
82
|
-
### 2.
|
|
83
|
-
|
|
84
|
-
|
|
|
85
|
-
|
|
86
|
-
| `bundle-barrel-imports` |
|
|
87
|
-
| `bundle-lazy-routes` |
|
|
88
|
-
| `bundle-defer-third-party` |
|
|
89
|
-
| `bundle-conditional` |
|
|
90
|
-
| `bundle-preload` |
|
|
91
|
-
|
|
92
|
-
### 3.
|
|
93
|
-
|
|
94
|
-
|
|
|
95
|
-
|
|
96
|
-
| `server-cache-lru` |
|
|
97
|
-
| `server-serialization` |
|
|
98
|
-
| `server-parallel-fetching` |
|
|
99
|
-
| `server-deferred-data` |
|
|
100
|
-
|
|
101
|
-
### 4.
|
|
102
|
-
|
|
103
|
-
|
|
|
104
|
-
|
|
105
|
-
| `client-tanstack-query` | TanStack Query
|
|
106
|
-
| `client-event-listeners` |
|
|
107
|
-
|
|
108
|
-
### 5. Re-render
|
|
109
|
-
|
|
110
|
-
|
|
|
111
|
-
|
|
112
|
-
| `rerender-defer-reads` |
|
|
113
|
-
| `rerender-memo` |
|
|
114
|
-
| `rerender-dependencies` |
|
|
115
|
-
| `rerender-derived-state` |
|
|
116
|
-
| `rerender-functional-setstate` |
|
|
117
|
-
| `rerender-lazy-state-init` |
|
|
118
|
-
| `rerender-transitions` |
|
|
119
|
-
|
|
120
|
-
### 6.
|
|
121
|
-
|
|
122
|
-
|
|
|
123
|
-
|
|
124
|
-
| `rendering-animate-svg-wrapper` |
|
|
125
|
-
| `rendering-content-visibility` |
|
|
126
|
-
| `rendering-hoist-jsx` |
|
|
127
|
-
| `rendering-svg-precision` |
|
|
128
|
-
| `rendering-conditional-render` |
|
|
129
|
-
|
|
130
|
-
### 7. JavaScript
|
|
131
|
-
|
|
132
|
-
|
|
|
133
|
-
|
|
134
|
-
| `js-batch-dom-css` |
|
|
135
|
-
| `js-index-maps` |
|
|
136
|
-
| `js-cache-property-access` |
|
|
137
|
-
| `js-cache-function-results` |
|
|
138
|
-
| `js-cache-storage` |
|
|
139
|
-
| `js-combine-iterations` |
|
|
140
|
-
| `js-length-check-first` |
|
|
141
|
-
| `js-early-exit` |
|
|
142
|
-
| `js-hoist-regexp` |
|
|
143
|
-
| `js-min-max-loop` |
|
|
144
|
-
| `js-set-map-lookups` |
|
|
145
|
-
| `js-tosorted-immutable` |
|
|
53
|
+
## 빠른 참조
|
|
54
|
+
|
|
55
|
+
### 1. Waterfall 제거 (CRITICAL)
|
|
56
|
+
|
|
57
|
+
| 규칙 | 설명 |
|
|
58
|
+
|------|------|
|
|
59
|
+
| `async-defer-await` | await를 실제 사용 지점으로 이동 |
|
|
60
|
+
| `async-parallel` | 독립 작업은 Promise.all() 사용 |
|
|
61
|
+
| `async-dependencies` | 부분 의존성은 better-all 사용 |
|
|
62
|
+
| `async-loader` | TanStack Router loader에서 병렬 데이터 페칭 |
|
|
63
|
+
|
|
64
|
+
### 2. 번들 크기 최적화 (CRITICAL)
|
|
65
|
+
|
|
66
|
+
| 규칙 | 설명 |
|
|
67
|
+
|------|------|
|
|
68
|
+
| `bundle-barrel-imports` | 직접 import, barrel 파일 회피 |
|
|
69
|
+
| `bundle-lazy-routes` | 라우트 기반 코드 스플리팅 |
|
|
70
|
+
| `bundle-defer-third-party` | 분석/로깅은 hydration 후 로드 |
|
|
71
|
+
| `bundle-conditional` | 기능 활성화 시에만 모듈 로드 |
|
|
72
|
+
| `bundle-preload` | hover/focus 시 preload로 체감 속도 향상 |
|
|
73
|
+
|
|
74
|
+
### 3. 서버 사이드 성능 (HIGH)
|
|
75
|
+
|
|
76
|
+
| 규칙 | 설명 |
|
|
77
|
+
|------|------|
|
|
78
|
+
| `server-cache-lru` | LRU 캐시로 요청 간 캐싱 |
|
|
79
|
+
| `server-serialization` | 클라이언트로 전달 데이터 최소화 |
|
|
80
|
+
| `server-parallel-fetching` | loader에서 병렬 데이터 페칭 |
|
|
81
|
+
| `server-deferred-data` | defer()로 비차단 데이터 로딩 |
|
|
82
|
+
|
|
83
|
+
### 4. 클라이언트 데이터 페칭 (MEDIUM-HIGH)
|
|
84
|
+
|
|
85
|
+
| 규칙 | 설명 |
|
|
86
|
+
|------|------|
|
|
87
|
+
| `client-tanstack-query` | TanStack Query로 자동 캐싱/중복 제거 |
|
|
88
|
+
| `client-event-listeners` | 전역 이벤트 리스너 중복 제거 |
|
|
89
|
+
|
|
90
|
+
### 5. Re-render 최적화 (MEDIUM)
|
|
91
|
+
|
|
92
|
+
| 규칙 | 설명 |
|
|
93
|
+
|------|------|
|
|
94
|
+
| `rerender-defer-reads` | 콜백 전용 상태는 구독 안 함 |
|
|
95
|
+
| `rerender-memo` | 비싼 작업은 memoized 컴포넌트로 추출 |
|
|
96
|
+
| `rerender-dependencies` | effect에 원시값 의존성 사용 |
|
|
97
|
+
| `rerender-derived-state` | 파생 boolean 구독, raw 값 구독 회피 |
|
|
98
|
+
| `rerender-functional-setstate` | 안정적 콜백용 함수형 setState |
|
|
99
|
+
| `rerender-lazy-state-init` | 비싼 초기값은 함수로 useState에 전달 |
|
|
100
|
+
| `rerender-transitions` | 비긴급 업데이트는 startTransition |
|
|
101
|
+
|
|
102
|
+
### 6. 렌더링 성능 (MEDIUM)
|
|
103
|
+
|
|
104
|
+
| 규칙 | 설명 |
|
|
105
|
+
|------|------|
|
|
106
|
+
| `rendering-animate-svg-wrapper` | SVG 대신 wrapper div 애니메이션 |
|
|
107
|
+
| `rendering-content-visibility` | 긴 리스트는 content-visibility 사용 |
|
|
108
|
+
| `rendering-hoist-jsx` | 정적 JSX 컴포넌트 외부로 추출 |
|
|
109
|
+
| `rendering-svg-precision` | SVG 좌표 정밀도 감소 |
|
|
110
|
+
| `rendering-conditional-render` | 조건부 렌더링은 &&가 아닌 삼항 연산자 |
|
|
111
|
+
|
|
112
|
+
### 7. JavaScript 성능 (LOW-MEDIUM)
|
|
113
|
+
|
|
114
|
+
| 규칙 | 설명 |
|
|
115
|
+
|------|------|
|
|
116
|
+
| `js-batch-dom-css` | CSS 변경은 클래스나 cssText로 그룹화 |
|
|
117
|
+
| `js-index-maps` | 반복 조회용 Map 빌드 |
|
|
118
|
+
| `js-cache-property-access` | 루프에서 객체 속성 캐싱 |
|
|
119
|
+
| `js-cache-function-results` | 함수 결과를 모듈 레벨 Map에 캐싱 |
|
|
120
|
+
| `js-cache-storage` | localStorage/sessionStorage 읽기 캐싱 |
|
|
121
|
+
| `js-combine-iterations` | 여러 filter/map을 하나의 루프로 결합 |
|
|
122
|
+
| `js-length-check-first` | 비싼 비교 전 배열 길이 먼저 체크 |
|
|
123
|
+
| `js-early-exit` | 함수에서 조기 반환 |
|
|
124
|
+
| `js-hoist-regexp` | RegExp 생성을 루프 밖으로 |
|
|
125
|
+
| `js-min-max-loop` | sort 대신 루프로 min/max |
|
|
126
|
+
| `js-set-map-lookups` | O(1) 조회용 Set/Map 사용 |
|
|
127
|
+
| `js-tosorted-immutable` | 불변성용 toSorted() 사용 |
|
|
146
128
|
|
|
147
129
|
</rules>
|
|
148
130
|
|
|
@@ -150,17 +132,17 @@ Use Korean for all user-facing communication while applying these English guidel
|
|
|
150
132
|
|
|
151
133
|
<patterns>
|
|
152
134
|
|
|
153
|
-
##
|
|
135
|
+
## 핵심 패턴
|
|
154
136
|
|
|
155
|
-
### ✅
|
|
137
|
+
### ✅ Waterfall 제거
|
|
156
138
|
|
|
157
139
|
```typescript
|
|
158
|
-
// ❌
|
|
140
|
+
// ❌ 순차 실행, 3번 왕복
|
|
159
141
|
const user = await fetchUser()
|
|
160
142
|
const posts = await fetchPosts()
|
|
161
143
|
const comments = await fetchComments()
|
|
162
144
|
|
|
163
|
-
// ✅
|
|
145
|
+
// ✅ 병렬 실행, 1번 왕복
|
|
164
146
|
const [user, posts, comments] = await Promise.all([
|
|
165
147
|
fetchUser(),
|
|
166
148
|
fetchPosts(),
|
|
@@ -174,7 +156,7 @@ const [user, posts, comments] = await Promise.all([
|
|
|
174
156
|
import { createServerFn } from '@tanstack/react-start'
|
|
175
157
|
import { createFileRoute } from '@tanstack/react-router'
|
|
176
158
|
|
|
177
|
-
//
|
|
159
|
+
// Server Functions 정의
|
|
178
160
|
const getPost = createServerFn().handler(async (postId: string) => {
|
|
179
161
|
return await db.post.findUnique({ where: { id: postId } })
|
|
180
162
|
})
|
|
@@ -183,7 +165,7 @@ const getComments = createServerFn().handler(async (postId: string) => {
|
|
|
183
165
|
return await db.comment.findMany({ where: { postId } })
|
|
184
166
|
})
|
|
185
167
|
|
|
186
|
-
// ❌
|
|
168
|
+
// ❌ 순차 로딩
|
|
187
169
|
export const Route = createFileRoute('/posts/$postId')({
|
|
188
170
|
loader: async ({ params }) => {
|
|
189
171
|
const post = await getPost(params.postId)
|
|
@@ -192,7 +174,7 @@ export const Route = createFileRoute('/posts/$postId')({
|
|
|
192
174
|
}
|
|
193
175
|
})
|
|
194
176
|
|
|
195
|
-
// ✅
|
|
177
|
+
// ✅ 병렬 로딩
|
|
196
178
|
export const Route = createFileRoute('/posts/$postId')({
|
|
197
179
|
loader: async ({ params }) => {
|
|
198
180
|
const [post, comments] = await Promise.all([
|
|
@@ -204,24 +186,24 @@ export const Route = createFileRoute('/posts/$postId')({
|
|
|
204
186
|
})
|
|
205
187
|
```
|
|
206
188
|
|
|
207
|
-
### ✅
|
|
189
|
+
### ✅ 번들 최적화
|
|
208
190
|
|
|
209
191
|
```tsx
|
|
210
|
-
// ❌
|
|
192
|
+
// ❌ 전체 라이브러리 import (1583개 모듈, ~2.8초)
|
|
211
193
|
import { Check, X, Menu } from 'lucide-react'
|
|
212
194
|
|
|
213
|
-
// ✅
|
|
195
|
+
// ✅ 직접 import (3개 모듈만)
|
|
214
196
|
import Check from 'lucide-react/dist/esm/icons/check'
|
|
215
197
|
import X from 'lucide-react/dist/esm/icons/x'
|
|
216
198
|
import Menu from 'lucide-react/dist/esm/icons/menu'
|
|
217
199
|
```
|
|
218
200
|
|
|
219
|
-
### ✅ TanStack Query
|
|
201
|
+
### ✅ TanStack Query로 캐싱
|
|
220
202
|
|
|
221
203
|
```typescript
|
|
222
204
|
import { useQuery } from '@tanstack/react-query'
|
|
223
205
|
|
|
224
|
-
// ❌
|
|
206
|
+
// ❌ 중복 제거 없음, 각 인스턴스가 fetch
|
|
225
207
|
function UserList() {
|
|
226
208
|
const [users, setUsers] = useState([])
|
|
227
209
|
useEffect(() => {
|
|
@@ -231,7 +213,7 @@ function UserList() {
|
|
|
231
213
|
}, [])
|
|
232
214
|
}
|
|
233
215
|
|
|
234
|
-
// ✅
|
|
216
|
+
// ✅ 여러 인스턴스가 하나의 요청 공유
|
|
235
217
|
function UserList() {
|
|
236
218
|
const { data: users } = useQuery({
|
|
237
219
|
queryKey: ['users'],
|
|
@@ -240,15 +222,15 @@ function UserList() {
|
|
|
240
222
|
}
|
|
241
223
|
```
|
|
242
224
|
|
|
243
|
-
### ✅ Re-render
|
|
225
|
+
### ✅ Re-render 최적화
|
|
244
226
|
|
|
245
227
|
```tsx
|
|
246
|
-
// ❌ items
|
|
228
|
+
// ❌ items가 의존성, 매번 재생성
|
|
247
229
|
const addItems = useCallback((newItems: Item[]) => {
|
|
248
230
|
setItems([...items, ...newItems])
|
|
249
231
|
}, [items])
|
|
250
232
|
|
|
251
|
-
// ✅
|
|
233
|
+
// ✅ 안정적 콜백, 재생성 없음
|
|
252
234
|
const addItems = useCallback((newItems: Item[]) => {
|
|
253
235
|
setItems(curr => [...curr, ...newItems])
|
|
254
236
|
}, [])
|
|
@@ -260,17 +242,17 @@ const addItems = useCallback((newItems: Item[]) => {
|
|
|
260
242
|
|
|
261
243
|
<tanstack_specific>
|
|
262
244
|
|
|
263
|
-
## TanStack Start
|
|
245
|
+
## TanStack Start 특화 패턴
|
|
264
246
|
|
|
265
|
-
### createServerFn
|
|
247
|
+
### createServerFn으로 Server Functions
|
|
266
248
|
|
|
267
249
|
```typescript
|
|
268
250
|
import { createServerFn } from '@tanstack/react-start'
|
|
269
251
|
import { z } from 'zod'
|
|
270
252
|
|
|
271
|
-
// ✅
|
|
253
|
+
// ✅ 기본 Server Function
|
|
272
254
|
const getUser = createServerFn().handler(async () => {
|
|
273
|
-
//
|
|
255
|
+
// 서버에서만 실행
|
|
274
256
|
return await db.user.findMany()
|
|
275
257
|
})
|
|
276
258
|
|
|
@@ -283,12 +265,12 @@ const createUserSchema = z.object({
|
|
|
283
265
|
const createUser = createServerFn({ method: 'POST' })
|
|
284
266
|
.inputValidator(createUserSchema)
|
|
285
267
|
.handler(async ({ data }) => {
|
|
286
|
-
// data
|
|
268
|
+
// data는 완전히 타입 검증됨
|
|
287
269
|
return await db.user.create({ data })
|
|
288
270
|
})
|
|
289
271
|
```
|
|
290
272
|
|
|
291
|
-
### Loader
|
|
273
|
+
### Loader 최적화
|
|
292
274
|
|
|
293
275
|
```typescript
|
|
294
276
|
import { createServerFn } from '@tanstack/react-start'
|
|
@@ -302,7 +284,7 @@ const getStats = createServerFn().handler(async () => {
|
|
|
302
284
|
return await db.stats.findMany()
|
|
303
285
|
})
|
|
304
286
|
|
|
305
|
-
// ✅
|
|
287
|
+
// ✅ 병렬 데이터 페칭
|
|
306
288
|
export const Route = createFileRoute('/dashboard')({
|
|
307
289
|
loader: async () => {
|
|
308
290
|
const [user, stats] = await Promise.all([
|
|
@@ -314,7 +296,7 @@ export const Route = createFileRoute('/dashboard')({
|
|
|
314
296
|
})
|
|
315
297
|
```
|
|
316
298
|
|
|
317
|
-
### Deferred Data (
|
|
299
|
+
### Deferred Data (자동 처리)
|
|
318
300
|
|
|
319
301
|
```typescript
|
|
320
302
|
import { createServerFn } from '@tanstack/react-start'
|
|
@@ -326,17 +308,17 @@ const getPost = createServerFn().handler(async (postId: string) => {
|
|
|
326
308
|
})
|
|
327
309
|
|
|
328
310
|
const getComments = createServerFn().handler(async (postId: string) => {
|
|
329
|
-
await new Promise(r => setTimeout(r, 3000)) //
|
|
311
|
+
await new Promise(r => setTimeout(r, 3000)) // 느린 쿼리 시뮬레이션
|
|
330
312
|
return await db.comment.findMany({ where: { postId } })
|
|
331
313
|
})
|
|
332
314
|
|
|
333
|
-
// ✅
|
|
315
|
+
// ✅ 중요 데이터는 await, 비중요 데이터는 Promise 그대로 반환
|
|
334
316
|
export const Route = createFileRoute('/posts/$postId')({
|
|
335
317
|
loader: async ({ params }) => {
|
|
336
|
-
//
|
|
318
|
+
// 빠른 데이터는 await
|
|
337
319
|
const post = await getPost(params.postId)
|
|
338
320
|
|
|
339
|
-
//
|
|
321
|
+
// 느린 데이터는 Promise 그대로 반환 (자동으로 deferred 처리됨)
|
|
340
322
|
const deferredComments = getComments(params.postId)
|
|
341
323
|
|
|
342
324
|
return {
|
|
@@ -346,7 +328,7 @@ export const Route = createFileRoute('/posts/$postId')({
|
|
|
346
328
|
}
|
|
347
329
|
})
|
|
348
330
|
|
|
349
|
-
//
|
|
331
|
+
// 컴포넌트에서 Await로 처리
|
|
350
332
|
function PostPage() {
|
|
351
333
|
const { post, deferredComments } = Route.useLoaderData()
|
|
352
334
|
|
|
@@ -363,13 +345,13 @@ function PostPage() {
|
|
|
363
345
|
}
|
|
364
346
|
```
|
|
365
347
|
|
|
366
|
-
###
|
|
348
|
+
### 라우트 기반 코드 스플리팅
|
|
367
349
|
|
|
368
350
|
```typescript
|
|
369
351
|
import { lazy } from 'react'
|
|
370
352
|
import { createFileRoute } from '@tanstack/react-router'
|
|
371
353
|
|
|
372
|
-
// ✅
|
|
354
|
+
// ✅ 무거운 컴포넌트는 lazy load
|
|
373
355
|
const HeavyEditor = lazy(() => import('./components/HeavyEditor'))
|
|
374
356
|
|
|
375
357
|
export const Route = createFileRoute('/editor')({
|
|
@@ -387,9 +369,9 @@ export const Route = createFileRoute('/editor')({
|
|
|
387
369
|
|
|
388
370
|
<usage>
|
|
389
371
|
|
|
390
|
-
##
|
|
372
|
+
## 사용법
|
|
391
373
|
|
|
392
|
-
|
|
374
|
+
**상세 규칙 및 예시:**
|
|
393
375
|
|
|
394
376
|
```
|
|
395
377
|
rules/async-parallel.md
|
|
@@ -398,13 +380,13 @@ rules/client-tanstack-query.md
|
|
|
398
380
|
rules/server-deferred-data.md
|
|
399
381
|
```
|
|
400
382
|
|
|
401
|
-
|
|
402
|
-
-
|
|
403
|
-
- ❌
|
|
404
|
-
- ✅
|
|
405
|
-
-
|
|
383
|
+
각 규칙 파일 포함 내용:
|
|
384
|
+
- 중요한 이유 설명
|
|
385
|
+
- ❌ 잘못된 코드 예시 + 설명
|
|
386
|
+
- ✅ 올바른 코드 예시 + 설명
|
|
387
|
+
- 추가 컨텍스트 및 참조
|
|
406
388
|
|
|
407
|
-
|
|
389
|
+
**전체 컴파일 문서:** `PARALLEL_AGENTS.md`
|
|
408
390
|
|
|
409
391
|
</usage>
|
|
410
392
|
|
|
@@ -412,10 +394,10 @@ Each rule file contains:
|
|
|
412
394
|
|
|
413
395
|
<references>
|
|
414
396
|
|
|
415
|
-
##
|
|
397
|
+
## 참고 자료
|
|
416
398
|
|
|
417
|
-
### TanStack
|
|
418
|
-
1. [React](https://react.dev)
|
|
399
|
+
### TanStack 공식 문서
|
|
400
|
+
1. [React 공식 문서](https://react.dev)
|
|
419
401
|
2. [TanStack Start Overview](https://tanstack.com/start/latest/docs/framework/react/overview)
|
|
420
402
|
3. [TanStack Start Quick Start](https://tanstack.com/start/latest/docs/framework/react/quick-start)
|
|
421
403
|
4. [TanStack Router](https://tanstack.com/router)
|
|
@@ -423,7 +405,7 @@ Each rule file contains:
|
|
|
423
405
|
6. [TanStack Query](https://tanstack.com/query)
|
|
424
406
|
7. [Server Functions Guide](https://tanstack.com/start/latest/docs/framework/react/guide/server-functions)
|
|
425
407
|
|
|
426
|
-
###
|
|
408
|
+
### 외부 자료
|
|
427
409
|
8. [better-all](https://github.com/shuding/better-all)
|
|
428
410
|
9. [node-lru-cache](https://github.com/isaacs/node-lru-cache)
|
|
429
411
|
10. [Using Server Functions and TanStack Query](https://www.brenelz.com/posts/using-server-functions-and-tanstack-query/)
|
package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-defer-await.md
CHANGED
|
@@ -5,76 +5,76 @@ impactDescription: avoids blocking unused code paths
|
|
|
5
5
|
tags: async, await, conditional, optimization
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## 필요할 때까지 Await 연기하기
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
실제로 사용되는 분기점에서만 `await` 작업을 수행하여 필요하지 않은 코드 경로가 블로킹되는 것을 방지합니다.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
**❌ 잘못된 예시 (두 분기 모두 블로킹):**
|
|
13
13
|
|
|
14
14
|
```typescript
|
|
15
15
|
async function handleRequest(userId: string, skipProcessing: boolean) {
|
|
16
16
|
const userData = await fetchUserData(userId)
|
|
17
|
-
|
|
17
|
+
|
|
18
18
|
if (skipProcessing) {
|
|
19
|
-
//
|
|
19
|
+
// 즉시 반환하지만 여전히 userData를 기다렸음
|
|
20
20
|
return { skipped: true }
|
|
21
21
|
}
|
|
22
|
-
|
|
23
|
-
//
|
|
22
|
+
|
|
23
|
+
// 이 분기에서만 userData를 사용함
|
|
24
24
|
return processUserData(userData)
|
|
25
25
|
}
|
|
26
26
|
```
|
|
27
27
|
|
|
28
|
-
|
|
28
|
+
**✅ 올바른 예시 (필요할 때만 블로킹):**
|
|
29
29
|
|
|
30
30
|
```typescript
|
|
31
31
|
async function handleRequest(userId: string, skipProcessing: boolean) {
|
|
32
32
|
if (skipProcessing) {
|
|
33
|
-
//
|
|
33
|
+
// 기다리지 않고 즉시 반환
|
|
34
34
|
return { skipped: true }
|
|
35
35
|
}
|
|
36
|
-
|
|
37
|
-
//
|
|
36
|
+
|
|
37
|
+
// 필요할 때만 가져오기
|
|
38
38
|
const userData = await fetchUserData(userId)
|
|
39
39
|
return processUserData(userData)
|
|
40
40
|
}
|
|
41
41
|
```
|
|
42
42
|
|
|
43
|
-
|
|
43
|
+
**다른 예시 (조기 반환 최적화):**
|
|
44
44
|
|
|
45
45
|
```typescript
|
|
46
|
-
//
|
|
46
|
+
// ❌ 잘못된 예시: 항상 권한을 가져옴
|
|
47
47
|
async function updateResource(resourceId: string, userId: string) {
|
|
48
48
|
const permissions = await fetchPermissions(userId)
|
|
49
49
|
const resource = await getResource(resourceId)
|
|
50
|
-
|
|
50
|
+
|
|
51
51
|
if (!resource) {
|
|
52
52
|
return { error: 'Not found' }
|
|
53
53
|
}
|
|
54
|
-
|
|
54
|
+
|
|
55
55
|
if (!permissions.canEdit) {
|
|
56
56
|
return { error: 'Forbidden' }
|
|
57
57
|
}
|
|
58
|
-
|
|
58
|
+
|
|
59
59
|
return await updateResourceData(resource, permissions)
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
//
|
|
62
|
+
// ✅ 올바른 예시: 필요할 때만 가져오기
|
|
63
63
|
async function updateResource(resourceId: string, userId: string) {
|
|
64
64
|
const resource = await getResource(resourceId)
|
|
65
|
-
|
|
65
|
+
|
|
66
66
|
if (!resource) {
|
|
67
67
|
return { error: 'Not found' }
|
|
68
68
|
}
|
|
69
|
-
|
|
69
|
+
|
|
70
70
|
const permissions = await fetchPermissions(userId)
|
|
71
|
-
|
|
71
|
+
|
|
72
72
|
if (!permissions.canEdit) {
|
|
73
73
|
return { error: 'Forbidden' }
|
|
74
74
|
}
|
|
75
|
-
|
|
75
|
+
|
|
76
76
|
return await updateResourceData(resource, permissions)
|
|
77
77
|
}
|
|
78
78
|
```
|
|
79
79
|
|
|
80
|
-
|
|
80
|
+
이 최적화는 건너뛴 분기가 자주 실행되거나, 연기된 작업이 비용이 많이 드는 경우 특히 유용합니다.
|
package/templates/.claude/skills/tanstack-start-react-best-practices/rules/async-dependencies.md
CHANGED
|
@@ -5,11 +5,11 @@ impactDescription: 2-10× improvement
|
|
|
5
5
|
tags: async, parallelization, dependencies, better-all
|
|
6
6
|
---
|
|
7
7
|
|
|
8
|
-
##
|
|
8
|
+
## 의존성 기반 병렬화
|
|
9
9
|
|
|
10
|
-
|
|
10
|
+
부분적인 의존성이 있는 작업의 경우 `better-all`을 사용하여 병렬성을 최대화합니다. 각 작업을 가능한 가장 빠른 시점에 자동으로 시작합니다.
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
**❌ 잘못된 예시 (profile이 불필요하게 config을 기다림):**
|
|
13
13
|
|
|
14
14
|
```typescript
|
|
15
15
|
const [user, config] = await Promise.all([
|
|
@@ -19,7 +19,7 @@ const [user, config] = await Promise.all([
|
|
|
19
19
|
const profile = await fetchProfile(user.id)
|
|
20
20
|
```
|
|
21
21
|
|
|
22
|
-
|
|
22
|
+
**✅ 올바른 예시 (config과 profile이 병렬로 실행):**
|
|
23
23
|
|
|
24
24
|
```typescript
|
|
25
25
|
import { all } from 'better-all'
|
|
@@ -33,4 +33,4 @@ const { user, config, profile } = await all({
|
|
|
33
33
|
})
|
|
34
34
|
```
|
|
35
35
|
|
|
36
|
-
|
|
36
|
+
참고: [https://github.com/shuding/better-all](https://github.com/shuding/better-all)
|