With the Firebase framework-aware CLI, you can deploy your Angular application to Firebase and serve dynamic content to your users.
Before you begin
Before you get started deploying your app to Firebase, review the following requirements and options:
- Firebase CLI version 12.1.0 or later. Make sure to install the CLI using your preferred method.
Optional: Billing enabled on your Firebase project (required if you plan to use SSR)
Optional: AngularFire
Initialize Firebase
To get started, initialize Firebase for your framework project.
Use the Firebase CLI for a new project, or modify firebase.json
for an
existing project.
Initialize a new project
- In the Firebase CLI, enable the web frameworks preview:
firebase experiments:enable webframeworks
Run the initialization command from the CLI and then follow the prompts:
firebase init hosting
Answer yes to "Do you want to use a web framework? (experimental)"
Choose your hosting source directory; this could be an existing Angular app.
If prompted, choose Angular.
Initialize an existing project
Change your hosting config in firebase.json
to have a source
option, rather
than a public
option. For example:
{
"hosting": {
"source": "./path-to-your-angular-workspace"
}
}
Serve static content
After initializing Firebase, you can serve static content with the standard deployment command:
firebase deploy
Pre-render dynamic content
To prerender dynamic content in Angular, you need to set up Angular SSR.
ng add @angular/ssr
See the Angular Prerendering (SSG) guide for more information.
Optional: add a server module
Deploy
When you deploy with firebase deploy
, Firebase builds your browser bundle,
your server bundle, and prerenders the application. These elements are deployed
to Hosting and Cloud Functions for Firebase.
Custom deploy
The Firebase CLI assumes that you have a single application defined in your
angular.json
with a production build configuration.
If need to tailor the CLI's assumptions, you can either use the
FIREBASE_FRAMEWORKS_BUILD_TARGET
environment variable or add
AngularFire and modify your
angular.json
:
{
"deploy": {
"builder": "@angular/fire:deploy",
"options": {
"version": 2,
"buildTarget": "OVERRIDE_YOUR_BUILD_TARGET"
}
}
}
Optional: integrate with the Firebase JS SDK
When including Firebase JS SDK methods in both server and client bundles, guard
against runtime errors by checking isSupported()
before using the product.
Not all products are supported in all environments.
Optional: integrate with the Firebase Admin SDK
Admin bundles will fail if they are included in your browser build, so consider providing them in your server module and injecting as an optional dependency:
// 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');
Serve fully dynamic content with SSR
Optional: integrate with Firebase Authentication
The web framework-aware Firebase deployment tooling automatically keeps client
and server state in sync using cookies. The Express res.locals
object will
optionally contain an authenticated Firebase App instance (firebaseApp
) and
the currently signed in user (currentUser
). This can be injected into your
module via the REQUEST token (exported from @nguniversal/express-engine/tokens).