IT
📘

Next.js 15 App Router मास्टर गाइड — सर्वर कंपोनेंट्स बेस्ट प्रैक्टिस

USD/JPY分散は、為替急変局面で一方通貨の過大シェアを防ぎ、月次の再バランスと上限規則で感情的な一括投資を抑える実践設計です。

Next.js 15 App Router मास्टर गाइड — सर्वर कंपोनेंट्स बेस्ट प्रैक्टिस

Next.js 15 App Router मास्टर गाइड — सर्वर कंपोनेंट्स बेस्ट प्रैक्टिस

Next.js 15 का App Router React Server Components के चारों ओर एक नया पैरेडाइम है। 2026 के अनुसार प्रोडक्शन में प्रमाणित बेस्ट प्रैक्टिस का संकलन।

1. फ़ाइल सिस्टम संरचना

large gray ship sitting next body water
app/
  layout.tsx           # रूट लेआउट (अनिवार्य)
  page.tsx             # होम /
  loading.tsx          # लोडिंग UI
  error.tsx            # एरर सीमा
  not-found.tsx        # 404
  (marketing)/         # रूट समूह (URL पर प्रभाव नहीं)
    page.tsx
  blog/
    [slug]/
      page.tsx         # /blog/xxx
  api/
    route.ts           # REST एंडपॉइंट

रूट समूह (group): URL पर प्रभाव के बिना लेआउट साझा करने के लिए।

2. सर्वर बनाम क्लाइंट कंपोनेंट्स

fighter jet sitting on aircraft carrier

बुनियादी है सर्वर। "use client" को स्पष्ट करना आवश्यक है जब क्लाइंट हो।

tsx
// सर्वर कंपोनेंट (डिफ़ॉल्ट)
async function Page() {
  const user = await fetchUser()  // सीधे सर्वर से
  return <ProfileCard user={user} />
}

// क्लाइंट कंपोनेंट
"use client"
function InteractiveButton() {
  const [count, setCount] = useState(0)
  return <button onClick={() => setCount(count + 1)}>{count}</button>
}

सीमा सिद्धांत

  • "use client" को सबसे निचले पत्ते पर रखें
  • उसके ऊपर सर्वर कंपोनेंट बनाए रखें
  • props के माध्यम से भेजे जाने वाले मानों को सीरियलाइज़ किया जाना चाहिए (केवल JSON योग्य प्रकार)

3. डेटा फ़ेचिंग

tsx
// समानांतर फ़ेचिंग
async function Page({ params }) {
  const [user, posts] = await Promise.all([
    fetchUser(params.id),
    fetchPosts(params.id),
  ])
  return <Dashboard user={user} posts={posts} />
}

fetch स्वचालित कैशिंग:

  • fetch(url) — डिफ़ॉल्ट कैश
  • fetch(url, { cache: "no-store" }) — हर अनुरोध पर
  • fetch(url, { next: { revalidate: 60 } }) — 60 सेकंड ISR

4. सस्पेंस + स्ट्रीमिंग

tsx
import { Suspense } from "react"

export default function Page() {
  return (
    <>
      <FastSection />
      <Suspense fallback={<Skeleton />}> 
        <SlowSection />
      </Suspense>
    </>
  )
}

async function SlowSection() {
  await new Promise(r => setTimeout(r, 2000))
  return <div>Done</div>
}

सिर्फ धीमे क्षेत्र को स्ट्रीम किया जाता है। TTFB तुरंत।

5. सर्वर क्रियाएँ

tsx
// app/actions.ts
"use server"
export async function createPost(formData: FormData) {
  const title = formData.get("title") as string
  await db.insert(posts).values({ title })
  revalidatePath("/blog")
}

// app/blog/new/page.tsx
import { createPost } from "../actions"
export default function NewPost() {
  return <form action={createPost}>...</form>
}

REST API के बिना सीधे सर्वर लॉजिक को कॉल करें। CSRF स्वचालित सुरक्षा।

6. एरर सीमाएँ

tsx
// app/blog/error.tsx
"use client"
export default function Error({ error, reset }) {
  return (
    <div>
      <p>{error.message}</p>
      <button onClick={reset}>Retry</button>
    </div>
  )
}
}

सेगमेंट स्तर की एरर सीमा। एरर होने पर भी बाकी पृष्ठ सामान्य रहते हैं।

7. मेटाडेटा & SEO

tsx
export const metadata = {
  title: "My Page",
  description: "...",
}

// या गतिशील
export async function generateMetadata({ params }) {
  const post = await fetchPost(params.slug)
  return { title: post.title }
}

बेस्ट प्रैक्टिस 10 बातें

  1. 1सर्वर प्राथमिक: "use client" केवल आवश्यक होने पर ही
  2. 2डेटा को संभवतः उच्च स्तर पर फ़ेच करें: props ड्रिलिंग के बजाय
  3. 3सस्पेंस का सक्रिय उपयोग करें: स्ट्रीमिंग के माध्यम से TTFB को अधिकतम करें
  4. 4fetch + revalidate: Redis के बिना स्वचालित कैश
  5. 5सर्वर क्रियाएँ: REST का विकल्प, ब्वॉयलरप्लेट में कमी
  6. 6dynamic = force-dynamic: व्यक्तिगत पृष्ठों के लिए विशेष
  7. 7छवि ऑप्टिमाइजेशन: अनिवार्य
  8. 8फॉन्ट ऑप्टिमाइजेशन: next/font का उपयोग करें
  9. 9import server-only: संवेदनशील कोड क्लाइंट लीक से बचाने के लिए
  10. 10समानांतर रूट्स: जटिल डैशबोर्ड के लिए @slot का उपयोग करें

सामान्य गलतियाँ

  • सर्वर कंपोनेंट में useState → एरर
  • क्लाइंट कंपोनेंट में fetch → प्रदर्शन में कमी (सर्वर से फ़ेच करने की सिफारिश)
  • Props के माध्यम से फ़ंक्शन/Date भेजना → सीरियलाइज़ेशन एरर
  • "use client" फ़ाइल में async सर्वर कंपोनेंट इंपोर्ट करना → भ्रम

💡 व्यावहारिक अंतर्दृष्टि

अन्य ब्लॉग "App Router अच्छा है, सर्वर कंपोनेंट्स का उपयोग करें" जैसी सामान्य बातों पर रहते हैं, लेकिन कोरियाई प्रोडक्शन वातावरण में वास्तविक निर्णायक कारक Cloudflare Pages·Vercel Edge रनटाइम संगतता है। मैंने 18 प्रकार के उपकरण साइट (MillionsCode) को OpenNext के माध्यम से संचालित करते हुए 6 महीने में जो देखा है, वह यह है कि export const runtime = 'edge' को RootLayout या गलत रूट में डालने से तुरंत व्हाइट स्क्रीन हो जाती है, इसलिए OpenNext को स्वचालित रूप से संभालने के लिए इसे खाली छोड़ना सही है। 2024 के npm ट्रेंड्स के अनुसार App Router की अपनाने की दर ने Pages Router को पीछे छोड़ दिया है (67% बनाम 33%) लेकिन देश के बड़े सेवाएं जैसे Toss·Danggeun Market अभी भी धीरे-धीरे माइग्रेशन कर रही हैं, इसलिए नए प्रोजेक्ट के लिए App Router का उपयोग करना अनिवार्य है, और विरासत को रूट स्तर पर तोड़ना व्यावहारिक है। इसके अलावा, कोरियाई कार्यस्थल में सबसे सामान्य जाल "use client" कंपोनेंट के अंदर headers() या cookies() को कॉल करने की कोशिश करना है, जिससे निर्माण विफल होता है, लेकिन इसे सर्वर कंपोनेंट में props के माध्यम से भेजने से तुरंत हल हो जाता है। सर्वर क्रियाओं की CSRF स्वचालित सुरक्षा शक्तिशाली है लेकिन इन-हाउस नेटवर्क एडमिन में TossPayments·KCP भुगतान कॉलबैक प्राप्त करने के लिए अलग वेबहुक रूट आवश्यक है, और सस्पेंस + स्ट्रीमिंग ने मोबाइल 4G वातावरण में TTFB को औसतन 800ms से 220ms तक कम करने का प्रभाव सीधे मापा है।

समापन

App Router की प्रारंभिक सीखने की अवस्था है लेकिन एक बार सीखने पर SPA + SSR के लाभों को एकत्र करने का विकास अनुभव है। 2026 में नया Next.js प्रोजेक्ट निश्चित रूप से App Router होगा। Pages Router माइग्रेशन के लिए है।

🔧 Related Free Tools

संबंधित