שלב Angular Universal

עם CLI המודע למסגרת של Firebase, אתה יכול לפרוס את אפליקציית Angular שלך ל-Firebase ולהגיש תוכן דינמי למשתמשים שלך.

לפני שאתה מתחיל

לפני שתתחיל בפריסת האפליקציה שלך ב-Firebase, סקור את הדרישות והאפשרויות הבאות:

  • Firebase CLI גרסה 12.1.0 ואילך. הקפד להתקין את ה-CLI בשיטה המועדפת עליך.
  • אופציונלי: חיוב מופעל בפרויקט Firebase שלך ​​(נדרש אם אתה מתכנן להשתמש ב-SSR)

  • אופציונלי: AngularFire

אתחל את Firebase

כדי להתחיל, אתחל את Firebase עבור פרויקט המסגרת שלך. השתמש ב-Firebase CLI עבור פרויקט חדש, או שנה את firebase.json עבור פרויקט קיים.

אתחול פרויקט חדש

  1. ב-Firebase CLI, אפשר את התצוגה המקדימה של מסגרות האינטרנט:
    firebase experiments:enable webframeworks
  2. הפעל את פקודת האתחול מה-CLI ולאחר מכן עקוב אחר ההנחיות:

    firebase init hosting

  3. ענה כן ל"האם אתה רוצה להשתמש במסגרת אינטרנטית? (ניסיוני)"

  4. בחר את ספריית מקור האירוח שלך; זו יכולה להיות אפליקציית Angular קיימת.

  5. אם תתבקש, בחר Angular.

אתחול פרויקט קיים

שנה את תצורת האירוח שלך ב- firebase.json כך שתהיה אפשרות source , ולא אפשרות public . לדוגמה:

{
  "hosting": {
    "source": "./path-to-your-angular-workspace"
  }
}

הצג תוכן סטטי

לאחר אתחול Firebase, תוכל להגיש תוכן סטטי עם פקודת הפריסה הרגילה:

firebase deploy

עיבוד מראש של תוכן דינמי

כדי להציג תוכן דינמי מראש ב-Angular, עליך להגדיר את Angular Universal. Firebase CLI מצפה למנוע Express:

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 בונה את חבילת הדפדפן שלך, חבילת השרת שלך ומציגה מראש את היישום. אלמנטים אלה נפרסים ל- Hosting ו-Cloud Functions for Firebase.

פריסה מותאמת אישית

ה-CLI של Firebase מניח שיש לך שלבי שרת, בנייה ועיבוד מראש בסכמטיקה שלך עם תצורת ייצור.

אם אתה רוצה להתאים את ההנחות של ה-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 Authentication

כלי הפריסה של Firebase המודע למסגרת האינטרנט שומר באופן אוטומטי על מצב הלקוח והשרת מסונכרנים באמצעות קובצי Cookie. האובייקט Express res.locals יכיל באופן אופציונלי מופע של Firebase App מאומת ( firebaseApp ) ואת המשתמש המחובר כעת ( currentUser ). ניתן להחדיר זאת למודול שלך באמצעות אסימון REQUEST (מיוצא מ-@nguniversal/express-engine/tokens).