Mengatur beberapa fungsi

Saat Anda mengintegrasikan Cloud Functions ke dalam project, kode Anda dapat diluaskan agar dapat menampung banyak fungsi independen. Anda mungkin memiliki terlalu banyak fungsi untuk ditampung dalam satu file secara wajar, atau tim yang berbeda mungkin men-deploy grup fungsi yang berbeda pula, sehingga menimbulkan risiko satu tim menimpa atau tidak sengaja menghapus fungsi tim lain. Cloud Functions menawarkan berbagai cara untuk mengatur kode Anda agar lebih mudah untuk menavigasi dan memelihara fungsi.

Mengatur fungsi di codebase

Anda dapat menggunakan properti codebase objek konfigurasi fungsi di firebase.json untuk mengelola fungsi dalam jumlah besar di beberapa repositori atau sub-paket dalam satu penyiapan monorepo repositori:

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

Properti codebase didukung di Firebase CLI v10.7.1 dan yang lebih baru.

Mengelola beberapa repositori

Properti codebase dapat membantu menyederhanakan pengelolaan beberapa repositori. Perhatikan kasus dua repositori berbeda yang men-deploy beberapa fungsi ke project Firebase yang sama:

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

Tanpa anotasi codebase, Firebase CLI akan meminta Anda untuk menghapus fungsi yang ditentukan di repositori lain pada saat men-deploy:

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

Anda dapat menghindari masalah ini dengan menambahkan anotasi codebase unik di bagian konfigurasi fungsi firebase.json di setiap repositori project:

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

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

Dengan anotasi codebase, Firebase CLI tidak lagi meminta Anda untuk menghapus fungsi yang ditentukan di luar repositori antara:

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

Mengelola beberapa paket sumber (monorepo)

Properti codebase dapat membantu menyederhanakan pengelolaan beberapa paket sumber dalam satu repositori. Mari kita lihat kasus sebuah direktori project firebase dengan definisi fungsi yang tersebar di beberapa subpaket:

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

Penyiapan ini cocok dengan kasus penggunaan berikut:

  • Anda memiliki penyiapan monorepo dan meminta beberapa tim yang berbeda mengelola definisi fungsinya sendiri-sendiri dalam paket terpisah.
  • Anda memiliki fungsi dengan dependensi eksternal yang berat serta inisialisasi yang berjalan lama, dan ingin memisahkan fungsi tersebut dari fungsi lainnya yang sensitif terhadap latensi.

Untuk mendukung penyiapan monrepo seperti ini, tentukan beberapa konfigurasi fungsi di firebase.json:

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

Dengan konfigurasi ini, Firebase CLI men-deploy fungsi dari semua paket dalam satu perintah deploy:

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

Anda juga dapat men-deploy codebase tertentu:

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

Menulis fungsi di beberapa file

Saat memulai Cloud Functions, Anda dapat menempatkan beberapa fungsi pertama dalam satu file:

index.js


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

Untuk fungsi yang sedikit lebih banyak, hal tersebut sulit untuk dikelola. Sebagai gantinya, Anda dapat memasukkan semua logika untuk setiap fungsi dalam file-nya sendiri dan menggunakan file index.js Anda sebagai daftar ekspor sederhana:

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;

Mengelompokkan fungsi

Dalam banyak project, fungsi dapat dipisahkan menjadi grup logika yang harus di-deploy dan dikelola secara bersamaan. Misalnya, Anda mungkin memiliki grup fungsi yang digunakan untuk melaporkan metrik:

metrics.js


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

Anda dapat memasukkan fungsi ini ke grup saat mengekspornya di file index.js Anda:

index.js


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

Saat di-deploy, fungsi akan diawali dengan nama grupnya, sehingga dalam contoh ini fungsi diberi nama metrics-usageStats dan metrics-nightlyReport.

Saat men-deploy fungsi, Anda dapat membatasi tindakan ke satu grup:


firebase deploy --only functions:metrics