获取我们在 Firebase 峰会上发布的所有信息,了解 Firebase 可如何帮助您加快应用开发速度并满怀信心地运行应用。了解详情

Organizza più funzioni

Man mano che integri Cloud Functions nel tuo progetto, il tuo codice potrebbe espandersi per contenere molte funzioni indipendenti. Potresti avere troppe funzioni per poterle inserire ragionevolmente in un unico file, oppure team diversi potrebbero distribuire gruppi di funzioni diversi, creando il rischio che un team sovrascriva o elimini accidentalmente le funzioni di un altro team. Cloud Functions offre diversi modi per organizzare il codice per semplificare la navigazione e la manutenzione delle funzioni.

Organizza le funzioni nelle basi di codice

Puoi utilizzare la proprietà codebase dell'oggetto di configurazione delle funzioni in firebase.json per gestire un'ampia raccolta di funzioni su più repository o sottopacchetti all'interno di un'unica configurazione monorepo del repository:

# firebase.json
"functions": {
  "codebase": "my-codebase"
  # NOTE: Codebase must be less than 63 characters and can contain only
  # lowercase letters, numeric characters, underscores, and dashes.
}

La proprietà codebase è supportata in Firebase CLI v10.7.1 e versioni successive.

Gestione di più repository

La proprietà codebase può aiutare a semplificare la gestione di più repository. Esaminiamo un caso in cui hai due repository diversi che distribuiscono funzioni allo stesso progetto Firebase:

$  tree .
├── repoA
│   ├── firebase.json
│   └── functions
│       ├── index.js
│       └── package.json
└── repoB
    ├── firebase.json
    └── functions
        ├── index.js
        └── package.json

Senza le annotazioni della codebase, l'interfaccia a riga di comando di Firebase avrebbe richiesto di eliminare le funzioni definite nell'altro repository al momento della distribuzione:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
The following functions are found in your project but do not exist in your local source code:
        fn1FromRepoB
        fn2FromRepoB
        ...
? Would you like to proceed with deletion? Selecting no will continue the rest of the deployments. (y/N)

Puoi evitare questo problema aggiungendo un'annotazione della base di codice univoca nella sezione di configurazione delle funzioni di firebase.json in ogni repository del progetto:

# repoA/firebase.json
"functions": {
  "codebase": "repo-a"
}

# repoB/firebase.json
"functions": {
  "codebase": "repo-b"
}

Con l'annotazione della base di codice, la CLI di Firebase non richiede più di eliminare le funzioni definite al di fuori del tuo repository immediato:

$ (cd repoA && firebase deploy --only functions)
...
i  functions: preparing functions directory for uploading...
✔  functions: functions folder uploaded successfully
#  Gleefully ignores functions from repoB
i  functions: creating Node.js 16 function fnFromRepoA (us-central1)...
✔  Deploy Complete!

Gestione di più pacchetti sorgente (monorepo)

La proprietà codebase può aiutare a semplificare la gestione di più pacchetti di origine in un unico repository. Esaminiamo un caso in cui hai una directory di progetto Firebase con definizioni di funzioni distribuite su diversi sottopacchetti:

$  tree .
├── firebase.json
├── teamA
│   ├── index.js
│   └── package.json
└── teamB
    ├── index.js
    └── package.json

Questa configurazione si adatta ai seguenti casi d'uso:

  • Hai una configurazione monorepo e diversi team gestiscono le proprie definizioni di funzione in un pacchetto isolato.
  • Si dispone di una funzione con una forte dipendenza esterna e un'inizializzazione di lunga durata e si desidera isolare tale funzione da altre funzioni sensibili alla latenza.

Per supportare l'installazione di monrepo in questo modo, definisci più configurazioni di funzioni in firebase.json :

"functions": [
  {
    "source": "teamA",
    "codebase": "team-a"
  },
  {
    "source": "teamB",
    "codebase": "team-b"
  },
]

Con questa configurazione, l'interfaccia a riga di comando di Firebase distribuisce le funzioni di tutti i pacchetti in un unico comando di distribuzione:

$ firebase deploy --only functions
i  deploying functions
i  functions: preparing codebase team-a for deployment
i  functions: preparing codebase team-b for deployment
i  functions: creating Node.js 16 function team-a:helloATeam(us-central1)...
i  functions: creating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Puoi anche distribuire una base di codice specifica:

$ firebase deploy --only functions:team-b
i  deploying functions
i  functions: preparing codebase team-b for deployment
i  functions: updating Node.js 16 function team-b:helloBTeam(us-central1)...
...

Scrivi funzioni in più file

Quando inizi a utilizzare Cloud Functions potresti mettere le tue prime funzioni in un unico file:

index.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

Questo può diventare difficile da gestire con più di poche funzioni. Invece, puoi inserire tutta la tua logica per ogni funzione nel proprio file e utilizzare il tuo file index.js come un semplice elenco di esportazioni:

foo.js


const functions = require('firebase-functions');
exports.foo = functions.https.onRequest((request, response) => {
  // ...
});

bar.js


const functions = require('firebase-functions');
exports.bar = functions.https.onRequest((request, response) => {
  // ...
});

index.js


const foo = require('./foo');
const bar = require('./bar');
exports.foo = foo.foo;
exports.bar = bar.bar;

Funzioni di gruppo

In molti progetti, le funzioni possono essere separate in gruppi logici che devono essere distribuiti e gestiti insieme. Ad esempio, potresti avere un gruppo di funzioni utilizzate per la creazione di rapporti sulle metriche:

metrics.js


const functions = require('firebase-functions');
exports.usageStats = functions.https.onRequest((request, response) => {
  // ...
});
exports.nightlyReport = functions.https.onRequest((request, response) => {
  // ...
});

Puoi inserire queste funzioni in un gruppo quando le esporti nel tuo file index.js :

index.js


// Export both functions from metrics.js in the "metrics" group:
//  - metrics-usageStats
//  - metrics-nightlyReport
exports.metrics = require('./metrics');

Una volta distribuite, le funzioni saranno precedute dal nome del loro gruppo, quindi in questo esempio le funzioni saranno denominate metrics-usageStats e metrics-nightlyReport .

Quando si distribuiscono le funzioni è possibile limitare l'azione a un singolo gruppo:


firebase deploy --only functions:metrics

Prossimi passi

Per ulteriori informazioni sulle funzioni cloud, vedere: