Discover why mixing server and client code without rules can break your app--and how Next.js fixes it.
Why Server component restrictions in NextJS? - Purpose & Use Cases
Imagine building a web page where you manually fetch data on the server, then try to mix that with interactive buttons that need to run code in the browser.
You try to combine server-only code with client-side code all in one place.
This manual mix is confusing and error-prone because server code can't access browser features like clicks or animations.
Trying to run server code on the client or client code on the server causes bugs and slow loading.
Next.js server component restrictions clearly separate what runs on the server and what runs on the client.
This keeps data fetching and heavy work on the server, while interactive parts stay on the client, making apps faster and easier to build.
async function Page() {
const data = await fetchData();
return <button onClick={() => alert('Clicked!')}>Click me</button>;
}// page.tsx (Server Component)
export default async function Page() {
const data = await fetchData();
return <ClientButton />;
}
// ClientButton.tsx (Client Component)
'use client';
function ClientButton() {
return <button onClick={() => alert('Clicked!')}>Click me</button>;
}
export default ClientButton;This separation enables building fast, scalable apps that fetch data on the server and handle user interactions smoothly on the client.
Think of an online store page that loads product details from the server but lets you add items to the cart instantly without reloading the page.
Server components run only on the server and can fetch data securely.
Client components handle user interactions and run in the browser.
Restrictions keep these roles clear, avoiding bugs and improving performance.
Practice
Solution
Step 1: Understand server component environment
Server components run only on the server and do not have access to browser APIs likewindow.Step 2: Identify browser-only features
Usingwindow.alert()requires a browser environment, so it is not allowed in server components.Final Answer:
Using window.alert() to show a popup -> Option AQuick Check:
Browser APIs forbidden in server components = B [OK]
- Thinking fetch is a browser-only API
- Assuming file system access is disallowed
- Confusing client and server component roles
Solution
Step 1: Recall default component type
By default, components in Next.js are server components unless marked otherwise.Step 2: Identify client directive usage
Adding 'use client' marks a component as client-side, so 'use client'; export default function MyComponent() { return <div>Hello</div> } is client, not server.Final Answer:
export default function MyComponent() { return <div>Hello</div> } -> Option CQuick Check:
Default is server component = A [OK]
- Adding 'use server' which is not a valid directive
- Confusing arrow function export with client directive
- Assuming explicit 'use server' is required
useState hook inside a Next.js server component?Solution
Step 1: Understand hook restrictions in server components
Hooks likeuseStaterequire a browser environment and are only valid in client components.Step 2: Identify behavior when used in server components
UsinguseStatein server components causes a runtime error because state management is not supported there.Final Answer:
It will cause a runtime error because hooks are client-only -> Option DQuick Check:
useState only works in client components = A [OK]
- Thinking useState works on server for pre-rendering
- Assuming server components can manage interactive state
- Believing server components auto-convert to client
import { useEffect } from 'react';
export default function Page() {
useEffect(() => { console.log('Hello'); });
return <div>Welcome</div>;
}What is the main cause of the error?
Solution
Step 1: Identify hook usage in server components
Hooks likeuseEffectrun only in client components because they depend on browser lifecycle.Step 2: Understand error cause
UsinguseEffectin a server component causes an error since server components do not support client hooks.Final Answer:
useEffect is a client-only hook and cannot be used in server components -> Option BQuick Check:
useEffect forbidden in server components = C [OK]
- Thinking 'use client' fixes the error without adding directive
- Assuming import from 'react' is disallowed
- Believing return must be wrapped in fragment
Solution
Step 1: Identify secure data fetching method
Server components can usefetchdirectly on the server to securely get data before rendering.Step 2: Eliminate invalid options
Client components fetch data in the browser, less secure;window.fetchdoes not exist on server; file system access is server-only.Final Answer:
Create a server component that uses fetch to get data and renders it directly -> Option AQuick Check:
Server fetch for secure data = D [OK]
- Using window.fetch in server components
- Fetching data in client components unnecessarily
- Trying to access file system in client components
Ready to prove it?
Pass the test and this pattern moves unknown
