Next.js 16 ã® Server Actionsã2026ããã¥ãŒããŒã·ã§ã³ã»ãªããªããŒã·ã§ã³ã»é¢æ¥è³ªå
Next.js 16 ã® Server Actions ããã¥ãŒããŒã·ã§ã³ããªããªããŒã·ã§ã³ãpending ç¶æ ãæ¥œèгç UIãã»ãã¥ãªãã£ãã©ãæ±ããããããŠåæŠå¿µã詊ã颿¥è³ªåã解説ããŸãã

Next.js ã® Server Actions ã¯ãçŽ æŽãªéåæé¢æ°ããµãŒããŒãµã€ãã®ãã¥ãŒããŒã·ã§ã³ãšã³ããã€ã³ããžãšå€ãããã©ãŒã ããçŽæ¥åŒã³åºããããã«ããŸããAPI ã«ãŒãããã¯ã©ã€ã¢ã³ãåŽã® fetch ããæåã® JSON ã·ãªã¢ã©ã€ãºãäžèŠã§ããNext.js 16 ã§ã¯ããŒã¿ãã¥ãŒããŒã·ã§ã³ãèšè¿°ããæšæºçãªææ®µãšãªã£ãŠããã2026 幎ã®ã·ã㢠React 颿¥ã§ã¯ã»ãŒç¢ºå®ã«ç»å ŽããŸããæ¬èšäºã§ã¯ãServer Actions ãã©ã®ããã«å®è¡ãããã®ãããªããªããŒã·ã§ã³ãã©ã®ããã«ææ°ããŒã¿ã UI ãžäŒæãããã®ããpending ç¶æ
ããšã©ãŒç¶æ
ãã©ãã¢ãã«åããã®ãããããŠå€ãã®éçºè
ãã€ãŸããã»ãã¥ãªãã£ã®ã«ãŒã«ã詳ããæãäžããŸãã
Server Action ãšã¯ã"use server" ãä»äžãããéåæé¢æ°ã§ããããµãŒããŒäžã§ã®ã¿å®è¡ãããŸããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãããã©ãŒã ãããããããããŒã«ã«é¢æ°ã§ãããã®ããã«åŒã³åºããäžæ¹ã§ãNext.js ããããã¯ãŒã¯ãªã¯ãšã¹ããåŒæ°ã®ã·ãªã¢ã©ã€ãºããã㊠CSRF 察çãèªåçã«åŠçããŸãã
Server Actions ã¯å éšã§ã©ãå®è¡ãããã®ã
Server Action ã¯ãã³ã³ãã€ã©ãçæãããšã³ããã€ã³ããä»ããŠãããã¯ãŒã¯è¶ãã«åŒã³åºãããããµãŒããŒå°çšã®é¢æ°ã§ãã颿°ã« "use server" ãã£ã¬ã¯ãã£ããä»ããŠããå ŽåãNext.js ã®ã³ã³ãã€ã©ã¯ãã®æ¬äœããã©ãŠã¶ãžéä¿¡ããŸããã代ããã«ã颿°ã軜éãªåç
§ãžçœ®ãæããŸããããã·ã¥åãããã¢ã¯ã·ã§ã³ ID ããçæããã POST ã«ãŒãã«å¯Ÿå¿ä»ããã®ã§ããã¯ã©ã€ã¢ã³ãããã¢ã¯ã·ã§ã³ãåŒã³åºããšããã®ã«ãŒããžãªã¯ãšã¹ããéãããå®éã®é¢æ°ã¯ãµãŒããŒäžã§å®è¡ãããã·ãªã¢ã©ã€ãºãããçµæãåŒã³åºãå
ãžã¹ããªãŒãã³ã°ãããŠæ»ããŸãã
ãã®èšèšã«ã¯ããããã¯ã·ã§ã³ã³ãŒãã§ã颿¥ã§ãèŠããŠãã䟡å€ã®ããåž°çµãäžã€ãããŸãã第äžã«ãåŒæ°ãšæ»ãå€ã¯ã·ãªã¢ã©ã€ãºå¯èœã§ãªããã°ãªããŸããããšã³ã³ãŒãããããã€ããŒããšããŠãããã¯ãŒã¯ãè¶ããããã§ãã第äºã«ã颿°æ¬äœãã¯ã©ã€ã¢ã³ãåãã«ãã³ãã«ãããããšã¯ãªããããã·ãŒã¯ã¬ããã¯ãµãŒããŒäžã«çãŸããŸãã第äžã«ã<form> ã«çŽä»ããããã¢ã¯ã·ã§ã³ã¯ãã€ãã¬ãŒã·ã§ã³åã§ãåäœããŸãããããããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããäžæ žçãªå©ç¹ãšããçç±ã§ããå®è¡ã¢ãã«ã®å
šäœåã¯ãããŒã¿æŽæ°ã«é¢ãã Next.js ã®å
¬åŒã¬ã€ã ã«èšèŒãããŠããŸãã
ãã¹ãŠã® Server Action ã¯ã"use server" ãä»ãããã¡ã€ã«ãŸãã¯ãããã¯ã®äžã«ååšããŸããåäžã®ãã¥ãŒããŒã·ã§ã³ã¯æ¬¡ã®ããã«ãªããŸãã
"use server"
import { revalidatePath } from "next/cache"
import { redirect } from "next/navigation"
import { PostService } from "@/lib/services/post-service"
export async function createPost(formData: FormData) {
// FormData values arrive as strings; cast explicitly
const title = formData.get("title") as string
const body = formData.get("body") as string
// Run business logic through the service layer, never the ORM directly
const post = await PostService.create({ title, body })
// Purge the cached list so the next request refetches it
revalidatePath("/posts")
// Send the user to the freshly created resource
redirect(`/posts/${post.id}`)
}ãã®é¢æ°ã¯éä¿¡ããã FormData ãèªã¿åãããµãŒãã¹å±€ãéããŠæ°žç¶åãããã£ãã·ã¥ãããäžèЧãç¡å¹åããŠãªãã€ã¬ã¯ãããŸãããããã®ã©ãäžã€ãšããŠã¯ã©ã€ã¢ã³ãåŽã® JavaScript ãå¿
èŠãšããŸããã
ã¯ã©ã€ã¢ã³ã JavaScript ãªãã§ Server Action ããã©ãŒã ãžæ¥ç¶ãã
ã¢ã¯ã·ã§ã³ããã©ãŒã ã® action ããããã£ã«æž¡ãã®ãæãã·ã³ãã«ãªçµ±åæ¹æ³ã§ããNext.js ã¯éä¿¡å
容ã FormData ãžã·ãªã¢ã©ã€ãºãããµãŒããŒäžã§é¢æ°ãåŒã³åºããŸããããã¯ãã€ãã£ãã®ãã©ãŒã éä¿¡ã®ä»çµã¿ã䜿ããããJavaScript ãç¡å¹ã§ãæ©èœããããŒãžããã€ãã¬ãŒã·ã§ã³ããããšã·ãŒã ã¬ã¹ã«ã¢ããã°ã¬ãŒããããŸãã
import { createPost } from "./actions"
export default function NewPostForm() {
return (
<form action={createPost}>
<input name="title" required />
<textarea name="body" required />
<button type="submit">Publish</button>
</form>
)
}åãã£ãŒã«ãã® name 屿§ããformData.get() ã§èªã¿åãããããŒã«ãªããŸãããã©ãŠã¶ããã©ãŒã ãããã®ãªããžã§ã¯ããã©ã®ããã«çµã¿ç«ãŠããã¯ãMDN ã® FormData ãªãã¡ã¬ã³ã¹ ã説æããŠããŸãããã现ããªå¶åŸ¡ãå¿
èŠãªå Žåãnext/form ã¯åãã¢ã¯ã·ã§ã³ããŒã¹ã®å¥çŽãä¿ã¡ãªããããã€ãã£ãèŠçŽ ã«ã¯ã©ã€ã¢ã³ããµã€ãããã²ãŒã·ã§ã³ãšããªãã§ããã远å ããŸãã
useActionState ã§ pending ç¶æ ãšãšã©ãŒç¶æ ã管çãã
å®éçšã®ãã©ãŒã ã«ã¯ãããªããŒã·ã§ã³ã®ãã£ãŒãããã¯ãšããŒãã£ã³ã°ã€ã³ãžã±ãŒã¿ãŒãæ¬ ãããŸãããReact 19 ã®ãã㯠useActionState 㯠Server Action ãã©ããããåéä¿¡ãéã㊠state å€ãåãæž¡ããisPending ãã©ã°ãå
¬éããŸããããã¯ä»¥åã® useFormState ãšããåç§°ã«åã£ãŠä»£ãããã®ã§ãããçŸåšã® stateãã©ãããããã¢ã¯ã·ã§ã³ããã㊠pending ã瀺ãçåœå€ã®ã¿ãã«ãè¿ããŸãã
"use client"
import { useActionState } from "react"
import { createPost } from "./actions"
const initialState = { error: "" }
export default function NewPostForm() {
// state carries the last return value; isPending tracks the in-flight request
const [state, formAction, isPending] = useActionState(createPost, initialState)
return (
<form action={formAction}>
<input name="title" required />
<textarea name="body" required />
{state.error ? <p role="alert">{state.error}</p> : null}
<button type="submit" disabled={isPending}>
{isPending ? "Publishing..." : "Publish"}
</button>
</form>
)
}ããã¯ãã¢ã¯ã·ã§ã³ãé§åããå Žåã颿°ã®ã·ã°ããã£ã¯ FormData ã®åã« prevState ãšãã第äžåŒæ°ãæã€ããã«ãªããŸããäŸå€ãã¹ããŒãã代ããã«ãªããžã§ã¯ããè¿ãããšã§ãã³ã³ããŒãã³ãã¯ãšã©ãŒããŠã³ããªãªãã§ã€ã³ã©ã€ã³ããªããŒã·ã§ã³ãæç»ã§ããŸãã
"use server"
import { revalidateTag } from "next/cache"
import { PostService } from "@/lib/services/post-service"
type FormState = { error: string }
export async function createPost(
prevState: FormState,
formData: FormData,
): Promise<FormState> {
const title = formData.get("title") as string
// Validate on the server; client validation is never trustworthy alone
if (!title || title.length < 3) {
return { error: "Title must be at least 3 characters." }
}
await PostService.create({ title })
// Invalidate by tag rather than path for finer-grained control
revalidateTag("posts")
return { error: "" }
}react.dev ã® useActionState ãªãã¡ã¬ã³ã¹ ã§ã¯ããã€ãã¬ãŒã·ã§ã³åã®éä¿¡ã«å¯Ÿãã permalink ãµããŒããšãã£ãé«åºŠãªãã¿ãŒã³ãæ±ãããŠããŸããæ§é åããã state ãè¿ãããšã§ãæ£åžžç³»ãšãšã©ãŒç³»ãäºæž¬å¯èœãªäžç®æã«ãŸãšããããŸãã
revalidatePath ãš revalidateTagïŒæ£ããç¡å¹åæ¹æ³ãéžã¶
ãã¥ãŒããŒã·ã§ã³ã¯ä»äºã®ååã«ãããŸãããUI ããã®çµæãåæ ããªããã°ãªããªãã®ã§ããNext.js 㯠next/cache ããäºã€ã®ç¡å¹å颿°ãå
¬éããŠãããæ£ããæ¹ãéžã¶ããšã¯é¢æ¥ã§é »åºã®å€å¥ãã€ã³ãã«ãªããŸãã
| 颿° | ç¡å¹åã®å¯Ÿè±¡ | é©ããå Žé¢ |
|----------|-------------|-----------|
| revalidatePath("/posts") | ããã«ãŒãã«å¯Ÿãããã¹ãŠã®ãã£ãã·ã¥ãšã³ã㪠| ãã¥ãŒããŒã·ã§ã³ãäžã€ã®æç¢ºãªããŒãžãŸãã¯ã¬ã€ã¢ãŠãã«åœ±é¿ããå Žå |
| revalidateTag("posts") | ãã®ã¿ã°ãä»äžããããã¹ãŠã®ãã£ãã·ã¥æžã¿ fetch | åãããŒã¿ãè€æ°ã®ã«ãŒãã«çŸããå Žå |
revalidatePath ã¯ç²ããã«ãŒãäžå¿ã§ããURL ãšãã®ã¬ã€ã¢ãŠãããªãŒã®ãã£ãã·ã¥ãã¯ãªã¢ããŸããrevalidateTag ã¯çްãããããŒã¿äžå¿ã§ãããã®æååã§ã¿ã°ä»ãããã fetch ããã£ãã·ã¥æžã¿é¢æ°ã¯ãã©ãã«ååšããŠããŠãç¡å¹åãããŸããã¿ã°ã¯å€§èŠæš¡ã¢ããªã§ããããã¹ã±ãŒã«ããŸããäžåºŠã®ãã¥ãŒããŒã·ã§ã³ã§ããµã€ãããŒãäžèЧããããŠè©³çްããŒãžãåäžã®åŒã³åºãã§æŽæ°ã§ããããã§ããã©ã¡ãã®é¢æ°ãããŒã¿ãå³åº§ã«åååŸããã®ã§ã¯ãªããå€ãïŒstaleïŒãšããŒã¯ããŸãããã®ãããæ¬¡ã®ãªã¯ãšã¹ãã§ã³ã³ãã³ããåçæãããŸãã
Next.js 16 ã® Cache Components ã§ã¯ãã¿ã°ä»ãã cacheTag ãéã㊠"use cache" ãã£ã¬ã¯ãã£ããšçµ±åãããã¢ããªå
šäœã§ãã£ãã·ã¥ãã©ãæããããå€ãããŸãããã®çžäºäœçšã«ã€ããŠã¯ãSharpSkill ã® Next.js 16 Cache Components ã¬ã€ã ã§è©³ãã解説ããŠããŸãã
React / Next.jsã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
useOptimistic ã«ããæ¥œèгç UI æŽæ°
ãããã¯ãŒã¯ã®åŸåŸ©ã¯ãç¥èŠã§ããã»ã©ã®ã¬ã€ãã³ã·ãå ããŸããuseOptimistic ããã¯ã¯æåŸ
ãããçµæãå³åº§ã«æç»ãããã®åŸã¢ã¯ã·ã§ã³ã解決ããæç¹ã§ãµãŒããŒã®ã¬ã¹ãã³ã¹ãšæŽåãããŸããçŸåšã® state ãšã楜芳çãªããŒãžã§ã³ãçæãããªãã¥ãŒãµãŒãåãåããŸãã
"use client"
import { useOptimistic } from "react"
import { likePost } from "./actions"
export function LikeButton({ postId, likes }: { postId: string; likes: number }) {
// optimisticLikes updates before the server confirms
const [optimisticLikes, addOptimisticLike] = useOptimistic(
likes,
(current) => current + 1,
)
async function handleLike() {
addOptimisticLike(null) // update the UI immediately
await likePost(postId) // then run the real mutation
}
return (
<form action={handleLike}>
<button type="submit">Like ({optimisticLikes})</button>
</form>
)
}ã¢ã¯ã·ã§ã³ã倱æããå ŽåãReact ã¯æ¥œèгçãªå€ãç¢ºå®æžã¿ã®ãµãŒã㌠state ãžèªåçã«æ»ããããæåã§ã®ããŒã«ããã¯ã¯äžèŠã§ããreact.dev ã® useOptimistic ãªãã¡ã¬ã³ã¹ ã§ã¯ãæŽåãµã€ã¯ã«ããã©ã³ãžã·ã§ã³ãšã©ãçžäºäœçšãããã詳述ãããŠããŸãããã®ãã¿ãŒã³ããããServer Action ã®ãã©ãŒã ããå®å šã«ã¯ã©ã€ã¢ã³ãã¬ã³ããªã³ã°ããã SPA ãšåããããåå¿ã®è¯ããã®ã«æãããããã®ã§ãã
åŒæ°ã®ãã€ã³ããšã€ãã³ããã³ãã©ããã®ã¢ã¯ã·ã§ã³åŒã³åºã
ãã¹ãŠã®ãã¥ãŒããŒã·ã§ã³ããã©ãŒã éä¿¡ããå§ãŸãããã§ã¯ãããŸãããè¡ã®åé€ãèšå®ã®åãæ¿ãããªã¹ãã®äžŠã¹æ¿ãã¯ãå€ãã®å Žåãã¿ã³ã®ã¯ãªãã¯ããã®ä»ã®ã€ãã³ãããçºç«ããŸããServer Action ã¯ã¯ã©ã€ã¢ã³ãäžã§ã¯éåžžã®é¢æ°åç §ãªã®ã§ãä»»æã®ãã³ãã©ããåŒã³åºããŸãããã ããUI ã®å¿çæ§ãä¿ã€ããã«ããã®åŒã³åºãã¯ãã©ã³ãžã·ã§ã³å ã§å®è¡ããå¿ èŠããããŸãã
ãã©ãŒã ãã£ãŒã«ãã§ã¯ãªã远å ã®åŒæ°ã¯ bind ã§ä»äžããŸããããã¯ããããã®å€ãå
é ã«ä»ããæ°ããã¢ã¯ã·ã§ã³ãçæããŸããéä¿¡ããã FormData ãšäžŠã¹ãŠ ID ãæž¡ãéã®æ
£çšçãªæ¹æ³ã§ãã
"use client"
import { useTransition } from "react"
import { deletePost, updatePost } from "./actions"
export function PostActions({ postId }: { postId: string }) {
const [isPending, startTransition] = useTransition()
// Bind the id so the action receives it before FormData
const updateWithId = updatePost.bind(null, postId)
return (
<div>
<form action={updateWithId}>
<input name="title" />
<button type="submit">Save</button>
</form>
{/* Event-handler invocation wrapped in a transition */}
<button
onClick={() => startTransition(() => deletePost(postId))}
disabled={isPending}
>
{isPending ? "Deleting..." : "Delete"}
</button>
</div>
)
}ãã€ã³ããããåŒæ°ã¯ãä»ã®ã¯ããŒãºãªãŒããŒãããå€ãšåæ§ã«æå·åããããããpostId ã転éäžã«æ¹ãããããããšã¯ãããŸããããšã¯ãããã¢ã¯ã·ã§ã³ã¯åŒã³åºãå
ããã®ã¬ã³ãŒããæäœããŠããããäŸç¶ãšããŠç¢ºèªããªããã°ãªããŸãããçŽæ¥ã®åŒã³åºãã startTransition ã§ã©ããããã°ãReact ã¯ã€ã³ã¿ãŒãã§ãŒã¹ãã€ã³ã¿ã©ã¯ãã£ãã«ä¿ã¡ããã©ãŒã ã®ã©ãããŒãªãã§ pending ç¶æ
ã衚é¢åã§ããŸãã
Server Actions ã®ã»ãã¥ãªãã£ïŒãã¹ãŠã®ã¢ã¯ã·ã§ã³ãå ¬é API ãšããŠæ±ã
æãå±éºãªèª€è§£ã¯ãServer Action ã¯ãµãŒããŒã³ãŒãã®é£ã«æžãããŠãããããã©ã€ããŒãã ããšãããã®ã§ããå®éã«ã¯ãã¢ã¯ã·ã§ã³ãäžåºŠäœ¿ããããšãNext.js ã¯èª°ã§ã现工ãããªã¯ãšã¹ãã§åŒã³åºããå
¬é POST ãšã³ããã€ã³ããçæããŸãããã¬ãŒã ã¯ãŒã¯ã¯å®å
šãªã¢ã¯ã·ã§ã³ ID ãæäŸããnext build ã®éã«æªäœ¿çšã®ã¢ã¯ã·ã§ã³ãæé€ããŸãããåŒã³åºãå
ãèªå¯ããããšã¯ãããŸããã
Server Actions ã¯å°éå¯èœãª HTTP ãšã³ããã€ã³ãã§ããã¬ã€ã¢ãŠããããã«ãŠã§ã¢ã§ã®ã»ãã·ã§ã³ãã§ãã¯ã¯ããããä¿è·ããŸãããæ»æè ã¯ã¢ã¯ã·ã§ã³ãžçŽæ¥ POST ã§ããããã§ããããŒã¿ã«è§Šããåã«ãã¢ã¯ã·ã§ã³æ¬äœã®äžã§ã»ãã·ã§ã³ãšåŒã³åºãå ã®æš©éãæ€èšŒããŠãã ããã
"use server"
import { auth } from "@/lib/auth"
import { headers } from "next/headers"
import { UserService } from "@/lib/services/user-service"
export async function deleteUser(userId: string) {
// Authenticate on every invocation, not in a wrapper component
const session = await auth.api.getSession({ headers: await headers() })
if (!session || session.user.role !== "admin") {
throw new Error("Unauthorized")
}
await UserService.delete(userId)
}ããã«äºã€ã®ã«ãŒã«ãéèŠã§ããã€ã³ã©ã€ã³ã¢ã¯ã·ã§ã³ã«ãã£ãŠã¯ããŒãºãªãŒããŒãããå€ã¯ãã¯ã©ã€ã¢ã³ããžéä¿¡ãããåã«æå·åããããµãŒããŒäžã§åŸ©å·ãããŸãããã®ãããã£ããã£ãããããŒã¯ã³ãå¹³æã§æŒããããšã¯ãããŸããããããã«äŸåããã®ã¯è匱ã§ããã·ãŒã¯ã¬ããã¯ã¯ããŒãžã£ããå®å šã«æé€ããŠãã ããããããŠãã¯ã©ã€ã¢ã³ãããæ¥ãåŒæ°ã¯ãã¹ãŠä¿¡é Œã§ããªãå ¥åã§ãããREST ã®ããã£ãšãŸã£ããåãããã«æ€èšŒããªããã°ãªããŸãããNext.js ã®ããŒã¿ã»ãã¥ãªãã£ã¬ã€ã ã¯ããããã®ä¿èšŒã®èåŸã«ãã taint ã¢ãã«ãå®åŒåããŠããŸãããããã®ãã¬ãŒããªããäœç³»çã«ç·Žç¿ããã«ã¯ãSharpSkill ã® Next.js Server Actions 颿¥ã¢ãžã¥ãŒã« ããæ¡çšããã«ãå°ãããŸãã«ãã®è³ªåãéããŠãããŸãã
Next.js 16 Server Actions ã®é¢æ¥è³ªå
ãããã®è³ªåã¯ã2026 幎ã®ã·ã㢠React ããã³ãã«ã¹ã¿ãã¯ã®é¢æ¥ã«ãŒãã§ç¹°ãè¿ãç»å ŽããŸãã
ãªã Server Action ã¯ã·ãªã¢ã©ã€ãºå¯èœãªå€ããåãåãããè¿ããªãã®ãã åŒæ°ãšçµæãããšã³ã³ãŒãããããã€ããŒããšããŠã¯ã©ã€ã¢ã³ããšãµãŒããŒã®éã®ãããã¯ãŒã¯å¢çãè¶ããããã§ãã颿°ãã¯ã©ã¹ã€ã³ã¹ã¿ã³ã¹ãDOM ããŒãã¯ã·ãªã¢ã©ã€ãºã§ããªããããããããæž¡ããšäŸå€ãã¹ããŒãããŸããFormDataããã¬ãŒã³ãªããžã§ã¯ããé
åãããªããã£ãã¯å®å
šã§ãã
Server Actions ã§ã¯ããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãã¯ã©ãæ©èœããã®ãã ã¢ã¯ã·ã§ã³ããã©ãŒã ã® action ããããã£ãžçŽæ¥æž¡ããšããã©ãŠã¶ã¯ React ã®ãã€ãã¬ãŒã·ã§ã³åã§ã POST ãªã¯ãšã¹ãã§ãã©ãŒã ããã€ãã£ãã«éä¿¡ããŸããNext.js ããããã€ã³ã¿ãŒã»ããããŠãµãŒããŒãµã€ãã§ã¢ã¯ã·ã§ã³ãå®è¡ããããããã©ãŒã ã¯ã¯ã©ã€ã¢ã³ã JavaScript ãªãã§æ©èœãããã€ãã¬ãŒã·ã§ã³åŸã«ã¯ã¯ã©ã€ã¢ã³ãé§åã®äœéšãžã¢ããã°ã¬ãŒããããŸãã
ã¢ã¯ã·ã§ã³ã§ãšã©ãŒãã¹ããŒããããšãšè¿ãããšã®éãã¯äœãã ã¹ããŒã¯æãè¿ããšã©ãŒããŠã³ããªãžäŒæããäºæããªã倱æã«é©ããŠããŸããuseActionState ãéããŠæ§é åããã state ãªããžã§ã¯ããè¿ãã®ã¯ããã©ãŒã ãã¢ã³ããŠã³ãããã«ã€ã³ã©ã€ã³ã§æç»ãããã¹ããæ³å®å
ã®ããªããŒã·ã§ã³ãšã©ãŒã«é©ããŠããŸãã
revalidatePath ãåŒã¶ãšããŒã¿ã¯å³åº§ã«åååŸãããã®ãã ãããããã£ãã·ã¥ãšã³ããªãå€ãïŒstaleïŒãšããŒã¯ããæ¬¡ã®ãªã¯ãšã¹ãã§ããããåçæãããŸããçŸåšã®ã¬ã¹ãã³ã¹ã¯åœ±é¿ãåããŸãããã ããããããã¥ãŒããŒã·ã§ã³åŸã®ãªãã€ã¬ã¯ãã¯æ°ããæç»ãããã³ã³ãã³ãã«çå°ããŸãã
ãããã®ãã¥ãŒããŒã·ã§ã³ãå®è¡ããããããåºç¯ãªã¬ã³ããªã³ã°ã®æèã«ã€ããŠã¯ããããã¯ã·ã§ã³ã«ããã React 19 Server Components ã®è§£èª¬ããServer Actions ã®ç¥èãšèªç¶ã«çµã¿åããããŸãã
React / Next.jsã®é¢æ¥å¯Ÿçã¯ã§ããŠããŸããïŒ
ã€ã³ã¿ã©ã¯ãã£ããªã·ãã¥ã¬ãŒã¿ãŒãflashcardsãæè¡ãã¹ãã§ç·Žç¿ããŸãããã
ãŸãšã
Next.js 16 ã® Server Actions ã¯ããã¥ãŒããŒã·ã§ã³ããªããªããŒã·ã§ã³ããããŠããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ãããåäžã®ãµãŒããŒãã¡ãŒã¹ããªããªããã£ããžãšçµ±åããŸããèŠç¹ã¯æ¬¡ã®ãšããã§ãã
- ãã¥ãŒããŒã·ã§ã³ã«ã¯
"use server"ãä»ãããã©ãŒã ã®actionããããã£ãžæž¡ãããšã§ããããã¯ãŒã¯åŠçãšããã°ã¬ãã·ããšã³ãã³ã¹ã¡ã³ããç¡åã§åŸãããŸãã - pending ãšããªããŒã·ã§ã³ã® state ã¯
useActionStateã§é§åããæ³å®å ã®ãšã©ãŒã§ã¯ã¹ããŒããã«æ§é åãªããžã§ã¯ããè¿ããŸãã - 倿Žãäžã€ã®ã«ãŒãã«åã¶ãšãã¯
revalidatePathããåãããŒã¿ãè€æ°ã®ã«ãŒãã«ãŸããããšãã¯revalidateTagãéžã³ãŸãã useOptimisticã䜿ã£ãŠæåŸ ãããçµæãå³åº§ã«æç»ããReact ã«æŽåãŸãã¯ããŒã«ããã¯ãèªåã§ä»»ããŸãã- åã¢ã¯ã·ã§ã³ã¯ããã«ãŠã§ã¢ã ãã§ã¯ä¿è·ãããªãå ¬é HTTP ãšã³ããã€ã³ããªã®ã§ããã¹ãŠã®ã¢ã¯ã·ã§ã³æ¬äœã®å éšã§èªå¯ãšæ€èšŒãè¡ããŸãã
ä»ããç·Žç¿ãå§ããŸãããïŒ
颿¥ã·ãã¥ã¬ãŒã¿ãŒãšæè¡ãã¹ãã§ç¥èããã¹ãããŸãããã
ã¿ã°
å ±æ
é¢é£èšäº

