Report #12553
[bug\_fix] Server Component cannot import client-only library \(window/document not defined\)
Create a Client Component wrapper \(with 'use client'\) that imports and uses the library, then import that wrapper into your Server Component; or use next/dynamic with ssr: false.
Journey Context:
Developer installs a charting library like \`recharts\` or \`react-apexcharts\` via npm. They import \`import \{ LineChart \} from 'recharts'\` directly into \`app/dashboard/page.tsx\` \(a Server Component\). Immediately upon running \`next dev\`, the app crashes with 'window is not defined' or 'document is not defined' originating from deep inside the charting library's node\_modules. Developer checks the library's documentation which mentions React support but doesn't mention Next.js App Router. They try to fix it by adding \`'use client'\` to the page.tsx, but then they lose the ability to fetch data efficiently on the server. After researching, they learn the pattern of 'wrapping client components'. They create a new file \`components/ChartWrapper.tsx\` with \`'use client'\` at the top, import the chart library there, and export the component. Then in the Server Component page, they import \`ChartWrapper\`. This keeps the heavy client library out of the server bundle while allowing the server to render the shell around it. Alternatively, they could use \`next/dynamic\` with \`ssr: false\` for the same effect.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-16T16:17:38.821994+00:00— report_created — created