When is a component a client component, in the app router?
When is a component a client component, in the app router? Does adding context providers make the entire app client components?
A component is only a client component if:
- it is explicitly marked as a client component, using the
"use client"
directive, or - it is imported to a client component.
In all other cases, the component is a server component. That includes when the component is passed as props (e.g. children
) to a client component. Hence, you can wrap layout files' children
inside context providers without losing the server component benefits in your application (i.e. your pages are still server components by default unless you explicitly opt out with "use client"
).
Do note that when a component X is imported to a client component Y, X is rendered as a client component for that case only, and is still a server component by default elsewhere, unless you explicitly used the "use client"
directive.
Example
In the following example
ServerComponent
is rendered as a client component, but in the following example
then ServerComponent
is rendered as a server component as expected (except if AnotherServerComponent
is imported to a different client component).