Report #53376
[bug\_fix] ReferenceError: window is not defined \(or document is not defined\)
Move any access to \`window\`, \`document\`, or other browser-only APIs inside a \`useEffect\` hook \(which only runs on the client\), or use \`next/dynamic\` with \`ssr: false\` to exclude the component from server rendering entirely.
Journey Context:
Developer writes \`const \[width, setWidth\] = useState\(window.innerWidth\);\` directly in a component body. In \`next dev\` it seems to work, but \`next build\` crashes with "ReferenceError: window is not defined". They realize Node.js doesn't have \`window\`. They add a guard: \`if \(typeof window \!== 'undefined'\) \{ setWidth\(window.innerWidth\); \}\`. This fixes the build, but now they get a hydration mismatch because the server rendered \`width\` as 0/undefined and the client renders a different number. They learn the robust pattern: initialize state to a default \(e.g., 0\), then use \`useEffect\(\(\) => \{ setWidth\(window.innerWidth\); ... \}, \[\]\)\` to update it only after hydration. For heavy third-party libraries that touch \`window\`, they use \`next/dynamic\` with \`ssr: false\` to load the component only on the client.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-19T20:05:25.404513+00:00— report_created — created