จับคู่ Cloud Functions กับ Firebase Hosting เพื่อสร้างและแสดงเนื้อหาแบบไดนามิก หรือสร้าง REST API เป็น Microservice
Cloud Functions for Firebase ให้คุณเรียกใช้โค้ดแบ็กเอนด์โดยอัตโนมัติเพื่อตอบสนองต่อคำขอ HTTPS ระบบจัดเก็บโค้ดของคุณไว้ในระบบคลาวด์ของ Google และเรียกใช้ในสภาพแวดล้อมที่มีการจัดการ คุณไม่จำเป็นต้องจัดการและปรับขนาดเซิร์ฟเวอร์ของคุณเอง
ดูตัวอย่าง Use Case และตัวอย่างสําหรับ Cloud Functions ที่ผสานรวมกับ Firebase Hosting ได้ที่ภาพรวมเกี่ยวกับ Serverless
เชื่อมต่อ 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
ไปที่เอกสารประกอบของ Cloud Functions เพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับคำขอ HTTPS
ขั้นตอนถัดไปจะอธิบายวิธีเข้าถึงฟังก์ชัน HTTPS นี้จาก Firebase HostingURL เพื่อให้สร้างเนื้อหาแบบไดนามิกสําหรับเว็บไซต์ที่โฮสต์ใน 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
) แต่เพิ่มbigben
ต่อท้าย URL ดังนี้http://localhost:5000/bigben
ปรับปรุงฟังก์ชันและฟังก์ชันการทํางานของฟังก์ชันสําหรับเว็บไซต์ ใช้โปรแกรมจำลอง Firebase เพื่อทดสอบการทดสอบซ้ำเหล่านี้
วางฟังก์ชันไว้ใกล้กับ Hosting เพื่อประสิทธิภาพที่ดีที่สุดโดยเลือกภูมิภาคใดภูมิภาคหนึ่งต่อไปนี้
us-west1
us-central1
us-east1
europe-west1
asia-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 ในโปรเจ็กต์ในเครื่องโดยเรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรี
functions
npm install express --save
เปิดไฟล์
/functions/index.js
แล้วนําเข้าและเริ่มต้น Express.js ดังนี้const 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 ในส่วน/api
app.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);
ไปที่เอกสารประกอบของ Cloud Functionsเพื่อดูข้อมูลเพิ่มเติมเกี่ยวกับการใช้ Firebase กับแอป Express และโมดูลมิดเดิลแวร์
ขั้นตอนถัดไป
ตั้งค่าการแคชสำหรับเนื้อหาแบบไดนามิกใน CDN ทั่วโลก
โต้ตอบกับบริการอื่นๆ ของ Firebase โดยใช้ Firebase Admin SDK
ตรวจสอบราคาและโควต้าและขีดจํากัดของ Cloud Functions