Report #45796
[bug\_fix] window is not defined / document is not defined during Next.js build \(SSG/SSR\)
For Next.js App Router: If the code must run in the browser, move it to a Client Component by adding \`'use client'\` at the top of the file. If the library is heavy and should not be part of the SSR bundle, use \`next/dynamic\` with \`ssr: false\`. For specific browser-only initializations, wrap the logic in \`useEffect\` \(which only runs on client\) or check for \`typeof window \!== 'undefined'\` inside useEffect, never in the render path during SSR.
Journey Context:
A developer installs a charting library like \`chart.js\` or \`recharts\` and imports it directly into a page component in \`app/page.tsx\`. They call \`new Chart\(document.getElementById\('myChart'\)\)\` in the component body or in a \`useEffect\` without proper gating. When running \`next build\`, the build fails with \`ReferenceError: document is not defined\` because during static generation \(SSG\) or server-side rendering, the code runs in a Node.js environment where \`document\` and \`window\` do not exist. The developer tries wrapping the code in \`if \(typeof window \!== 'undefined'\)\`, but this causes a hydration mismatch: the server renders \`null\` \(or skips the branch\), while the client renders the actual chart div, causing React's hydration to fail because the HTML structure differs. The correct approach is identified: either mark the entire component as a Client Component with \`'use client'\` \(allowing it to render only on client, skipping SSR for this subtree\), or use \`next/dynamic\` to import the chart component with \`ssr: false\`, ensuring the component code is never loaded during the server build phase.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T07:20:40.776694+00:00— report_created — created