React Server Components (RSC) ã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãå©ç¹ãå®è£ æŠç¥ãæ¢æ±ããããé«éã§å¹ççãªãŠã§ãã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããŸããSEOã®åäžãããã©ãŒãã³ã¹ã®æ¹åãéçºã¯ãŒã¯ãããŒã®ç°¡çŽ åãåŠã³ãŸãããã
React Server Components: ã¢ãã³ãŠã§ãéçºã®ããã®ã¢ãŒããã¯ãã£ãã¿ãŒã³
React Server Components (RSCs) ã¯ãReact éçºã«ããããã©ãã€ã ã·ããã衚ããããé«éã§å¹ççãã〠SEO ãã¬ã³ããªãŒãª Web ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªæ¹æ³ãæäŸããŸãããã®èšäºã§ã¯ãRSCs ã«ãã£ãŠå®çŸãããã¢ãŒããã¯ãã£ãã¿ãŒã³ã«ã€ããŠæãäžãããã®é©æ°çãªãã¯ãããžãŒã掻çšããããšããŠããéçºè åãã®å æ¬çãªã¬ã€ããæäŸããŸãã
React Server Components ãšã¯
åŸæ¥ã® React ã¢ããªã±ãŒã·ã§ã³ã¯ãã¯ã©ã€ã¢ã³ããµã€ãã¬ã³ããªã³ã° (CSR) ã«å€§ããäŸåããããšãå€ãããã©ãŠã¶ã JavaScript ãã³ãã«ãããŠã³ããŒãã㊠UI ãã¬ã³ããªã³ã°ããŸããããã¯ãç¹ã«æåã®ããŒãžèªã¿èŸŒã¿ãš SEO ã§ããã©ãŒãã³ã¹ã®ããã«ããã¯ã«ã€ãªããå¯èœæ§ããããŸããäžæ¹ãRSCs ã䜿çšãããšããµãŒããŒäžã§ã³ã³ããŒãã³ããã¬ã³ããªã³ã°ããã¬ã³ããªã³ã°ããã HTML ã®ã¿ãã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ããŸãããã®ã¢ãããŒãã¯ãããã©ãŒãã³ã¹ãš SEO ãå€§å¹ ã«åäžãããŸãã
React Server Components ã®äž»ãªç¹åŸŽ:
- ãµãŒããŒãµã€ãã¬ã³ããªã³ã°: RSCs ã¯ãµãŒããŒäžã§ã¬ã³ããªã³ã°ãããã¯ã©ã€ã¢ã³ããµã€ãã® JavaScript ãã³ãã«ã®ãµã€ãºãåæžããæåã®ããŒãžèªã¿èŸŒã¿æéãæ¹åããŸãã
- ã¯ã©ã€ã¢ã³ããµã€ã JavaScript ãŒã: äžéšã® RSCs ã¯ãµãŒããŒäžã§å®å šã«ã¬ã³ããªã³ã°ã§ãããããã¯ã©ã€ã¢ã³ããµã€ãã® JavaScript ã¯å¿ èŠãããŸãããããã«ããããã³ãã«ãµã€ãºãããã«åæžãããããã©ãŒãã³ã¹ãåäžããŸãã
- çŽæ¥ããŒã¿ã¢ã¯ã»ã¹: RSCs ã¯ãããŒã¿ããŒã¹ããã¡ã€ã«ã·ã¹ãã ãªã©ã®ãµãŒããŒãµã€ãã®ãªãœãŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ã§ãããããAPI åŒã³åºããäžèŠã«ãªããŸãã
- ã¹ããªãŒãã³ã°: RSCs ã¯ã¹ããªãŒãã³ã°ããµããŒãããŠããããµãŒããŒã¯ HTML ãå©çšå¯èœã«ãªã次第ããã£ã³ã¯åäœã§ã¯ã©ã€ã¢ã³ãã«éä¿¡ã§ãããããç¥èŠããã©ãŒãã³ã¹ãåäžããŸãã
- éšåãã€ãã¬ãŒã·ã§ã³: ã€ã³ã¿ã©ã¯ãã£ããªã³ã³ããŒãã³ãã®ã¿ãã¯ã©ã€ã¢ã³ãäžã§ãã€ãã¬ãŒãããå¿ èŠããããããããŒãžãã€ã³ã¿ã©ã¯ãã£ãã«ããããã«å¿ èŠãª JavaScript ã®éãåæžãããŸãã
React Server Components ã䜿çšããå©ç¹
RSCs ãæ¡çšãããšãWeb éçºãããžã§ã¯ãã«ããã€ãã®éèŠãªå©ç¹ãããããå¯èœæ§ããããŸãã
- ããã©ãŒãã³ã¹ã®åäž: ã¯ã©ã€ã¢ã³ããµã€ãã® JavaScript ãã³ãã«ãµã€ãºã®åæžãšãµãŒããŒãµã€ãã¬ã³ããªã³ã°ã«ãããæåã®ããŒãžèªã¿èŸŒã¿æéãççž®ãããã¢ããªã±ãŒã·ã§ã³å šäœã®ããã©ãŒãã³ã¹ãåäžããŸãã
- SEO ã®åŒ·å: ãµãŒããŒã¬ã³ããªã³ã°ããã HTML ã¯æ€çŽ¢ãšã³ãžã³ã«ãã£ãŠç°¡åã«ã¯ããŒã«ãããSEO ã©ã³ãã³ã°ãåäžããŸãã
- éçºã®ç°¡çŽ å: çŽæ¥ããŒã¿ã¢ã¯ã»ã¹ã«ãããè€é㪠API çµ±åãäžèŠã«ãªããããŒã¿ãã§ããããžãã¯ãç°¡çŽ åãããŸãã
- ããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹: ããéãèªã¿èŸŒã¿æéãšã€ã³ã¿ã©ã¯ãã£ããã£ã®åäžã«ãããããã¹ã ãŒãºã§é åçãªãŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸãããŸãã
- ã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã¹ãã®åæž: ã¯ã©ã€ã¢ã³ããµã€ãã®åŠçãå°ãªããšããŠãŒã¶ãŒããã€ã¹ãžã®è² è·ã軜æžãããã€ã³ãã©ã¹ãã©ã¯ãã£ã³ã¹ããåæžãããå¯èœæ§ããããŸãã
React Server Components ã䜿çšããã¢ãŒããã¯ãã£ãã¿ãŒã³
React Server Components ãæŽ»çšããéã«ãããã€ãã®ã¢ãŒããã¯ãã£ãã¿ãŒã³ãç»å ŽããŸãããããã®ãã¿ãŒã³ãçè§£ããããšã¯ã广ç㪠RSC ããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ãèšèšããã³å®è£ ããããã«äžå¯æ¬ ã§ãã
1. ãã€ããªããã¬ã³ããªã³ã°: ãµãŒããŒã³ã³ããŒãã³ã + ã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ã
ããã¯ãæãäžè¬çã§å®çšçãªãã¿ãŒã³ã§ããåãã¢ããªã±ãŒã·ã§ã³å ã§ããµãŒããŒã³ã³ããŒãã³ããšã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ããçµã¿åãããŸãããµãŒããŒã³ã³ããŒãã³ãã¯ãããŒã¿ã®ãã§ãããš UI ã®éçéšåã®ã¬ã³ããªã³ã°ãåŠçããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã¯ãã¯ã©ã€ã¢ã³ãåŽã®ã€ã³ã¿ã©ã¯ãã£ããã£ãšç¶æ ã®æŽæ°ã管çããŸãã
äŸ:
eã³ããŒã¹ã®è£œåããŒãžãèããŠã¿ãŸãããã補åã®è©³çް (ååã説æãäŸ¡æ Œ) ã¯ãããŒã¿ããŒã¹ããããŒã¿ãçŽæ¥ãã§ãããããµãŒããŒã³ã³ããŒãã³ãã«ãã£ãŠã¬ã³ããªã³ã°ã§ããŸãããã«ãŒãã«è¿œå ããã¿ã³ã¯ããŠãŒã¶ãŒã€ã³ã¿ã©ã¯ã·ã§ã³ãå¿ èŠãšããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã«ãªããŸãã
// Server Component (ProductDetails.js)
import { db } from './db';
export default async function ProductDetails({ productId }) {
const product = await db.product.findUnique({ where: { id: productId } });
return (
<div>
<h2>{product.name}</h2>
<p>{product.description}</p>
<p>Price: ${product.price}</p>
<AddToCartButton productId={productId} /> <!-- Client Component -->
</div>
);
}
// Client Component (AddToCartButton.js)
'use client'
import { useState } from 'react';
export default function AddToCartButton({ productId }) {
const [quantity, setQuantity] = useState(1);
const handleAddToCart = () => {
// Logic to add product to cart
console.log(`Adding product ${productId} to cart with quantity ${quantity}`);
};
return (
<div>
<button onClick={handleAddToCart}>Add to Cart</button>
</div>
);
}
éèŠãªèæ ®äºé :
- ã³ã³ããŒãã³ãå¢ç: ãµãŒããŒã³ã³ããŒãã³ããšã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã®å¢çãæ éã«å®çŸ©ããŸããã¯ã©ã€ã¢ã³ãã«éä¿¡ããã JavaScript ã®éãæå°éã«æããŸãã
- ããŒã¿åãæž¡ã: ãµãŒããŒã³ã³ããŒãã³ãããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã«ããŒã¿ã props ãšããŠæž¡ããŸãããµãŒããŒã³ã³ããŒãã³ãããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã«é¢æ°ãæž¡ãããšã¯ãµããŒããããŠããŸããã
- 'use client' ãã£ã¬ã¯ãã£ã: ã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã¯ãã¯ã©ã€ã¢ã³ãã§ã¬ã³ããªã³ã°ããå¿
èŠãããããšã瀺ãããã«ã
'use client'
ãã£ã¬ã¯ãã£ãã§ããŒã¯ããå¿ èŠããããŸãã
2. Suspense ã䜿çšããã¹ããªãŒãã³ã°
RSCs ã¯ãReact Suspense ãšçµã¿åãããããšã§ãã¹ããªãŒãã³ã°ã¬ã³ããªã³ã°ãå¯èœã«ããŸããããã¯ããµãŒããŒã HTML ãã¯ã©ã€ã¢ã³ãã«ãã£ã³ã¯åäœã§éä¿¡ã§ããããšãæå³ããç¹ã«é ãããŒã¿äŸåé¢ä¿ãæã€è€éãªããŒãžã®å Žåãç¥èŠããã©ãŒãã³ã¹ãåäžããŸãã
äŸ:
ãœãŒã·ã£ã«ã¡ãã£ã¢ãã£ãŒããæ³åããŠã¿ãŠãã ãããSuspense ã䜿çšããŠãåã ã®æçš¿ãååŸããŠããéã«ããŒãã£ã³ã°ç¶æ ã衚瀺ã§ããŸããåæçš¿ããµãŒããŒäžã§ã¬ã³ããªã³ã°ããããšãã¯ã©ã€ã¢ã³ãã«ã¹ããªãŒãã³ã°ãããæ®µéçã«èªã¿èŸŒãŸãããšã¯ã¹ããªãšã³ã¹ãæäŸãããŸãã
// Server Component (Feed.js)
import { Suspense } from 'react';
import Post from './Post';
export default async function Feed() {
const postIds = await getPostIds();
return (
<div>
{postIds.map((postId) => (
<Suspense key={postId} fallback={<p>Loading post...</p>}>
<Post postId={postId} />
</Suspense>
))}
</div>
);
}
// Server Component (Post.js)
import { db } from './db';
async function getPost(postId) {
// Simulate a slow data fetch
await new Promise(resolve => setTimeout(resolve, 1000));
const post = await db.post.findUnique({ where: { id: postId } });
return post;
}
export default async function Post({ postId }) {
const post = await getPost(postId);
return (
<div>
<h3>{post.title}</h3>
<p>{post.content}</p>
</div>
);
}
éèŠãªèæ ®äºé :
- Suspense å¢ç: ã³ã³ããŒãã³ãã
<Suspense>
ã§ã©ããããŠãã³ã³ããŒãã³ããèªã¿èŸŒãŸããŠããéã«è¡šç€ºããããã©ãŒã«ãã㯠UI ãå®çŸ©ããŸãã - ããŒã¿ãã§ãã: ããŒã¿ãã§ãã颿°ãéåæã§ããããµãŒããŒã³ã³ããŒãã³ãå ã§åŸ æ©ã§ããããšã確èªããŸãã
- ããã°ã¬ãã·ãããŒãã£ã³ã°: ããã°ã¬ãã·ãããŒãã£ã³ã°ãé©åã«åŠçããããè¯ããŠãŒã¶ãŒãšã¯ã¹ããªãšã³ã¹ãæäŸããããã« UI ãèšèšããŸãã
3. ãµãŒããŒã¢ã¯ã·ã§ã³: ãµãŒããŒã³ã³ããŒãã³ãããã®å€æŽ
ãµãŒããŒã¢ã¯ã·ã§ã³ã¯ããµãŒããŒäžã§å®è¡ãããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãããçŽæ¥åŒã³åºãããšãã§ãã颿°ã§ããããã«ããããµãŒããŒåŽã®ããžãã¯ãã¯ã©ã€ã¢ã³ãã«å ¬éããããšãªããå€æŽ (ãã©ãŒã ã®éä¿¡ãããŒã¿ã®æŽæ°ãªã©) ãåŠçããããã®å®å šã§å¹ççãªæ¹æ³ãæäŸãããŸãã
äŸ:
ãåãåãããã©ãŒã ãèããŠã¿ãŸãããããã©ãŒã èªäœã¯ã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã§ããããŠãŒã¶ãŒå ¥åãèš±å¯ããŸãããã©ãŒã ãéä¿¡ããããšããµãŒããŒã¢ã¯ã·ã§ã³ããµãŒããŒäžã§ããŒã¿ã®åŠçãšé»åã¡ãŒã«ã®éä¿¡ãåŠçããŸãã
// Server Action (actions.js)
'use server'
import { revalidatePath } from 'next/cache';
export async function submitForm(formData) {
const name = formData.get('name');
const email = formData.get('email');
const message = formData.get('message');
// Simulate sending an email
console.log(`Sending email to ${email} with message: ${message}`);
// Revalidate the path to update the UI
revalidatePath('/contact');
return { message: 'Form submitted successfully!' };
}
// Client Component (ContactForm.js)
'use client'
import { useFormState } from 'react-dom';
import { submitForm } from './actions';
export default function ContactForm() {
const [state, formAction] = useFormState(submitForm, { message: '' });
return (
<form action={formAction}>
<label htmlFor="name">Name:</label>
<input type="text" id="name" name="name" /><br/>
<label htmlFor="email">Email:</label>
<input type="email" id="email" name="email" /><br/>
<label htmlFor="message">Message:</label>
<textarea id="message" name="message"></textarea><br/>
<button type="submit">Submit</button>
<p>{state.message}</p>
</form>
);
}
éèŠãªèæ ®äºé :
- 'use server' ãã£ã¬ã¯ãã£ã: ãµãŒããŒã¢ã¯ã·ã§ã³ã¯ã
'use server'
ãã£ã¬ã¯ãã£ãã§ããŒã¯ããå¿ èŠããããŸãã - ã»ãã¥ãªãã£: ãµãŒããŒã¢ã¯ã·ã§ã³ã¯ãµãŒããŒäžã§å®è¡ãããæ©å¯æ§ã®é«ãæäœã®ããã®å®å šãªç°å¢ãæäŸããŸãã
- ããŒã¿æ€èšŒ: æªæã®ããå ¥åãé²ãããã«ããµãŒããŒã¢ã¯ã·ã§ã³å ã§åŸ¹åºçãªããŒã¿æ€èšŒãå®è¡ããŸãã
- ãšã©ãŒåŠç: ãµãŒããŒã¢ã¯ã·ã§ã³ã§å ç¢ãªãšã©ãŒåŠçãå®è£ ããŠãé害ãé©åã«åŠçããŸãã
- åæ€èšŒ:
revalidatePath
ãŸãã¯revalidateTag
ã䜿çšããŠã倿ŽãæåããåŸã« UI ãæŽæ°ããŸãã
4. ãªããã£ãã¹ãã£ãã¯ã¢ããããŒã
ãŠãŒã¶ãŒããµãŒããŒå€æŽãããªã¬ãŒããã¢ã¯ã·ã§ã³ãå®è¡ããå Žåããªããã£ãã¹ãã£ãã¯ã¢ããããŒãã䜿çšããŠãUI ãå³åº§ã«æŽæ°ããããå¿çæ§ã®é«ããšã¯ã¹ããªãšã³ã¹ãæäŸã§ããŸããããã«ã¯ã倿Žãæåãããšæ³å®ã㊠UI ãããã«å¿ããŠæŽæ°ãã倿Žã倱æããå Žåã¯å€æŽãå ã«æ»ãããšãå«ãŸããŸãã
äŸ:
ãœãŒã·ã£ã«ã¡ãã£ã¢ã®æçš¿ã®ããããããã¿ã³ãèããŠã¿ãŸãããããŠãŒã¶ãŒãããããããã¿ã³ãã¯ãªãã¯ãããšããµãŒããŒããããããã確èªããåã§ããUI ã§ãããæ°ãå³åº§ã«å¢ããããšãã§ããŸãããµãŒããŒãããããããåŠçã§ããªãã£ãå Žåã¯ãã«ãŠã³ããå ã«æ»ãããšãã§ããŸãã
å®è£ : ãªããã£ãã¹ãã£ãã¯ã¢ããããŒãã¯ãå€ãã®å ŽåããµãŒããŒã¢ã¯ã·ã§ã³ãšçµã¿åãããŠäœ¿çšãããŸãããµãŒããŒã¢ã¯ã·ã§ã³ã¯å®éã®å€æŽãåŠçããã¯ã©ã€ã¢ã³ãã³ã³ããŒãã³ãã¯ãªããã£ãã¹ãã£ã㯠UI ã®æŽæ°ãšæœåšçãªããŒã«ããã¯ã管çããŸãã
// Client Component (LikeButton.js)
'use client'
import { useState } from 'react';
import { likePost } from './actions'; // Assumes you have a Server Action named likePost
export default function LikeButton({ postId, initialLikes }) {
const [likes, setLikes] = useState(initialLikes);
const [isLiked, setIsLiked] = useState(false);
const handleLike = async () => {
// Optimistic Update
setLikes(prevLikes => prevLikes + (isLiked ? -1 : 1));
setIsLiked(!isLiked);
try {
await likePost(postId);
} catch (error) {
// Rollback if the server action fails
setLikes(prevLikes => prevLikes + (isLiked ? 1 : -1));
setIsLiked(isLiked);
console.error('Failed to like post:', error);
alert('Failed to like post. Please try again.');
}
};
return (
<button onClick={handleLike}>
{isLiked ? 'Unlike' : 'Like'} ({likes})
</button>
);
}
éèŠãªèæ ®äºé :
- ç¶æ 管ç: ãªããã£ãã¹ãã£ãã¯ã¢ããããŒããšãµãŒããŒã®å¿çãšã®äžè²«æ§ã確ä¿ããããã«ãUI ã®ç¶æ ãæ éã«ç®¡çããŸãã
- ãšã©ãŒåŠç: é害ãé©åã«åŠçããUI ãå ã«æ»ãããã«ãå ç¢ãªãšã©ãŒåŠçãå®è£ ããŸãã
- ãŠãŒã¶ãŒãã£ãŒãããã¯: UI ããªããã£ãã¹ãã£ãã¯ã«æŽæ°ãããŠããããšã瀺ããããŒã«ããã¯ãçºçããå Žåã¯ãŠãŒã¶ãŒã«éç¥ããããã®æç¢ºãªãŠãŒã¶ãŒãã£ãŒãããã¯ãæäŸããŸãã
5. ã³ãŒãåå²ãšåçã€ã³ããŒã
RSCs ã䜿çšããŠããµãŒããŒåŽã®ããžãã¯ã«åºã¥ããŠã³ã³ããŒãã³ããåçã«ã€ã³ããŒãããããšã«ãããã³ãŒãåå²ãããã«æé©åã§ããŸããããã«ãããç¹å®ã®ããŒãžãŸãã¯ã»ã¯ã·ã§ã³ã«å¿ èŠãªã³ãŒãã®ã¿ãèªã¿èŸŒãããšãã§ããåæãã³ãã«ãµã€ãºãåæžãããããã©ãŒãã³ã¹ãåäžããŸãã
äŸ:
ç°ãªããŠãŒã¶ãŒããŒã« (äŸ: 管çè ããšãã£ã¿ãŒããŠãŒã¶ãŒ) ãæã€ Web ãµã€ããèããŠã¿ãŸããããåçã€ã³ããŒãã䜿çšããŠããŠãŒã¶ãŒã管çè ã§ããå Žåã«ã®ã¿ã管çè åºæã®ã³ã³ããŒãã³ããèªã¿èŸŒãããšãã§ããŸãã
// Server Component (Dashboard.js)
import dynamic from 'next/dynamic';
async function getUserRole() {
// Fetch user role from database or authentication service
// Simulate a database call
await new Promise(resolve => setTimeout(resolve, 500));
return 'admin'; // Or 'editor' or 'user'
}
export default async function Dashboard() {
const userRole = await getUserRole();
let AdminPanel;
if (userRole === 'admin') {
AdminPanel = dynamic(() => import('./AdminPanel'), { suspense: true });
}
return (
<div>
<h2>Dashboard</h2>
<p>Welcome to the dashboard!</p>
{AdminPanel && (
<Suspense fallback={<p>Loading Admin Panel...</p>}>
<AdminPanel />
</Suspense>
)}
</div>
);
}
// Server Component or Client Component (AdminPanel.js)
export default function AdminPanel() {
return (
<div>
<h3>Admin Panel</h3>
<p>Welcome, Administrator!</p>
{/* Admin-specific content and functionality */}
</div>
);
}
éèŠãªèæ ®äºé :
- åçã€ã³ããŒã:
next/dynamic
(ãŸãã¯åæ§ã®ãŠãŒãã£ãªãã£) ããã®dynamic
颿°ã䜿çšããŠãã³ã³ããŒãã³ããåçã«ã€ã³ããŒãããŸãã - Suspense: åçã«ã€ã³ããŒããããã³ã³ããŒãã³ãã
<Suspense>
ã§ã©ããããŠãã³ã³ããŒãã³ããèªã¿èŸŒãŸããŠããéã«ãã©ãŒã«ãã㯠UI ãæäŸããŸãã - ãµãŒããŒåŽã®ããžãã¯: ãµãŒããŒåŽã®ããžãã¯ã䜿çšããŠãåçã«ã€ã³ããŒãããã³ã³ããŒãã³ããæ±ºå®ããŸãã
å®è·µçãªå®è£ ã«é¢ããèæ ®äºé
RSCs ã广çã«å®è£ ããã«ã¯ãç¶¿å¯ãªèšç»ãšçްéšãžã®æ³šæãå¿ èŠã§ããããã«ããã€ãã®å®è·µçãªèæ ®äºé ããããŸãã
1. é©åãªãã¬ãŒã ã¯ãŒã¯ã®éžæ
RSCs 㯠React ã®æ©èœã§ãããéåžžãNext.js ã Remix ãªã©ã®ãã¬ãŒã ã¯ãŒã¯å ã§å®è£ ãããŸãããããã®ãã¬ãŒã ã¯ãŒã¯ã¯ããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãã¹ããªãŒãã³ã°ãããã³ãµãŒããŒã¢ã¯ã·ã§ã³ã«å¿ èŠãªã€ã³ãã©ã¹ãã©ã¯ãã£ãæäŸããŸãã
- Next.js: RSCsããµãŒããŒã¢ã¯ã·ã§ã³ãã¹ããªãŒãã³ã°ãããŒã¿ãã§ãããªã©ãåªãããµããŒããæäŸããäžè¬ç㪠React ãã¬ãŒã ã¯ãŒã¯ã§ãã
- Remix: Web æšæºãéèŠãããµãŒããŒãµã€ãã¬ã³ããªã³ã°ãšããŒã¿ããŒãã£ã³ã°ã«å¯Ÿããå¥ã®ã¢ãããŒããæäŸããå¥ã® React ãã¬ãŒã ã¯ãŒã¯ã§ãã
2. ããŒã¿ãã§ããæŠç¥
RSCs ã䜿çšãããšããµãŒããŒåŽã®ãªãœãŒã¹ããçŽæ¥ããŒã¿ããã§ããã§ããŸããã¢ããªã±ãŒã·ã§ã³ã®ããŒãºã«åºã¥ããŠãé©åãªããŒã¿ãã§ããæŠç¥ãéžæããŸãã
- çŽæ¥ããŒã¿ããŒã¹ã¢ã¯ã»ã¹: RSCs ã¯ãORM ãŸãã¯ããŒã¿ããŒã¹ã¯ã©ã€ã¢ã³ãã䜿çšããŠãããŒã¿ããŒã¹ã«çŽæ¥ã¢ã¯ã»ã¹ã§ããŸãã
- API åŒã³åºã: RSCs ãã API åŒã³åºããè¡ãããšãã§ããŸãããããã¯éåžžãçŽæ¥ããŒã¿ããŒã¹ã¢ã¯ã»ã¹ã»ã©å¹ççã§ã¯ãããŸããã
- ãã£ãã·ã³ã°: åé·ãªããŒã¿ãã§ãããåé¿ããããã©ãŒãã³ã¹ãåäžãããããã«ããã£ãã·ã³ã°æŠç¥ãå®è£ ããŸãã
3. èªèšŒãšèªå¯
ãµãŒããŒåŽã®ãªãœãŒã¹ãä¿è·ããããã«ãå ç¢ãªèªèšŒããã³èªå¯ã¡ã«ããºã ãå®è£ ããŸãããµãŒããŒã¢ã¯ã·ã§ã³ã䜿çšããŠããµãŒããŒäžã®èªèšŒããã³èªå¯ããžãã¯ãåŠçããŸãã
4. ãšã©ãŒåŠçãšãã®ã³ã°
RSC ããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ã®åé¡ãç¹å®ããŠè§£æ±ºããããã«ãå æ¬çãªãšã©ãŒåŠçãšãã®ã³ã°ãå®è£ ããŸããtry-catch ãããã¯ã䜿çšããŠäŸå€ãåŠçãããšã©ãŒãäžå€®ãã®ã³ã°ã·ã¹ãã ã«èšé²ããŸãã
5. ãã¹ã
RSCs ãæ£ããæ©èœããŠããããšã確èªããããã«ã培åºçã«ãã¹ãããŸããåäœãã¹ãã䜿çšããŠåã ã®ã³ã³ããŒãã³ãããã¹ãããçµ±åãã¹ãã䜿çšããŠã³ã³ããŒãã³ãéã®çžäºäœçšããã¹ãããŸãã
ã°ããŒãã«ãªèŠç¹ãšäŸ
ã°ããŒãã«ãªèŠèŽè åãã« RSC ããŒã¹ã®ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããå Žåã¯ãããŒã«ã©ã€ãŒãŒã·ã§ã³ãšåœéåãèæ ®ããããšãäžå¯æ¬ ã§ãã
- ããŒã«ã©ã€ãŒãŒã·ã§ã³: ããŒã«ã©ã€ãŒãŒã·ã§ã³ã©ã€ãã©ãªã䜿çšããŠãUI ãããŸããŸãªèšèªã«ç¿»èš³ããŸãããŠãŒã¶ãŒã®ãã±ãŒã«ã«åºã¥ããŠãé©åãªç¿»èš³ãèªã¿èŸŒã¿ãŸãã
- åœéå: ããŸããŸãªæ¥ä»åœ¢åŒãé貚èšå·ãæ°å€åœ¢åŒããµããŒãããããã«ã¢ããªã±ãŒã·ã§ã³ãèšèšããŸãã
- äŸ: ã°ããŒãã«ã«è£œåã販売ãã e ã³ããŒã¹ãã©ãããã©ãŒã ã¯ãRSCs ã䜿çšããŠããŠãŒã¶ãŒã®ããŒã«ã«èšèªã§è£œåã®è©³çްãã¬ã³ããªã³ã°ãããŠãŒã¶ãŒã®ããŒã«ã«é貚ã§äŸ¡æ Œã衚瀺ããŸãã
çµè«
React Server Components ã¯ãææ°ã® Web ã¢ããªã±ãŒã·ã§ã³ãæ§ç¯ããããã®åŒ·åãªæ°ããæ¹æ³ãæäŸããŸãããã®èšäºã§èª¬æããã¢ãŒããã¯ãã£ãã¿ãŒã³ãšå®è£ ã«é¢ããèæ ®äºé ãçè§£ããããšã«ãããRSCs ãæŽ»çšããŠãããã©ãŒãã³ã¹ãåäžãããSEO ã匷åããéçºã¯ãŒã¯ãããŒãç°¡çŽ åã§ããŸãã RSC ãæ¡çšããäžçäžã®ãŠãŒã¶ãŒåãã«ã¹ã±ãŒã©ãã«ã§ããã©ãŒãã³ã¹ã®é«ã Web ãšã¯ã¹ããªãšã³ã¹ãæ§ç¯ããããã® React ã®å¯èœæ§ãæå€§éã«åŒãåºããŠãã ããã
詳现åŠç¿
- React ããã¥ã¡ã³ã: å ¬åŒã® React ããã¥ã¡ã³ãã§ã¯ãReact Server Components ã®è©³çŽ°ãªæŠèŠãæäŸãããŠããŸãã
- Next.js ããã¥ã¡ã³ã: Next.js ããã¥ã¡ã³ãã«ã¯ãNext.js ã§ã® RSCs ã®äœ¿çšã«é¢ããå æ¬çãªã¬ã€ããå«ãŸããŠããŸãã
- ãªã³ã©ã€ã³ã³ãŒã¹ãšãã¥ãŒããªã¢ã«: RSCs ã«ã€ããŠè©³ããåŠã¶ã®ã«åœ¹ç«ã€ã倿°ã®ãªã³ã©ã€ã³ã³ãŒã¹ãšãã¥ãŒããªã¢ã«ãå©çšå¯èœã§ãã