Prerequisites
Prerequisite คืออะไร?
หัวข้อที่มีชื่อว่า “Prerequisite คืออะไร?”prerequisite คือเงื่อนไขที่คุณแนบไปกับ feature flag ที่บอกว่า: “ประเมิน flag นี้ก็ต่อเมื่อ flag อื่นเปิดอยู่ (หรือมีค่าเฉพาะ)”
ทำให้คุณสร้าง dependency chain ได้:
checkout-v2เปิดใช้งานได้ก็ต่อเมื่อnew-payment-providerเปิดอยู่ai-search-resultsเปิดใช้งานได้ก็ต่อเมื่อsearch-redesignเปิดอยู่ และbeta-featuresเปิดอยู่
หากไม่มี prerequisites คุณต้องจัดการ dependency เหล่านี้ด้วยตัวเองในโค้ดของแอป — เพิ่ม if (flagA && flagB) guard ทุกที่ prerequisite ย้าย logic นั้นเข้าไปใน GrowthBook ทำให้โค้ดสะอาดขึ้นและ dependency มองเห็นได้ใน UI
เมื่อใดควรใช้ prerequisites
หัวข้อที่มีชื่อว่า “เมื่อใดควรใช้ prerequisites”prerequisites มีประโยชน์สูงสุดเมื่อ:
- Staged rollout chains — flag ระดับ surface ขึ้นอยู่กับ infrastructure flag ที่ rollout เต็มที่แล้ว
- Kill switches พร้อม dependencies — การปิด
new-payment-providerควรปิดทุกอย่างที่ depend อยู่โดยอัตโนมัติ โดยไม่ต้อง deploy ใหม่ - Beta gate stacking — ฟีเจอร์เข้าถึงได้เฉพาะเมื่อ user อยู่ใน
betacohort ทั่วไป AND อยู่ใน sub-experiment เฉพาะ
การสร้าง prerequisite ใน GrowthBook UI
หัวข้อที่มีชื่อว่า “การสร้าง prerequisite ใน GrowthBook UI”- ไปที่ Features และเปิด feature ที่คุณต้องการเพิ่ม prerequisite (flag dependent)
- บนหน้า feature detail คลิก Edit ถัดจาก Default Value & Rules
- เลื่อนลงไปที่ส่วน Prerequisites และคลิก Add Prerequisite
- ใน dropdown ค้นหาและเลือก flag parent (อันที่ต้องเปิดก่อน)
- ตั้ง Required Value — สำหรับ boolean flag เลือก
true - คลิก Save
ตอนนี้เมื่อ SDK ประเมิน flag dependent:
- หาก parent flag เป็น
false(หรือ override rules คืนค่าfalse) flag dependent จะคืนค่า off value โดยไม่คำนึงถึง rules ของตัวเอง - หาก parent flag เป็น
trueflag dependent จะประเมินตามปกติ
สำคัญ: Circular prerequisites (A ต้องการ B, B ต้องการ A) จะถูก GrowthBook ตรวจพบและบล็อกตั้งแต่ save time
ตัวอย่าง dependency chain
หัวข้อที่มีชื่อว่า “ตัวอย่าง dependency chain”ลองนึกถึงสาม feature ตามลำดับ:
new-payment-provider (infrastructure flag) ↓ prerequisite checkout-v2 (UI flag) ↓ prerequisite express-checkout (premium surface flag)การปิด new-payment-provider จะ cascade — ทั้ง checkout-v2 และ express-checkout ดับอัตโนมัติ แม้ว่า rule ของทั้งคู่จะบอกว่า ON ทำให้คุณมี kill switch เดียวสำหรับทั้ง chain
import { GrowthBook } from '@growthbook/growthbook';
const gb = new GrowthBook({
apiHost: 'https://cdn.growthbook.io',
clientKey: 'sdk-YOUR_DEV_KEY',
attributes: { id: 'user-123' },
});
await gb.init({ timeout: 2000 });
// Prerequisites are evaluated server-side in GrowthBook
// and baked into the feature payload the SDK downloads.
// No extra client code is needed — isOn() already
// respects the prerequisite chain.
const paymentOn = gb.isOn('new-payment-provider');
const checkoutOn = gb.isOn('checkout-v2'); // false if paymentOn is false
const expressOn = gb.isOn('express-checkout'); // false if checkoutOn is false
console.log({ paymentOn, checkoutOn, expressOn });ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| ตั้ง Prerequisite flag | ป้องกัน dependency ผิดลำดับ | เพิ่มความซับซ้อนของ dependency graph |
| ไม่ตั้ง Prerequisite | ง่ายกว่า | เสี่ยง feature ถูกเปิดก่อนที่ dependency พร้อม |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- สร้าง circular dependency ระหว่าง flag (flag A ต้องพึ่ง B, B ต้องพึ่ง A)
- ลืมว่า prerequisite ที่ปิดจะทำให้ feature ลูกปิดไปด้วยเสมอ
- ไม่ document dependency graph ทำให้ทีมอื่นไม่รู้ว่าทำไม flag ถึงปิดอยู่
💡 ตัวอย่างจากของจริง
ระบบ platform ขนาดใหญ่ใช้ prerequisite flag เพื่อบังคับว่า feature ใหม่ต้องรอ infrastructure flag (เช่น “new-api-ready”) เปิดก่อนเสมอ