Khi bạn tích hợp Cloud Functions vào dự án, mã của bạn có thể mở rộng để chứa nhiều hàm độc lập. Bạn có thể có quá nhiều hàm để có thể đặt vừa trong một tệp hoặc các nhóm khác nhau có thể triển khai các nhóm hàm khác nhau, tạo ra nguy cơ một nhóm ghi đè hoặc vô tình xoá các hàm của nhóm khác. Cloud Functions cung cấp nhiều cách để sắp xếp mã nhằm giúp bạn dễ dàng di chuyển và duy trì các hàm.
Sắp xếp các hàm trong cơ sở mã
Bạn có thể sử dụng thuộc tính codebase của đối tượng cấu hình hàm trong
firebase.json để quản lý một tập hợp lớn các hàm trên nhiều
kho lưu trữ hoặc gói con trong một kho lưu trữ duy nhất (thiết lập monorepo):
# 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.
}
Thuộc tính codebase được hỗ trợ trong Firebase CLI phiên bản 10.7.1 trở lên.
Quản lý nhiều kho lưu trữ
Thuộc tính codebase có thể giúp đơn giản hoá việc quản lý nhiều
kho lưu trữ. Hãy xem xét một trường hợp bạn có 2 kho lưu trữ khác nhau
triển khai các hàm cho cùng một dự án Firebase:
$ tree .
├── repoA
│ ├── firebase.json
│ └── functions
│ ├── index.js
│ └── package.json
└── repoB
├── firebase.json
└── functions
├── index.js
└── package.json
Nếu không có chú thích cơ sở mã, Firebase CLI sẽ nhắc bạn xoá các hàm được xác định trong kho lưu trữ khác tại thời điểm triển khai:
$ (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)
Bạn có thể tránh vấn đề này bằng cách thêm một chú thích cơ sở mã duy nhất trong phần cấu hình hàm của firebase.json trong mỗi kho lưu trữ dự án:
# repoA/firebase.json
"functions": {
"codebase": "repo-a"
}
# repoB/firebase.json
"functions": {
"codebase": "repo-b"
}
Với chú thích cơ sở mã, Firebase CLI không còn nhắc bạn xoá các hàm được xác định bên ngoài kho lưu trữ trực tiếp của bạn:
$ (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!
Quản lý nhiều gói nguồn (monorepo)
Thuộc tính codebase có thể giúp đơn giản hoá việc quản lý nhiều gói nguồn
trong một kho lưu trữ duy nhất. Hãy xem xét một trường hợp bạn có một thư mục dự án Firebase
với các định nghĩa hàm được phân tán trên một số gói con:
$ tree .
├── firebase.json
├── teamA
│ ├── index.js
│ └── package.json
└── teamB
├── index.js
└── package.json
Thiết lập này phù hợp với các trường hợp sử dụng sau:
- Bạn có một thiết lập monorepo và có nhiều nhóm quản lý các định nghĩa hàm riêng trong một gói riêng biệt.
- Bạn có một hàm có phần phụ thuộc bên ngoài lớn và quá trình khởi chạy kéo dài, đồng thời muốn tách hàm đó khỏi các hàm khác nhạy cảm với độ trễ.
Để hỗ trợ thiết lập monorepo như thế này, hãy xác định nhiều cấu hình hàm
trong firebase.json:
"functions": [
{
"source": "teamA",
"codebase": "team-a"
},
{
"source": "teamB",
"codebase": "team-b"
},
]
Với cấu hình này, Firebase CLI sẽ triển khai các hàm từ tất cả các gói trong một lệnh triển khai duy nhất:
$ 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)...
...
Bạn cũng có thể triển khai một cơ sở mã cụ thể:
$ 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)...
...
Viết các hàm trong nhiều tệp
Khi bắt đầu sử dụng Cloud Functions bạn có thể đặt một vài hàm đầu tiên vào một tệp duy nhất:
index.js
const functions = require('firebase-functions/v1');
exports.foo = functions.https.onRequest((request, response) => {
// ...
});
exports.bar = functions.https.onRequest((request, response) => {
// ...
});
main.py
from firebase_functions import https_fn
@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello bar!")
Việc này có thể trở nên khó quản lý nếu có nhiều hàm. Thay vào đó, bạn có thể đặt tất cả logic cho mỗi hàm vào tệp riêng và sử dụng tệp nguồn làm danh sách xuất:
Node.js
foo.js
const functions = require('firebase-functions/v1'); exports.foo = functions.https.onRequest((request, response) => { // ... });
bar.js
const functions = require('firebase-functions/v1'); 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;
Python
foo.py
from firebase_functions import https_fn
@https_fn.on_request()
def foo(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
bar.py
from firebase_functions import https_fn
@https_fn.on_request()
def bar(req: https_fn.Request) -> https_fn.Response:
return https_fn.Response("Hello foo!")
main.py
from fn_impl.foo import *
from fn_impl.bar import *
Thiết lập này giả định cấu trúc thư mục dự án như sau:
my-project
├── firebase.json
└── functions
├── fn_impl
│ ├── __init__.py
│ ├── foo.py
│ └── bar.py
├── main.py
└── requirements.txt
fn_impl: Có thể có bất kỳ tên nào
__init__.py: Bắt buộc, nhưng có thể trống
Nhóm các hàm
Trong nhiều dự án, các hàm có thể được tách thành các nhóm logic cần được triển khai và duy trì cùng nhau. Ví dụ: bạn có thể có một nhóm hàm dùng để báo cáo các chỉ số:
metrics.js
const functions = require('firebase-functions/v1'); exports.usageStats = functions.https.onRequest((request, response) => { // ... }); exports.nightlyReport = functions.https.onRequest((request, response) => { // ... });
Bạn có thể đặt các hàm này vào một nhóm khi xuất chúng trong index.js
tệp:
index.js
// Export both functions from metrics.js in the "metrics" group: // - metrics-usageStats // - metrics-nightlyReport exports.metrics = require('./metrics');
Khi được triển khai, các hàm sẽ được thêm tiền tố bằng tên của nhóm. Vì vậy,
trong ví dụ này, các hàm sẽ được đặt tên là metrics-usageStats
và metrics-nightlyReport.
Khi triển khai các hàm, bạn có thể giới hạn hành động cho một nhóm duy nhất:
firebase deploy --only functions:metrics
Các bước tiếp theo
Để tìm hiểu thêm về Cloud Functions, hãy xem: