TechFeedTechFeed
Next.js런타임

window is not defined — Next.js 서버 렌더에서 브라우저 객체 접근

ReferenceError: window is not defined
한 줄 해결: 서버(Node.js)에는 window·document 가 없는데 렌더·모듈 최상단에서 접근해 발생하며, 브라우저 전용 코드를 useEffect나 ssr:false 안으로 옮기면 됩니다.

이런 증상일 때

next build 또는 SSR 중 "window is not defined"(또는 document/localStorage/navigator)로 빌드가 실패하거나 서버 렌더가 깨집니다. 클라이언트에서는 잘 되던 코드가 서버 렌더 단계에서 터집니다.

원인

  • 컴포넌트 본문이나 모듈 최상단에서 window/document 에 직접 접근
  • window 를 쓰는 라이브러리를 SSR 단계에서 import
  • App Router 에서 use client 선언 없이 브라우저 API 사용

해결 방법

1
useEffect 안으로 이동

window 접근은 마운트 이후에만 일어나도록 useEffect 로 감쌉니다. useEffect 는 클라이언트에서만 실행됩니다.

useEffect(() => {
  const w = window.innerWidth
}, [])
2
typeof 가드

모듈 최상단이라면 typeof window 로 환경을 확인한 뒤 접근합니다.

if (typeof window !== 'undefined') { /* 브라우저 전용 */ }
3
ssr:false 동적 import

window 의존 라이브러리/컴포넌트는 SSR 을 꺼서 클라이언트에서만 로드합니다.

const M = dynamic(() => import('./M'), { ssr: false })
💡 예방: 브라우저 전용 라이브러리는 컴포넌트 레벨에서 동적 import 하거나 use client 경계 안에서만 쓰세요.
Next.jswindowSSRdocumentReferenceError

관련 에러

관련 가이드

하이드레이션 미스매치, Hydration failed, 서버 클라이언트 불일치 | 콘솔에 빨간 줄이 뜨면 뭐부터 볼까?EADDRINUSE, 포트 이미 사용 중, 프로세스 종료 | 3000번이 안 죽으면 뭐부터 볼까?npm ERESOLVE, 피어 의존성 충돌, legacy-peer-deps, overrides | 설치가 멈추면 뭐부터 볼까?CORS 에러, 프리플라이트, Access-Control-Allow-Origin | 로컬은 되는데 배포하면 막히면?