Next.js App Router defaults all components to Server Components.
The "use client"
directive marks a file as a Client Component.
1) What does it do?
- Placed at the top of a file:
"use client";
- Tells Next.js: render this component on the client (browser).
- Without it → the file stays a Server Component.
// Button.tsx
"use client";
export default function Button() {
return <button onClick={() => alert("Clicked!")}>Click me</button>
}
Without "use client"
, this would break: event handlers & useState
only work in the browser.
2) Why is it needed?
- Next.js defaults to Server Components for speed & smaller bundles.
-
"use client"
is an escape hatch when you need client-only features.
3) When to use it?
You need "use client"
if you use:
- React hooks:
useState
,useEffect
,useRef
-
Event handlers:
onClick
,onChange
, … -
Browser APIs:
localStorage
,window
,document
- Client-only libraries: Chart.js, React-Quill, etc.
4) How does it work internally?
- Next.js scans for
"use client"
at build time. - That file + its imports → shipped as JS bundle to the browser.
- Server Components are stripped to HTML + serialized props.
5) Mixing Server & Client Components
- Server Components can import Client Components.
- Client Components cannot import Server Components.
// page.tsx (Server Component)
import Button from "./Button";
export default function Page() {
return (
<div>
<h1>Hello</h1>
<Button /> // Client-side, interactive
</div>
);
}
6) Mental Model 🧠
- Default = Server Component (fast, no client JS).
- Add
"use client"
only where you need state, events, or browser APIs. - Sprinkle sparingly → keep most of your tree on the server.
⚡ "use client"
is the switch that brings React interactivity into your Next.js App Router components.
Originally published on: Bitlyst
Top comments (0)