Next.js prerender error

created:
last-updated:

Next 앱 빌드 시점에 안나던 에러가 발생했다.

ReferenceError: document is not defined

메세지 상으로는 분명 document나 window 객체 참조 에러였다.
그런데 전체 검색을 해보아도 직접 document를 참조하는 코드가 없었고,
혹시 몰라 의심이 가는 컴포넌트들의 최상단에 'use client'로 클라이언트 사이드 렌더를 하도록해보았으나, 실패.

결국엔 해결했는데, 그 이유와 왜 'use client'로는 해결되지 않았는지 기록.

문제가 되는 코드는 코드베이스에 직접 작성한 코드가 아닌, 서드파티 라이브러리를 import하는 부분이었다.
애니메이션 등을 지원하는 클라이언트 사이드에서만 동작하는, 즉 window, document 객체를 직접 참조하는 라이브러리를 import하고 있었기 때문이었다.

그래서 Next.js 앱 빌드 시점에, 그러니까 Node.js 환경에서 번들링 + SSR 준비를 하는 시점에 import된 라이브러리에서 document를 참조하니 발생하는 에러였다.

우선 이렇게 ssr: false 옵션으로 dynamic import를 하게 해서 클라이언트 사이드 렌더링 시점에만 로드하도록 수정해 해결했다.

import dynamic from "next/dynamic";

const NoSSRComponent = dynamic(() => import("../components/Lottie"), {
  ssr: false,
});

기록

"use client"는 컴포넌트 전체를 무조건 클라이언트에서만 실행시켜주지 않음

'use client';

// ❌ 모듈 최상단에서 document를 바로 참조 → 빌드 시 터짐
const el = document.querySelector("#root");

export default function Page() {
  return <div>Hello</div>;
}
'use client';
import Lottie from 'lottie-web'; // ❌ lottie-web 내부에서 document를 바로 씀 → 에러

바로 알기