Next.js 16 Cache Components å®å šã¬ã€ãïŒuse cacheã»PPRã»é¢æ¥å¯Ÿçã2026å¹Žææ°ã
Next.js 16ã§æ£åŒå°å ¥ãããCache Componentsã®å šæ©èœãç¶²çŸ çã«è§£èª¬ãuse cacheãã£ã¬ã¯ãã£ããcacheLifeã»cacheTagã«ãããã£ãã·ã¥å¶åŸ¡ãPPRãšã®é£æºãã¿ãŒã³ãã»ãã¥ãªãã£èšèšããããŠæè¡é¢æ¥ã§åãããé »åºåé¡ãšæš¡ç¯åçãåé²ããå®è·µã¬ã€ãã§ãã

React Compiler 2026幎çïŒèªåã¡ã¢åã®ä»çµã¿ãšé¢æ¥å¯Ÿçã®å®å šã¬ã€ã
React Compiler v1.0ã®èªåã¡ã¢åã®å éšæ§é ãã³ã³ãã€ã«ãã€ãã©ã€ã³ãæåæé©åãå¿ èŠãªã±ãŒã¹ã解説ã2026幎ã®Reactæè¡é¢æ¥ã§åããããã€ã³ããç¶²çŸ çã«ã«ããŒããŸãã

React 19 useEffectEventãšActivity培åºè§£èª¬: æ°APIã»å®è£ ãã¿ãŒã³ã»é¢æ¥å¯Ÿç2026
React 19.2ã§å°å ¥ãããuseEffectEventãšActivityã³ã³ããŒãã³ãã®åäœåçãå®è£ ãã¿ãŒã³ã颿¥é »åºåé¡ãäœç³»çã«è§£èª¬ããŸãã