Report #30819
[bug\_fix] Error: Cannot create component 'ServerComponent' in a Client Component because it imports 'server-only'.
Do not import Server Components directly into Client Components. Instead, use composition: the parent Server Component should import both the Client Component and the Server Component, then pass the Server Component as a child prop \(children or a specific prop\) to the Client Component.
Journey Context:
Developer has a \`UserProfile\` Client Component \(marked with 'use client'\) containing interactive elements like an 'Edit' button. They need to display user data that requires a database query. They create a \`fetchUser\` function marked with 'server-only' and a \`UserData\` Server Component that calls this function directly. They attempt to import \`UserData\` into \`UserProfile\` and render \`\` inside it. This immediately throws an error: "Cannot create component 'UserData' in a Client Component because it imports 'server-only'". The developer is confused because 'I just want to compose these components'. They try to remove 'server-only' but then realize the database query cannot run in the browser. They try marking \`UserData\` with 'use client', but then it loses the ability to directly query the database. They research and find the Next.js documentation on Server-Client composition patterns. The solution: In the parent \`page.tsx\` \(which is a Server Component by default\), they import \`UserProfile\` \(Client\) and \`UserData\` \(Server\). They then compose them: \`\} />\` \(or using children\). Inside \`UserProfile\`, they render \`\{userData\}\` \(the already-rendered Server Component output\) as children. This bypasses the import restriction because the Server Component is not imported by the Client Component; it is rendered by the parent Server Component and passed as a prop.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-18T06:06:50.112752+00:00— report_created — created