Default Values
default value กับ override rules
หัวข้อที่มีชื่อว่า “default value กับ override rules”ทุก Feature ใน GrowthBook มีการ resolve ค่าสองชั้น:
- Override rules — เงื่อนไข, percentage rollout หรือการกำหนด experiment ที่คุณตั้งค่าต่อ environment เมื่อ rule ตรงกับ context ของผู้ใช้ปัจจุบัน rule นั้นจะชนะ
- Default value — ค่าที่คืนกลับมาเมื่อ ไม่มี rule ตรงเงื่อนไข นี่คือพื้นที่ปลอดภัยของคุณ
เมื่อ GrowthBook เข้าถึงไม่ได้เลย (network error, CDN ล่ม) SDK จะตกลงไปใช้ argument สำหรับ fallback ที่คุณส่งโดยตรงในโค้ดของคุณ — ไม่เคยคืน null หรือ throw
fallback สามชั้น
หัวข้อที่มีชื่อว่า “fallback สามชั้น”flowchart TD
call["SDK call"] --> loaded{"GrowthBook loaded?"}
loaded -- "YES" --> rules["Evaluate rules"]
loaded -- "NO" --> fb["Return the fallback argument from your code"]
rules --> match{"Match found?"}
match -- "Yes" --> rv["Return rule value"]
match -- "No match" --> dv["Return Feature default value"] ส่ง fallback ที่สมเหตุสมผลเสมอ
หัวข้อที่มีชื่อว่า “ส่ง fallback ที่สมเหตุสมผลเสมอ”// BAD — if GrowthBook is unreachable, getFeatureValue returns undefinedconst text = gb.getFeatureValue('banner-text');
// GOOD — safe fallback keeps the app workingconst text = gb.getFeatureValue('banner-text', 'Welcome');argument สำหรับ fallback คือแนวป้องกันด่านสุดท้าย ควรแทนประสบการณ์ที่คุณต้องการให้ผู้ใช้ได้รับหาก GrowthBook ล่ม — โดยปกติคือพฤติกรรมปัจจุบันที่เสถียร
ตั้งค่า default value ใน GrowthBook
หัวข้อที่มีชื่อว่า “ตั้งค่า default value ใน GrowthBook”- เปิด Feature ใน GrowthBook UI
- คลิก Edit ข้าง ๆ ฟิลด์ Default Value
- ใส่ค่า เช่น
Welcomeสำหรับ flag แบบ string - คลิก Save
default value จะมีผลทันทีสำหรับทุก environment ที่ไม่มี override rule ใดให้ผลลัพธ์ที่ตรงเงื่อนไข
เปลี่ยน default value
หัวข้อที่มีชื่อว่า “เปลี่ยน default value”ในการอัปเดต default value โดยไม่เพิ่ม rule:
- เปิด Feature
- คลิก Edit บน Default Value
- เปลี่ยนค่าแล้วคลิก Save
การเปลี่ยนแปลงจะถูกนำไปใช้ทั่วทุก environment ที่ไม่มี rule แบบ override โดยไม่ต้อง deploy
ตัวอย่างใช้งานจริง — banner text
หัวข้อที่มีชื่อว่า “ตัวอย่างใช้งานจริง — banner text”import { GrowthBook } from '@growthbook/growthbook';
const gb = new GrowthBook({ apiHost: 'https://cdn.growthbook.io', clientKey: process.env.GROWTHBOOK_CLIENT_KEY, attributes: { id: 'user-123', country: 'TH', },});
await gb.init({ timeout: 2000 });
// Returns the GrowthBook default value when no rule matches,// or 'Welcome' when GrowthBook cannot be reached.const bannerText = gb.getFeatureValue('banner-text', 'Welcome');
document.getElementById('banner').textContent = bannerText;import { GrowthBook } from '@growthbook/growthbook';
const gb = new GrowthBook({
apiHost: 'https://cdn.growthbook.io',
clientKey: process.env.GROWTHBOOK_CLIENT_KEY,
attributes: {
id: 'user-123',
country: 'TH',
},
});
await gb.init({ timeout: 2000 });
// Safe fallback: 'Welcome' is used only if GrowthBook
// cannot be reached at all.
const bannerText = gb.getFeatureValue('banner-text', 'Welcome');
document.getElementById('banner').textContent = bannerText;ข้อแลกเปลี่ยน
หัวข้อที่มีชื่อว่า “ข้อแลกเปลี่ยน”| ตัวเลือก | Benefit | Cost |
|---|---|---|
| Default value แบบปลอดภัย (safe fallback) | แอปไม่พังแม้ SDK ล้มเหลว | feature อาจดูด้อยกว่าที่ตั้งใจตอน fallback |
| Default ตาม experience ใหม่ | ตรงกับที่ตั้งใจมากกว่า | เสี่ยงถ้า SDK ล้มเหลวและต้องพึ่ง default นี้ |
ข้อผิดพลาดที่พบบ่อย
หัวข้อที่มีชื่อว่า “ข้อผิดพลาดที่พบบ่อย”- ตั้ง default value เป็น “เปิด” ฟีเจอร์ที่เสี่ยงไว้ (ควรเป็น safe fallback เสมอ)
- ไม่ทดสอบว่าแอปทำงานถูกต้องเมื่อ SDK connect ไม่ได้และต้องพึ่ง default
- ลืมว่า default value ต่างจาก “ค่าที่ set ไว้ใน UI”
💡 ตัวอย่างจากของจริง
Facebook ออกแบบระบบ feature flag ให้ default เป็น “safe” เสมอเมื่อ config service ล่ม เพื่อไม่ให้แอป crash ทั้งระบบ