Firebase 프레임워크 인식 CLI를 사용하여 Angular 애플리케이션을 Firebase에 배포하고 동적 콘텐츠를 사용자에게 제공할 수 있습니다.
시작하기 전에
Angular Universal 앱을 Firebase에 배포하기 전에 다음 요구사항 및 옵션을 검토하세요.
- Firebase CLI 버전 11.14.2 이상. 선호하는 방법으로 CLI를 설치하세요.
- 선택사항: Firebase 프로젝트에서 결제 사용 설정(SSR을 사용하려는 경우는 필수)
- 선택사항: AngularFire
Firebase 초기화
시작하려면 프레임워크 프로젝트를 위해 Firebase를 초기화하세요.
새 프로젝트에 Firebase CLI를 사용하거나 기존 프로젝트에서 firebase.json
을 수정합니다.
새 프로젝트 초기화
- Firebase CLI에서 웹 프레임워크 미리보기를 사용 설정합니다.
firebase experiments:enable webframeworks
- CLI에서 초기화 명령어를 실행한 후 메시지를 따릅니다.
firebase init hosting
- 호스팅 소스 디렉터리를 선택합니다. 기존 Angular 앱일 수도 있습니다.
- '웹 프레임워크를 사용한 동적 웹 호스팅'을 선택합니다.
- Angular를 선택합니다.
기존 프로젝트 초기화
firebase.json
에서 호스팅 구성을 변경하여 public
옵션이 아닌 source
옵션을 갖도록 합니다. 예를 들면 다음과 같습니다.
{
"hosting": {
"source": "./path-to-your-angular-workspace"
}
}
정적 콘텐츠 제공
Firebase를 초기화한 후 표준 배포 명령어를 사용하여 정적 콘텐츠를 제공할 수 있습니다.
firebase deploy
동적 콘텐츠 사전 렌더링
Angular에서 동적 콘텐츠를 사전 렌더링하려면 Angular Universal을 설정해야 합니다. Firebase CLI에는 Express Engine이 필요합니다.
ng add @nguniversal/express-engine
자세한 내용은 Angular Universal 가이드를 참조하세요.
사전 렌더링 URL 추가
기본적으로 루트 디렉터리만 사전 렌더링됩니다. angular.json
에서 사전 렌더링 단계를 찾고 경로를 추가하여 경로를 더 추가할 수 있습니다.
{
"prerender": {
"builder": "@nguniversal/builders:prerender",
"options": {
"routes": [
"/",
"ANOTHER_ROUTE",
"AND_ANOTHER"
]
},
"configurations": {
/* ... */
},
"defaultConfiguration": "production"
}
}
Firebase는 추가로 맞춤설정해야 하는 경우 호스팅 루트의 guessRoutes
또는 routes.txt
파일을 고려합니다. 이러한 옵션에 관한 자세한 내용은 Angular의 사전 렌더링 가이드를 참고하세요.
선택사항: 서버 모듈 추가
배포
firebase deploy
를 사용하여 배포할 때 Firebase는 브라우저 번들 및 서버 번들을 빌드하고 애플리케이션을 사전 렌더링합니다. 이러한 요소는 호스팅 및 Firebase용 Cloud Functions에 배포됩니다.
커스텀 배포
Firebase CLI에서는 프로덕션 구성으로 도표에 서버, 빌드, 사전 렌더링 단계가 있다고 가정합니다.
CLI의 가정을 맞춤설정하려면 ng deploy
를 구성하고 angular.json
에서 구성을 수정합니다. 예를 들어 SSR을 사용 중지하고 serverTarget
을 삭제하여 사전 렌더링된 콘텐츠만 제공할 수 있습니다.
{
"deploy": {
"builder": "@angular/fire:deploy",
"options": {
"browserTarget": "app:build:production",
"serverTarget": "app:server:production",
"prerenderTarget": "app:prerender:production"
}
}
}
선택사항: Firebase JS SDK와 통합
서버 및 클라이언트 번들에 Firebase JS SDK 메서드를 포함하는 경우 제품을 사용하기 전에 isSupported()
를 확인하여 런타임 오류로부터 보호하세요.
일부 제품만 모든 환경에서 지원됩니다.
선택사항: Firebase Admin SDK와 통합
관리자 번들이 브라우저 빌드에 포함되면 실패하게 되므로 서버 모듈에 제공하고 선택적 종속 항목으로 삽입하는 것이 좋습니다.
// your-component.ts
import type { app } from 'firebase-admin';
import { FIREBASE_ADMIN } from '../app.module';
@Component({...})
export class YourComponent {
constructor(@Optional() @Inject(FIREBASE_ADMIN) admin: app.App) {
...
}
}
// app.server.module.ts
import * as admin from 'firebase-admin';
import { FIREBASE_ADMIN } from './app.module';
@NgModule({
…
providers: [
…
{ provide: FIREBASE_ADMIN, useFactory: () => admin.apps[0] || admin.initializeApp() }
],
})
export class AppServerModule {}
// app.module.ts
import type { app } from 'firebase-admin';
export const FIREBASE_ADMIN = new InjectionToken<app.App>('firebase-admin');
SSR로 완전 동적 콘텐츠 제공
선택사항: Firebase 인증과 통합
웹 프레임워크 인식 Firebase 배포 도구는 쿠키를 사용하여 클라이언트 및 서버 상태를 자동으로 동기화합니다. Express res.locals
객체는 필요에 따라 인증된 Firebase 앱 인스턴스(firebaseApp
)와 현재 로그인한 사용자(currentUser
)를 포함하며, REQUEST 토큰(@nguniversal/express-engine/tokens에서 내보내기)을 통해 모듈에 삽입할 수 있습니다.