Firebase is back at Google I/O on May 10! Register now

Organizuj wiele funkcji

Zadbaj o dobrą organizację dzięki kolekcji Zapisuj i kategoryzuj treści zgodnie ze swoimi preferencjami.

W miarę integrowania Cloud Functions z projektem Twój kod może się rozszerzyć i zawierać wiele niezależnych funkcji. Możesz mieć zbyt wiele funkcji, aby rozsądnie zmieścić je w jednym pliku, lub różne zespoły mogą wdrażać różne grupy funkcji, stwarzając ryzyko nadpisania lub przypadkowego usunięcia funkcji innego zespołu przez jeden zespół. Cloud Functions oferuje różne sposoby organizowania kodu w celu ułatwienia nawigacji i obsługi funkcji.

Organizowanie funkcji w bazach kodu

Możesz użyć właściwości codebase obiektu konfiguracji funkcji w pliku firebase.json , aby zarządzać dużym zbiorem funkcji w wielu repozytoriach lub pakietach podrzędnych w ramach jednej konfiguracji monorepozytorium:

# 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.
}

Właściwość codebase jest obsługiwana w Firebase CLI w wersji 10.7.1 i nowszych.

Zarządzanie wieloma repozytoriami

Właściwość codebase może uprościć zarządzanie wieloma repozytoriami. Przeanalizujmy przypadek, w którym masz dwa różne repozytoria, które wdrażają funkcje w tym samym projekcie Firebase:

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

Bez adnotacji bazy kodu interfejs Firebase CLI poprosiłby o usunięcie funkcji zdefiniowanych w innym repozytorium w momencie wdrażania:

$ (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)

Możesz uniknąć tego problemu, dodając unikalną adnotację bazy kodu w sekcji konfiguracji funkcji pliku firebase.json w każdym repozytorium projektu:

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

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

Dzięki adnotacji codebase interfejs Firebase CLI nie prosi już o usunięcie funkcji zdefiniowanych poza Twoim bezpośrednim repozytorium:

$ (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!

Zarządzanie wieloma pakietami źródłowymi (monorepo)

Właściwość codebase może uprościć zarządzanie wieloma pakietami źródłowymi w jednym repozytorium. Przeanalizujmy przypadek, w którym masz katalog projektu firebase z definicjami funkcji rozłożonymi na kilka podpakietów:

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

Ta konfiguracja pasuje do następujących przypadków użycia:

  • Masz konfigurację monorepo i różne zespoły zarządzają własnymi definicjami funkcji w izolowanym pakiecie.
  • Masz funkcję z silną zależnością zewnętrzną i długotrwałą inicjalizacją i chcesz odizolować tę funkcję od innych funkcji wrażliwych na opóźnienia.

Aby obsługiwać taką konfigurację monrepo, zdefiniuj konfiguracje wielu funkcji w firebase.json :

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

W tej konfiguracji Firebase CLI wdraża funkcje ze wszystkich pakietów w jednym poleceniu wdrażania:

$ 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)...
...

Możesz także wdrożyć określoną bazę kodu:

$ 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)...
...

Zapisz funkcje w wielu plikach

Rozpoczynając pracę z Cloud Functions, możesz umieścić kilka pierwszych funkcji w jednym pliku:

index.js


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

Może to być trudne do zarządzania przy więcej niż kilku funkcjach. Zamiast tego możesz umieścić całą logikę dla każdej funkcji w osobnym pliku i użyć index.js jako prostej listy eksportów:

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;

Funkcje grupowe

W wielu projektach funkcje można podzielić na logiczne grupy, które należy wdrażać i utrzymywać razem. Na przykład możesz mieć grupę funkcji używanych do raportowania metryk:

metrics.js


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

Możesz umieścić te funkcje w grupie podczas eksportowania ich do index.js :

index.js


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

Po wdrożeniu funkcje zostaną poprzedzone nazwą ich grupy, więc w tym przykładzie funkcje będą miały nazwy metrics-usageStats i metrics-nightlyReport .

Podczas wdrażania funkcji możesz ograniczyć akcję do jednej grupy:


firebase deploy --only functions:metrics

Następne kroki

Aby dowiedzieć się więcej o Cloud Functions, zobacz: