Join us in person and online for Firebase Summit on October 18, 2022. Learn how Firebase can help you accelerate app development, release your app with confidence, and scale with ease. Register now

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

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

เมื่อคุณผสานรวม 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 โปรดดูที่: