Bird
Raised Fist0
NextJSframework~8 mins

Data fetching in server components in NextJS - Performance & Optimization

Choose your learning style10 modes available
Performance: Data fetching in server components
HIGH IMPACT
This affects the initial page load speed by controlling when and how data is fetched and rendered on the server before sending HTML to the browser.
Fetching data for a page in Next.js
NextJS
export default async function Page() {
  const res = await fetch('https://example.com/api/data');
  const data = await res.json();
  return <div>{data.title}</div>;
}
Data is fetched on the server during rendering, so the browser receives fully rendered HTML immediately.
📈 Performance GainImproves LCP by 300-500ms; no client loading state; reduces client JS execution.
Fetching data for a page in Next.js
NextJS
import React from 'react';

export default function Page() {
  const [data, setData] = React.useState(null);
  React.useEffect(() => {
    fetch('/api/data').then(res => res.json()).then(setData);
  }, []);
  if (!data) return <p>Loading...</p>;
  return <div>{data.title}</div>;
}
Data is fetched on the client after initial HTML loads, causing slower LCP and showing loading states.
📉 Performance CostBlocks meaningful content rendering until client JS runs; increases LCP by 300-500ms or more.
Performance Comparison
PatternDOM OperationsReflowsPaint CostVerdict
Client-side data fetching with useEffectMinimal initial DOM, then full updateMultiple reflows due to loading state and data renderHigher paint cost due to incremental updates[X] Bad
Server component data fetching with async/awaitFull DOM ready on first paintSingle reflow on initial loadLower paint cost with complete HTML[OK] Good
Rendering Pipeline
Server components fetch data during server rendering, producing complete HTML before sending to the browser. This reduces client-side JavaScript work and speeds up the critical rendering path.
→Server Data Fetching
→HTML Generation
→Network Transfer
→Browser Rendering
⚠️ BottleneckServer Data Fetching can delay HTML generation if slow or blocking.
Core Web Vital Affected
LCP
This affects the initial page load speed by controlling when and how data is fetched and rendered on the server before sending HTML to the browser.
Optimization Tips
1Fetch data in server components to deliver fully rendered HTML for faster LCP.
2Avoid client-side data fetching that delays meaningful content rendering.
3Use caching and parallel requests to minimize server fetch delays.
Performance Quiz - 3 Questions
Test your performance knowledge
How does fetching data in Next.js server components affect Largest Contentful Paint (LCP)?
AIt has no effect on LCP since data fetching is always client-side.
BIt delays LCP because data is fetched after client JS loads.
CIt improves LCP by sending fully rendered HTML to the browser.
DIt worsens LCP by increasing JavaScript bundle size.
DevTools: Performance
How to check: Record a page load and look for Largest Contentful Paint timing; check if main content appears quickly without loading placeholders.
What to look for: A fast LCP time and absence of long loading or blank states indicate good server data fetching performance.

Practice

(1/5)
1. What is the main advantage of fetching data inside Next.js server components?
easy
A. It requires no network requests at all.
B. Data is fetched before rendering, improving page speed and SEO.
C. It allows using React hooks like useState for data fetching.
D. Data fetching happens on the client side for faster UI updates.

Solution

  1. Step 1: Understand server component data fetching

    Server components fetch data before rendering, so the page is ready with data when sent to the browser.
  2. Step 2: Recognize benefits for speed and SEO

    This pre-rendering with data improves page load speed and helps search engines index content better.
  3. Final Answer:

    Data is fetched before rendering, improving page speed and SEO. -> Option B
  4. Quick Check:

    Server components fetch data early = D [OK]
Hint: Server components fetch data before render for speed and SEO [OK]
Common Mistakes:
  • Thinking data fetching happens on client side in server components
  • Confusing server components with client components
  • Believing no network requests are needed
2. Which of the following is the correct way to fetch data inside a Next.js server component?
easy
A. const data = fetch('https://api.example.com/data', { method: 'POST' });
B. const data = fetch('https://api.example.com/data').then(res => res.json());
C. useEffect(() => { fetch('https://api.example.com/data'); }, []);
D. const data = await fetch('https://api.example.com/data');

Solution

  1. Step 1: Identify server component data fetching syntax

    Server components support top-level await, so you can directly use await fetch().
  2. Step 2: Check each option

    const data = await fetch('https://api.example.com/data'); uses await fetch correctly. const data = fetch('https://api.example.com/data').then(res => res.json()); assigns a Promise to data without awaiting. useEffect(() => { fetch('https://api.example.com/data'); }, []); uses useEffect, which is client-side only. const data = fetch('https://api.example.com/data', { method: 'POST' }); uses POST without context, likely incorrect for simple fetch.
  3. Final Answer:

    const data = await fetch('https://api.example.com/data'); -> Option D
  4. Quick Check:

    Top-level await fetch in server components = A [OK]
Hint: Use top-level await fetch() in server components [OK]
Common Mistakes:
  • Using useEffect inside server components
  • Not using await with fetch
  • Confusing client-side hooks with server code
3. Given this server component code, what will be rendered?
export default async function Page() {
  const res = await fetch('https://api.example.com/user');
  const user = await res.json();
  return <h1>Hello, {user.name}!</h1>;
}
medium
A. <h1>Hello, John!</h1>
B. Error: fetch not allowed in server components
C. <h1>Hello, undefined!</h1>
D. Loading spinner until data arrives

Solution

  1. Step 1: Understand server component data fetching

    The fetch call waits for the API response, then parses JSON to get user data.
  2. Step 2: Render with fetched data

    The component returns an h1 element greeting the user by name, assuming user.name is 'John'.
  3. Final Answer:

    <h1>Hello, John!</h1> -> Option A
  4. Quick Check:

    Server component fetch + render data = C [OK]
Hint: Server components await fetch, render data directly [OK]
Common Mistakes:
  • Expecting client-side loading states in server components
  • Assuming fetch is disallowed in server components
  • Not awaiting fetch response before rendering
4. Identify the error in this Next.js server component fetching data:
export default function Page() {
  const data = await fetch('https://api.example.com/data');
  return <div>Data loaded</div>;
}
medium
A. Missing JSON parsing of fetch response.
B. fetch is not allowed in server components.
C. Cannot use await inside a non-async function.
D. Return statement must be inside useEffect.

Solution

  1. Step 1: Check function declaration

    The function is not marked async but uses await, which is invalid syntax.
  2. Step 2: Understand correct usage

    To use await, the function must be async. fetch is allowed in server components, and JSON parsing is optional depending on usage.
  3. Final Answer:

    Cannot use await inside a non-async function. -> Option C
  4. Quick Check:

    await requires async function = A [OK]
Hint: Mark function async to use await inside it [OK]
Common Mistakes:
  • Forgetting async keyword on server component
  • Thinking fetch is disallowed in server components
  • Misusing client hooks like useEffect in server components
5. You want to fetch user data and posts in a Next.js server component and display the user's name with the number of posts. Which code correctly fetches both and renders the result?
export default async function Page() {
  const userRes = await fetch('https://api.example.com/user');
  const postsRes = await fetch('https://api.example.com/posts');
  const user = await userRes.json();
  const posts = await postsRes.json();
  return <div>{user.name} has {posts.length} posts.</div>;
}
hard
A. Correctly fetches both and renders user name with posts count.
B. fetch calls must be inside useEffect for server components.
C. Cannot fetch multiple resources in one server component.
D. Must combine fetch calls with Promise.all to work.

Solution

  1. Step 1: Analyze fetch calls in server component

    Server components support multiple await fetch calls sequentially as shown.
  2. Step 2: Confirm rendering logic

    The component renders user.name and posts.length correctly after awaiting JSON parsing.
  3. Final Answer:

    Correctly fetches both and renders user name with posts count. -> Option A
  4. Quick Check:

    Multiple awaits in server component allowed = B [OK]
Hint: Await multiple fetches sequentially in async server component [OK]
Common Mistakes:
  • Thinking useEffect is needed in server components
  • Believing multiple fetch calls are disallowed
  • Assuming Promise.all is required for correctness
Recommended

Ready to prove it?

Pass the test and this pattern moves unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard