จับคู่ Cloud Functions กับ Firebase Hosting เพื่อสร้างและแสดงเนื้อหาแบบไดนามิก หรือสร้าง REST API เป็นไมโครเซอร์วิส
Cloud Functions for Firebase จะช่วยให้คุณเรียกใช้โค้ดแบ็กเอนด์ ได้โดยอัตโนมัติเพื่อตอบสนองต่อคำขอ HTTPS ระบบจัดเก็บโค้ดของคุณไว้ในระบบคลาวด์ของ Google และเรียกใช้ในสภาพแวดล้อมที่ มีการจัดการ คุณจึงไม่จำเป็นต้องจัดการและปรับขนาดเซิร์ฟเวอร์ด้วยตนเอง
ดูตัวอย่างกรณีการใช้งานและตัวอย่างของ Cloud Functions ที่ผสานรวมกับ Firebase Hosting ได้ที่ ภาพรวมแบบไม่ใช้เซิร์ฟเวอร์
เชื่อมต่อ Cloud Functions กับ Firebase Hosting
ส่วนนี้จะแสดงตัวอย่างการเชื่อมต่อฟังก์ชันกับ Firebase Hosting แบบทีละขั้นตอน
โปรดทราบว่าคุณสามารถ ปรับการตั้งค่าแคชได้หากต้องการเพื่อปรับปรุงประสิทธิภาพการแสดงเนื้อหาแบบไดนามิก
ขั้นตอนที่ 1: ตั้งค่า Cloud Functions
ตรวจสอบว่าคุณใช้ Firebase CLI เวอร์ชันล่าสุดและ ได้เริ่มต้นใช้งาน Firebase Hosting แล้ว
ดูวิธีการติดตั้ง CLI และเริ่มต้นใช้งาน Hosting โดยละเอียดได้ที่ คู่มือเริ่มต้นใช้งาน Hosting
ตรวจสอบว่าคุณได้ตั้งค่า Cloud Functions แล้ว โดยทำดังนี้
หากคุณตั้งค่า Cloud Functions แล้ว ให้ไปยัง ขั้นตอนที่ 2: สร้างและทดสอบฟังก์ชัน HTTPS
หากคุณ ยังไม่ได้ ตั้งค่า Cloud Functions
เริ่มต้นใช้งาน Cloud Functions โดยเรียกใช้คำสั่งต่อไปนี้จาก รูทของไดเรกทอรีโปรเจ็กต์
firebase init functions
เมื่อได้รับข้อความแจ้ง ให้เลือก JavaScript (ตัวอย่างการดำเนินการทีละขั้นตอนนี้ใช้ JS)
ตรวจสอบว่าคุณมีไดเรกทอรี
functionsในไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง (สร้างขึ้นโดยคำสั่ง Firebase ที่คุณเพิ่งเรียกใช้) ไดเรกทอรีfunctionsนี้เป็นที่เก็บโค้ดสำหรับ Cloud Functions
ขั้นตอนที่ 2: สร้างและทดสอบฟังก์ชัน HTTPS สำหรับเว็บไซต์ Hosting
เปิด
/functions/index.jsในตัวแก้ไขที่ต้องการแทนที่เนื้อหาของไฟล์ด้วยโค้ดต่อไปนี้
โค้ดนี้จะสร้างฟังก์ชัน HTTPS (ชื่อ
bigben) ที่ตอบกลับคำขอ HTTPS ด้วยเสียงBONGทุกชั่วโมงของวัน เช่นเดียวกับนาฬิกาconst functions = require('firebase-functions/v1'); exports.bigben = functions.https.onRequest((req, res) => { const hours = (new Date().getHours() % 12) + 1 // London is UTC + 1hr; res.status(200).send(`<!doctype html> <head> <title>Time</title> </head> <body> ${'BONG '.repeat(hours)} </body> </html>`); });ทดสอบฟังก์ชันในเครื่องโดยใช้ Firebase Local Emulator Suite
เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง
firebase emulators:start
เข้าถึงฟังก์ชันผ่าน URL ในเครื่องที่ CLI แสดงผล เช่น ตัวอย่าง:
http://localhost:5001/PROJECT_ID/us-central1/bigben
ดูข้อมูลเพิ่มเติมเกี่ยวกับคำขอ HTTPS ได้ที่เอกสารประกอบของ Cloud Functions
ขั้นตอนถัดไปจะแนะนำวิธีเข้าถึงฟังก์ชัน HTTPS นี้ จาก Firebase Hosting URL เพื่อให้ฟังก์ชันสร้างเนื้อหาแบบไดนามิกสำหรับ เว็บไซต์ที่โฮสต์ใน Firebase ได้
ขั้นตอนที่ 3: ส่งคำขอ HTTPS ไปยังฟังก์ชัน
กฎการเขียนใหม่ช่วยให้คุณส่งคำขอที่ตรงกับรูปแบบที่เฉพาะเจาะจงไปยังปลายทางเดียวได้ ขั้นตอนต่อไปนี้จะแสดง
วิธีส่งคำขอทั้งหมดจากเส้นทาง ../bigben ในเว็บไซต์ Hosting
เพื่อเรียกใช้ฟังก์ชัน bigben
เปิดไฟล์
firebase.jsonเพิ่มการกำหนดค่า
rewriteต่อไปนี้ในส่วนhosting"hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "/bigben", "function": { "functionId": "bigben", "region": "us-central1" // optional (see note below) "pinTag": true // optional (see note below) } } ] }ยืนยันว่าการเปลี่ยนเส้นทางทำงานตามที่คาดไว้โดยทดสอบอีกครั้งด้วยโปรแกรมจำลอง Firebase
เรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ที่อยู่ในเครื่อง
firebase emulators:start
ไปที่ URL ที่โฮสต์ในเครื่องสำหรับเว็บไซต์ตามที่ CLI แสดงผล (โดยปกติคือ
localhost:5000) แต่ให้ต่อท้าย URL ด้วยbigbenเช่นhttp://localhost:5000/bigben
ทำซ้ำฟังก์ชันและฟังก์ชันการทำงานของฟังก์ชันสำหรับเว็บไซต์ ใช้โปรแกรมจำลอง Firebase เพื่อทดสอบการทำซ้ำเหล่านี้
เลือกภูมิภาคใดภูมิภาคหนึ่งต่อไปนี้เพื่อจัดฟังก์ชันให้อยู่ร่วมกับ Hosting โดย เพื่อประสิทธิภาพที่ดีที่สุด
us-west1us-central1us-east1europe-west1asia-east1
ดูรายละเอียดเพิ่มเติมเกี่ยวกับกฎการเขียนใหม่ได้ที่หน้าการกำหนดค่า Hosting สำหรับ นอกจากนี้ คุณยังดูข้อมูลเกี่ยวกับ ลำดับความสำคัญของการตอบกลับ สำหรับการกำหนดค่า Hosting ต่างๆ ได้ด้วย
โปรดทราบว่าคุณสามารถ ปรับการตั้งค่าแคชได้หากต้องการเพื่อปรับปรุงประสิทธิภาพการแสดงเนื้อหาแบบไดนามิก
ขั้นตอนที่ 4: ทำให้ฟังก์ชันใช้งานได้
เมื่อฟังก์ชันทำงานได้ตามที่ต้องการในโปรแกรมจำลองแล้ว คุณก็สามารถดำเนินการทำให้ใช้งานได้ ทดสอบ และเรียกใช้ฟังก์ชันด้วยทรัพยากรโปรเจ็กต์ จริง ตอนนี้เป็นเวลาที่เหมาะสมที่จะพิจารณาการตั้งค่าตัวเลือกการรันไทม์เพื่อ ควบคุมลักษณะการทำงานของการปรับขนาด สำหรับฟังก์ชันที่ทำงานในการใช้งานจริง
ทำให้ฟังก์ชัน รวมถึงเนื้อหาและการกำหนดค่า Hosting ใช้งานได้ใน เว็บไซต์โดยเรียกใช้คำสั่งต่อไปนี้จากรูทของไดเรกทอรีโปรเจ็กต์ในเครื่อง
firebase deploy --only functions,hosting
เข้าถึงเว็บไซต์จริงและฟังก์ชันได้ที่ URL ต่อไปนี้
โดเมนย่อยของ Firebase:
PROJECT_ID.web.app/bigbenและPROJECT_ID.firebaseapp.com/bigbenโดเมนที่กำหนดเองที่เชื่อมต่อ:
CUSTOM_DOMAIN/bigben
ใช้เว็บเฟรมเวิร์ก
คุณสามารถใช้เว็บเฟรมเวิร์ก เช่น Express.js ใน Cloud Functions เพื่อ แสดงเนื้อหาแบบไดนามิกของแอปและเขียนเว็บแอปที่ซับซ้อนได้ง่ายขึ้น
ส่วนต่อไปนี้จะแสดงตัวอย่างการดำเนินการทีละขั้นตอนสำหรับการใช้ Express.js กับ Firebase Hosting และ Cloud Functions
ติดตั้ง Express.js ในโปรเจ็กต์ที่อยู่ในเครื่องโดยเรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรี
functionsnpm install express --save
เปิดไฟล์
/functions/index.jsจากนั้นนำเข้าและเริ่มต้นใช้งาน Express.jsconst functions = require('firebase-functions/v1'); const express = require('express'); const app = express();
เพิ่มปลายทาง 2 รายการต่อไปนี้
เพิ่มปลายทางแรกเพื่อแสดงดัชนีของเว็บไซต์ที่
/app.get('/', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.send(` <!doctype html> <head> <title>Time</title> <link rel="stylesheet" href="/style.css"> <script src="/script.js"></script> </head> <body> <p>In London, the clock strikes: <span id="bongs">${'BONG '.repeat(hours)}</span></p> <button onClick="refresh(this)">Refresh</button> </body> </html>`); });และปลายทางอีกรายการเพื่อแสดงจำนวน
BONGเป็น API ในรูปแบบ JSON ภายใต้/apiapp.get('/api', (req, res) => { const date = new Date(); const hours = (date.getHours() % 12) + 1; // London is UTC + 1hr; res.json({bongs: 'BONG '.repeat(hours)}); });
ส่งออกแอป Express.js เป็นฟังก์ชัน HTTPS
exports.app = functions.https.onRequest(app);
ในไฟล์
firebase.jsonให้ส่งคำขอทั้งหมดไปยังฟังก์ชันappการเขียนใหม่นี้ช่วยให้ Express.js แสดงเส้นทางย่อยต่างๆ ที่เรา กำหนดค่าไว้ (ในตัวอย่างนี้คือ/และ/api){ "hosting": { // ... // Add the "rewrites" attribute within "hosting" "rewrites": [ { "source": "**", "function": "app" } ] } }
เพิ่มมิดเดิลแวร์
จากตัวอย่างเดิม ตอนนี้คุณใช้ Express.js แล้ว จึงสามารถเพิ่ม มิดเดิลแวร์ Express.js ในวิธีปกติได้ เช่น คุณสามารถเปิดใช้ CORS คำขอในปลายทางได้
ติดตั้งมิดเดิลแวร์
corsโดยเรียกใช้คำสั่งต่อไปนี้npm install --save cors
เปิดไฟล์
/functions/index.jsจากนั้นเพิ่มcorsลงในแอป Express.js ดังนี้const cors = require('cors')({origin: true}); app.use(cors);
ดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Firebase กับแอป Express และโมดูลมิดเดิลแวร์ได้ที่Cloud Functionsเอกสารประกอบ
ขั้นตอนถัดไป
ตั้งค่าการแคชเนื้อหาแบบไดนามิกใน CDN ทั่วโลก
โต้ตอบกับบริการอื่นๆ ของ Firebase โดยใช้ Firebase Admin SDK
ตรวจสอบการกำหนดราคา รวมถึง โควต้าและขีดจำกัด สำหรับ Cloud Functions