Next.js 통합

Firebase CLI를 사용해 Next.js 웹 앱을 Firebase에 배포하고 Firebase 호스팅으로 이를 제공할 수 있습니다. CLI는 Next.js 설정을 따르고 추가 구성을 0개 또는 최소한으로 하여 이를 Firebase 설정으로 변환합니다. 앱에 동적 서버 측 로직이 포함되어 있는 경우 CLI는 해당 로직을 Firebase용 Cloud Functions에 배포합니다.

시작하기 전에

Next.js 앱을 Firebase에 배포하기 전에 먼저 다음 요구사항 및 옵션을 검토하세요.

  • Firebase CLI 버전 11.14.2 이상. 선호하는 방법으로 CLI를 설치하세요.
  • 선택사항: Firebase 프로젝트에서 결제 사용 설정(SSR을 사용하려는 경우는 필수)
  • 선택사항: 실험용 ReactFire 라이브러리를 사용하여 Firebase 친화적인 기능의 이점 활용

Firebase 초기화

시작하려면 프레임워크 프로젝트의 Firebase를 초기화합니다.

  1. Firebase CLI에서 웹 프레임워크 미리보기를 사용 설정합니다.
    firebase experiments:enable webframeworks
  2. CLI에서 초기화 명령어를 실행한 후 메시지를 따릅니다.
    firebase init hosting
  3. 호스팅 소스 디렉터리를 선택합니다. 기존 Next.js 앱인 경우 CLI 프로세스가 완료되고 다음 섹션으로 진행할 수 있습니다.
  4. '웹 프레임워크를 사용한 동적 웹 호스팅'을 선택합니다.
  5. Next.js를 선택합니다.

정적 콘텐츠 제공

Firebase를 초기화한 후 표준 배포 명령어를 사용하여 정적 콘텐츠를 제공할 수 있습니다.

firebase deploy

실제 사이트에서 배포된 앱을 확인할 수 있습니다.

동적 콘텐츠 사전 렌더링

Firebase CLI가 getStaticPropsgetStaticPaths의 사용을 감지합니다.

선택사항: Firebase JS SDK와 통합

서버 및 클라이언트 번들에 Firebase JS SDK 메서드를 포함하는 경우 제품을 사용하기 전에 isSupported()를 확인하여 런타임 오류로부터 보호하세요. 일부 제품만 모든 환경에서 지원됩니다.

선택사항: Firebase Admin SDK와 통합

브라우저 빌드에 포함된 경우 Admin SDK 번들이 실패합니다. getStaticPropsgetStaticPaths 내에서만 참조하세요.

완전 동적 콘텐츠(SSR) 제공

Firebase CLI가 getServerSideProps의 사용을 감지합니다.

next.config.js로 호스팅 동작 구성

이미지 최적화

Next.js 이미지 최적화 사용지 지원되지만 SSR을 사용하지 않는 경우에도 Firebase용 Cloud Functions에서 함수 생성이 트리거됩니다.

리디렉션, 재작성, 헤더

Firebase CLI는 next.config.js리디렉션, 재작성, 헤더를 고려하여 배포 시 이에 상응하는 Firebase 호스팅 구성으로 변환합니다. Next.js 리디렉션, 재작성, 헤더를 동등한 Firebase 호스팅 헤더로 변환할 수 없는 경우 이미지 최적화 또는 SSR을 사용하지 않더라도 대체되어 함수를 빌드합니다.

선택사항: Firebase 인증과 통합

웹 프레임워크 인식 Firebase 배포 도구는 쿠키를 사용하여 클라이언트 및 서버 상태를 자동으로 동기화합니다. SSR의 인증 컨텍스트에 액세스하기 위해 제공된 몇 가지 방법이 있습니다.

  • Express res.locals 객체는 필요에 따라 인증된 Firebase 앱 인스턴스(firebaseApp)와 현재 로그인한 사용자(currentUser)를 포함하며, getServerSideProps에서 액세스할 수 있습니다.
  • 인증된 Firebase 앱 이름은 경로 쿼리(__firebaseAppName)에 제공됩니다. 이렇게 하면 다음과 같은 상황에서 수동 통합이 가능합니다.
  // get the authenticated Firebase App
  const firebaseApp = getApp(useRouter().query.__firebaseAppName);