Only add "use client" when a component needs hooks, event handlers, or browser APIs. Every unnecessary "use client" directive ships the component and all its dependencies to the browser as additional JavaScript — slowing down page loads, increasing bandwidth costs, and degrading the experience for users on slow connections or low-powered devices.
Why This Matters
Every "use client" directive adds the component and all its dependencies to the client JavaScript bundle. Unnecessary client components increase page load time, Time to Interactive (TTI), and bandwidth usage. On large applications this can add hundreds of kilobytes of avoidable JavaScript.
In Next.js App Router, components are Server Components by default. Adding "use client" at the top of a file opts that component (and its entire import subtree) into the client bundle. This means:
The component's JavaScript is shipped to the browser
All dependencies of that component are also bundled client-side
The component must be hydrated before it becomes interactive
Unnecessary "use client" directives are the leading cause of bloated Next.js bundles.
The rule
Only add "use client" when the component genuinely needs one of:
This component has no hooks, no event handlers, and no browser APIs. It should be a Server Component.
Good example
// No "use client" — this is a Server Componentimport { formatDate } from "@/lib/utils";export function ArticleCard({ title, date, excerpt }: ArticleCardProps) { return ( <div className="rounded-lg border p-4"> <h2>{title}</h2> <time>{formatDate(date)}</time> <p>{excerpt}</p> </div> );}
The composition pattern
When you need interactivity for a small part of a larger component, extract only the interactive part into a client component:
// article-page.tsx — Server Componentimport { LikeButton } from "./like-button"; // Client Componentexport async function ArticlePage({ id }: { id: string }) { const article = await getArticle(id); // Server-side data fetch return ( <article> <h1>{article.title}</h1> <p>{article.content}</p> <LikeButton articleId={id} /> {/* Only this part is client-side */} </article> );}