จัดระเบียบหลายฟังก์ชั่น

เมื่อคุณผสานรวม Cloud Functions เข้ากับโปรเจ็กต์ของคุณ โค้ดของคุณสามารถขยายให้มีฟังก์ชันอิสระมากมาย คุณอาจมีฟังก์ชันมากเกินไปที่จะใส่ลงในไฟล์เดียวได้อย่างเหมาะสม หรือทีมต่างๆ อาจปรับใช้กลุ่มฟังก์ชันต่างๆ กัน สร้างความเสี่ยงที่ทีมหนึ่งจะเขียนทับหรือลบฟังก์ชันของทีมอื่นโดยไม่ได้ตั้งใจ Cloud Functions นำเสนอวิธีต่างๆ ในการจัดระเบียบโค้ดของคุณ เพื่อให้นำทางและรักษาฟังก์ชันของคุณได้ง่ายขึ้น

จัดระเบียบฟังก์ชันใน codebases

คุณสามารถใช้คุณสมบัติ codebase ของอ็อบเจ็กต์การกำหนดค่าฟังก์ชันใน firebase.json เพื่อจัดการคอลเล็กชันฟังก์ชันขนาดใหญ่ในที่เก็บหรือแพ็กเกจย่อยจำนวนมากภายในการตั้งค่า 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.
}

คุณสมบัติ codebase รองรับใน Firebase CLI v10.7.1 ขึ้นไป

การจัดการหลายที่เก็บ

คุณสมบัติ codebase สามารถช่วยลดความยุ่งยากในการจัดการที่เก็บหลายแห่ง มาตรวจสอบกรณีที่คุณมีที่เก็บสองแห่งที่แตกต่างกันซึ่งปรับใช้ฟังก์ชันกับโปรเจ็กต์ Firebase เดียวกัน:

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

หากไม่มีคำอธิบายประกอบของ codebase Firebase CLI จะแจ้งให้คุณลบฟังก์ชันที่กำหนดไว้ในที่เก็บอื่นในเวลาที่ปรับใช้:

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

คุณสามารถหลีกเลี่ยงปัญหานี้ได้โดยการเพิ่มหมายเหตุประกอบ codebase ที่ไม่ซ้ำกันในส่วนการกำหนดค่าฟังก์ชันของ firebase.json ในแต่ละที่เก็บโปรเจ็กต์:

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

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

ด้วยคำอธิบายประกอบของ codebase Firebase CLI จะไม่แจ้งให้คุณลบฟังก์ชันที่กำหนดไว้ภายนอกที่เก็บทันทีของคุณอีกต่อไป:

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

การจัดการหลายแพ็คเกจที่มา (monorepo)

คุณสมบัติ codebase สามารถช่วยลดความยุ่งยากในการจัดการแพ็คเกจต้นทางหลายรายการในที่เก็บเดียว มาตรวจสอบเคสที่คุณมีไดเร็กทอรีโปรเจ็กต์ firebase ที่มีคำจำกัดความของฟังก์ชันที่กระจายอยู่ในแพ็กเก็ตย่อยต่างๆ:

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

การตั้งค่านี้เหมาะกับกรณีการใช้งานต่อไปนี้:

  • คุณมีการตั้งค่า monorepo และให้ทีมต่างๆ จัดการข้อกำหนดฟังก์ชันของตนเองในแพ็คเกจที่แยกออกมา
  • คุณมีฟังก์ชันที่มีการพึ่งพาภายนอกจำนวนมากและการกำหนดค่าเริ่มต้นที่ใช้เวลานาน และต้องการแยกฟังก์ชันนั้นออกจากฟังก์ชันอื่นๆ ที่ไวต่อเวลาแฝง

เพื่อรองรับการตั้งค่า monrepo เช่นนี้ ให้กำหนดการกำหนดค่าฟังก์ชั่นหลายรายการใน firebase.json :

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

ด้วยการกำหนดค่านี้ Firebase CLI จะปรับใช้ฟังก์ชันจากแพ็คเกจทั้งหมดในคำสั่งการปรับใช้เดียว:

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

คุณยังสามารถปรับใช้ codebase เฉพาะได้:

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

เขียนฟังก์ชันในหลายไฟล์

เมื่อเริ่มต้นใช้งาน Cloud Functions คุณอาจรวมฟังก์ชันสองสามอย่างแรกไว้ในไฟล์เดียว:

index.js


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

การจัดการนี้ทำได้ยากด้วยฟังก์ชันมากกว่าสองสามอย่าง คุณสามารถใส่ตรรกะทั้งหมดของคุณสำหรับแต่ละฟังก์ชันในไฟล์ของตนเอง และใช้ไฟล์ index.js เป็นรายการการส่งออกอย่างง่ายแทน:

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;

ฟังก์ชั่นกลุ่ม

ในหลายโปรเจ็กต์ ฟังก์ชันสามารถแยกออกเป็นกลุ่มลอจิคัลที่ควรปรับใช้และดูแลร่วมกัน ตัวอย่างเช่น คุณอาจมีกลุ่มของฟังก์ชันที่ใช้สำหรับการรายงานเมตริก:

metrics.js


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

คุณสามารถรวมฟังก์ชันเหล่านี้ในกลุ่มเมื่อส่งออกในไฟล์ index.js ของคุณ:

index.js


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

เมื่อปรับใช้ ฟังก์ชันต่างๆ จะขึ้นต้นด้วยชื่อกลุ่ม ดังนั้นในตัวอย่างนี้ ฟังก์ชันจะมีชื่อว่า metrics-usageStats และ metrics-nightlyReport

เมื่อปรับใช้ฟังก์ชัน คุณสามารถจำกัดการดำเนินการให้อยู่ในกลุ่มเดียวได้:


firebase deploy --only functions:metrics

ขั้นตอนถัดไป

หากต้องการเรียนรู้เพิ่มเติมเกี่ยวกับ Cloud Functions โปรดดูที่: