create-modern-react 2.3.4 → 2.3.6
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/bin/index.js +2 -1
- package/lib/install.js +12 -6
- package/lib/prompts.js +16 -2
- package/lib/setup.js +32 -2
- package/package.json +4 -2
- package/scripts/postinstall.js +18 -0
- package/templates/base/.claude/skills.tar.gz +0 -0
- package/templates/base/.claude/skills/agent-browser/SKILL.md +0 -356
- package/templates/base/.claude/skills/agent-browser/references/authentication.md +0 -188
- package/templates/base/.claude/skills/agent-browser/references/proxy-support.md +0 -175
- package/templates/base/.claude/skills/agent-browser/references/session-management.md +0 -181
- package/templates/base/.claude/skills/agent-browser/references/snapshot-refs.md +0 -186
- package/templates/base/.claude/skills/agent-browser/references/video-recording.md +0 -162
- package/templates/base/.claude/skills/agent-browser/templates/authenticated-session.sh +0 -91
- package/templates/base/.claude/skills/agent-browser/templates/capture-workflow.sh +0 -68
- package/templates/base/.claude/skills/agent-browser/templates/form-automation.sh +0 -64
- package/templates/base/.claude/skills/autoskill/skill.md +0 -134
- package/templates/base/.claude/skills/design-principles/skill.md +0 -237
- package/templates/base/.claude/skills/frontend-design/skill.md +0 -42
- package/templates/base/.claude/skills/learn-together/skill.md +0 -448
- package/templates/base/.claude/skills/question-me/skill.md +0 -175
- package/templates/base/.claude/skills/react-best-practices/AGENTS.md +0 -2410
- package/templates/base/.claude/skills/react-best-practices/README.md +0 -123
- package/templates/base/.claude/skills/react-best-practices/SKILL.md +0 -135
- package/templates/base/.claude/skills/react-best-practices/metadata.json +0 -15
- package/templates/base/.claude/skills/react-best-practices/rules/_sections.md +0 -46
- package/templates/base/.claude/skills/react-best-practices/rules/_template.md +0 -28
- package/templates/base/.claude/skills/react-best-practices/rules/advanced-event-handler-refs.md +0 -55
- package/templates/base/.claude/skills/react-best-practices/rules/advanced-use-latest.md +0 -49
- package/templates/base/.claude/skills/react-best-practices/rules/async-api-routes.md +0 -38
- package/templates/base/.claude/skills/react-best-practices/rules/async-defer-await.md +0 -80
- package/templates/base/.claude/skills/react-best-practices/rules/async-dependencies.md +0 -36
- package/templates/base/.claude/skills/react-best-practices/rules/async-parallel.md +0 -28
- package/templates/base/.claude/skills/react-best-practices/rules/async-suspense-boundaries.md +0 -99
- package/templates/base/.claude/skills/react-best-practices/rules/bundle-barrel-imports.md +0 -59
- package/templates/base/.claude/skills/react-best-practices/rules/bundle-conditional.md +0 -31
- package/templates/base/.claude/skills/react-best-practices/rules/bundle-defer-third-party.md +0 -49
- package/templates/base/.claude/skills/react-best-practices/rules/bundle-dynamic-imports.md +0 -35
- package/templates/base/.claude/skills/react-best-practices/rules/bundle-preload.md +0 -50
- package/templates/base/.claude/skills/react-best-practices/rules/client-event-listeners.md +0 -74
- package/templates/base/.claude/skills/react-best-practices/rules/client-localstorage-schema.md +0 -71
- package/templates/base/.claude/skills/react-best-practices/rules/client-passive-event-listeners.md +0 -48
- package/templates/base/.claude/skills/react-best-practices/rules/client-swr-dedup.md +0 -56
- package/templates/base/.claude/skills/react-best-practices/rules/js-batch-dom-css.md +0 -57
- package/templates/base/.claude/skills/react-best-practices/rules/js-cache-function-results.md +0 -80
- package/templates/base/.claude/skills/react-best-practices/rules/js-cache-property-access.md +0 -28
- package/templates/base/.claude/skills/react-best-practices/rules/js-cache-storage.md +0 -70
- package/templates/base/.claude/skills/react-best-practices/rules/js-combine-iterations.md +0 -32
- package/templates/base/.claude/skills/react-best-practices/rules/js-early-exit.md +0 -50
- package/templates/base/.claude/skills/react-best-practices/rules/js-hoist-regexp.md +0 -45
- package/templates/base/.claude/skills/react-best-practices/rules/js-index-maps.md +0 -37
- package/templates/base/.claude/skills/react-best-practices/rules/js-length-check-first.md +0 -49
- package/templates/base/.claude/skills/react-best-practices/rules/js-min-max-loop.md +0 -82
- package/templates/base/.claude/skills/react-best-practices/rules/js-set-map-lookups.md +0 -24
- package/templates/base/.claude/skills/react-best-practices/rules/js-tosorted-immutable.md +0 -57
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-activity.md +0 -26
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-animate-svg-wrapper.md +0 -47
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-conditional-render.md +0 -40
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-content-visibility.md +0 -38
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-hoist-jsx.md +0 -46
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-hydration-no-flicker.md +0 -82
- package/templates/base/.claude/skills/react-best-practices/rules/rendering-svg-precision.md +0 -28
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-defer-reads.md +0 -39
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-dependencies.md +0 -45
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-derived-state.md +0 -29
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-functional-setstate.md +0 -74
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-lazy-state-init.md +0 -58
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-memo.md +0 -44
- package/templates/base/.claude/skills/react-best-practices/rules/rerender-transitions.md +0 -40
- package/templates/base/.claude/skills/react-best-practices/rules/server-after-nonblocking.md +0 -73
- package/templates/base/.claude/skills/react-best-practices/rules/server-cache-lru.md +0 -41
- package/templates/base/.claude/skills/react-best-practices/rules/server-cache-react.md +0 -76
- package/templates/base/.claude/skills/react-best-practices/rules/server-parallel-fetching.md +0 -83
- package/templates/base/.claude/skills/react-best-practices/rules/server-serialization.md +0 -38
|
@@ -1,76 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Per-Request Deduplication with React.cache()
|
|
3
|
-
impact: MEDIUM
|
|
4
|
-
impactDescription: deduplicates within request
|
|
5
|
-
tags: server, cache, react-cache, deduplication
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Per-Request Deduplication with React.cache()
|
|
9
|
-
|
|
10
|
-
Use `React.cache()` for server-side request deduplication. Authentication and database queries benefit most.
|
|
11
|
-
|
|
12
|
-
**Usage:**
|
|
13
|
-
|
|
14
|
-
```typescript
|
|
15
|
-
import { cache } from 'react'
|
|
16
|
-
|
|
17
|
-
export const getCurrentUser = cache(async () => {
|
|
18
|
-
const session = await auth()
|
|
19
|
-
if (!session?.user?.id) return null
|
|
20
|
-
return await db.user.findUnique({
|
|
21
|
-
where: { id: session.user.id }
|
|
22
|
-
})
|
|
23
|
-
})
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
Within a single request, multiple calls to `getCurrentUser()` execute the query only once.
|
|
27
|
-
|
|
28
|
-
**Avoid inline objects as arguments:**
|
|
29
|
-
|
|
30
|
-
`React.cache()` uses shallow equality (`Object.is`) to determine cache hits. Inline objects create new references each call, preventing cache hits.
|
|
31
|
-
|
|
32
|
-
**Incorrect (always cache miss):**
|
|
33
|
-
|
|
34
|
-
```typescript
|
|
35
|
-
const getUser = cache(async (params: { uid: number }) => {
|
|
36
|
-
return await db.user.findUnique({ where: { id: params.uid } })
|
|
37
|
-
})
|
|
38
|
-
|
|
39
|
-
// Each call creates new object, never hits cache
|
|
40
|
-
getUser({ uid: 1 })
|
|
41
|
-
getUser({ uid: 1 }) // Cache miss, runs query again
|
|
42
|
-
```
|
|
43
|
-
|
|
44
|
-
**Correct (cache hit):**
|
|
45
|
-
|
|
46
|
-
```typescript
|
|
47
|
-
const getUser = cache(async (uid: number) => {
|
|
48
|
-
return await db.user.findUnique({ where: { id: uid } })
|
|
49
|
-
})
|
|
50
|
-
|
|
51
|
-
// Primitive args use value equality
|
|
52
|
-
getUser(1)
|
|
53
|
-
getUser(1) // Cache hit, returns cached result
|
|
54
|
-
```
|
|
55
|
-
|
|
56
|
-
If you must pass objects, pass the same reference:
|
|
57
|
-
|
|
58
|
-
```typescript
|
|
59
|
-
const params = { uid: 1 }
|
|
60
|
-
getUser(params) // Query runs
|
|
61
|
-
getUser(params) // Cache hit (same reference)
|
|
62
|
-
```
|
|
63
|
-
|
|
64
|
-
**Next.js-Specific Note:**
|
|
65
|
-
|
|
66
|
-
In Next.js, the `fetch` API is automatically extended with request memoization. Requests with the same URL and options are automatically deduplicated within a single request, so you don't need `React.cache()` for `fetch` calls. However, `React.cache()` is still essential for other async tasks:
|
|
67
|
-
|
|
68
|
-
- Database queries (Prisma, Drizzle, etc.)
|
|
69
|
-
- Heavy computations
|
|
70
|
-
- Authentication checks
|
|
71
|
-
- File system operations
|
|
72
|
-
- Any non-fetch async work
|
|
73
|
-
|
|
74
|
-
Use `React.cache()` to deduplicate these operations across your component tree.
|
|
75
|
-
|
|
76
|
-
Reference: [React.cache documentation](https://react.dev/reference/react/cache)
|
package/templates/base/.claude/skills/react-best-practices/rules/server-parallel-fetching.md
DELETED
|
@@ -1,83 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Parallel Data Fetching with Component Composition
|
|
3
|
-
impact: CRITICAL
|
|
4
|
-
impactDescription: eliminates server-side waterfalls
|
|
5
|
-
tags: server, rsc, parallel-fetching, composition
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Parallel Data Fetching with Component Composition
|
|
9
|
-
|
|
10
|
-
React Server Components execute sequentially within a tree. Restructure with composition to parallelize data fetching.
|
|
11
|
-
|
|
12
|
-
**Incorrect (Sidebar waits for Page's fetch to complete):**
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
export default async function Page() {
|
|
16
|
-
const header = await fetchHeader()
|
|
17
|
-
return (
|
|
18
|
-
<div>
|
|
19
|
-
<div>{header}</div>
|
|
20
|
-
<Sidebar />
|
|
21
|
-
</div>
|
|
22
|
-
)
|
|
23
|
-
}
|
|
24
|
-
|
|
25
|
-
async function Sidebar() {
|
|
26
|
-
const items = await fetchSidebarItems()
|
|
27
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
28
|
-
}
|
|
29
|
-
```
|
|
30
|
-
|
|
31
|
-
**Correct (both fetch simultaneously):**
|
|
32
|
-
|
|
33
|
-
```tsx
|
|
34
|
-
async function Header() {
|
|
35
|
-
const data = await fetchHeader()
|
|
36
|
-
return <div>{data}</div>
|
|
37
|
-
}
|
|
38
|
-
|
|
39
|
-
async function Sidebar() {
|
|
40
|
-
const items = await fetchSidebarItems()
|
|
41
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
42
|
-
}
|
|
43
|
-
|
|
44
|
-
export default function Page() {
|
|
45
|
-
return (
|
|
46
|
-
<div>
|
|
47
|
-
<Header />
|
|
48
|
-
<Sidebar />
|
|
49
|
-
</div>
|
|
50
|
-
)
|
|
51
|
-
}
|
|
52
|
-
```
|
|
53
|
-
|
|
54
|
-
**Alternative with children prop:**
|
|
55
|
-
|
|
56
|
-
```tsx
|
|
57
|
-
async function Header() {
|
|
58
|
-
const data = await fetchHeader()
|
|
59
|
-
return <div>{data}</div>
|
|
60
|
-
}
|
|
61
|
-
|
|
62
|
-
async function Sidebar() {
|
|
63
|
-
const items = await fetchSidebarItems()
|
|
64
|
-
return <nav>{items.map(renderItem)}</nav>
|
|
65
|
-
}
|
|
66
|
-
|
|
67
|
-
function Layout({ children }: { children: ReactNode }) {
|
|
68
|
-
return (
|
|
69
|
-
<div>
|
|
70
|
-
<Header />
|
|
71
|
-
{children}
|
|
72
|
-
</div>
|
|
73
|
-
)
|
|
74
|
-
}
|
|
75
|
-
|
|
76
|
-
export default function Page() {
|
|
77
|
-
return (
|
|
78
|
-
<Layout>
|
|
79
|
-
<Sidebar />
|
|
80
|
-
</Layout>
|
|
81
|
-
)
|
|
82
|
-
}
|
|
83
|
-
```
|
|
@@ -1,38 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
title: Minimize Serialization at RSC Boundaries
|
|
3
|
-
impact: HIGH
|
|
4
|
-
impactDescription: reduces data transfer size
|
|
5
|
-
tags: server, rsc, serialization, props
|
|
6
|
-
---
|
|
7
|
-
|
|
8
|
-
## Minimize Serialization at RSC Boundaries
|
|
9
|
-
|
|
10
|
-
The React Server/Client boundary serializes all object properties into strings and embeds them in the HTML response and subsequent RSC requests. This serialized data directly impacts page weight and load time, so **size matters a lot**. Only pass fields that the client actually uses.
|
|
11
|
-
|
|
12
|
-
**Incorrect (serializes all 50 fields):**
|
|
13
|
-
|
|
14
|
-
```tsx
|
|
15
|
-
async function Page() {
|
|
16
|
-
const user = await fetchUser() // 50 fields
|
|
17
|
-
return <Profile user={user} />
|
|
18
|
-
}
|
|
19
|
-
|
|
20
|
-
'use client'
|
|
21
|
-
function Profile({ user }: { user: User }) {
|
|
22
|
-
return <div>{user.name}</div> // uses 1 field
|
|
23
|
-
}
|
|
24
|
-
```
|
|
25
|
-
|
|
26
|
-
**Correct (serializes only 1 field):**
|
|
27
|
-
|
|
28
|
-
```tsx
|
|
29
|
-
async function Page() {
|
|
30
|
-
const user = await fetchUser()
|
|
31
|
-
return <Profile name={user.name} />
|
|
32
|
-
}
|
|
33
|
-
|
|
34
|
-
'use client'
|
|
35
|
-
function Profile({ name }: { name: string }) {
|
|
36
|
-
return <div>{name}</div>
|
|
37
|
-
}
|
|
38
|
-
```
|