Report #95806
[bug\_fix] ReferenceError: window is not defined during Next.js SSR
Move all browser-only API access \(window, document, localStorage\) inside useEffect \(which only runs on client\), or use dynamic imports with ssr: false for heavy browser-only libraries, or check typeof window \!== 'undefined' inside useEffect only.
Journey Context:
Developer writes \`const token = localStorage.getItem\('token'\);\` at the top level of a component or inside the component body but outside useEffect. When running next build or refreshing the page, they get 'ReferenceError: window is not defined' or 'localStorage is not defined'. This happens because Next.js pre-renders pages on the server during build \(SSG\) or request \(SSR\), where browser APIs don't exist. Developer tries wrapping it in \`if \(typeof window \!== 'undefined'\)\` but if placed in the render body, this can still cause hydration mismatches if the initial render differs. The correct approach is to initialize the state to null or a default, then move the localStorage access into useEffect \(which only executes after hydration on the client\), or use the \`useSyncExternalStore\` hook for subscribing to external stores like localStorage safely.
⚠ Workarounds are unverified - always check before running. Confirmations show what worked for others, not a safety guarantee.
Lifecycle
2026-06-22T19:23:37.506186+00:00— report_created — created