Правила и переопределения
Контекстные правила
Правила — это функции, вычисляемые реактивно. Приоритет: ниже URL-переопределений и setFlag, выше loader/статики.
app.use(FeatureToggles, {
rules: {
darkMode: () => window.matchMedia('(prefers-color-scheme: dark)').matches,
liveChatWidget: () => {
const h = new Date().getHours()
return h >= 9 && h < 18
},
devFeatures: () => document.cookie.includes('internal=1'),
},
})Правила можно переопределить через setFlag() или URL-параметр.
URL-переопределения
Когда urlOverrides: true, query-параметры переопределяют значения флагов без перезагрузки страницы.
https://app.example.com/?feature:newDashboard=true&feature:checkoutFlow=v2Переопределение переменных:
?feature-var:newCheckout:maxItems=10Пользовательский префикс (urlPrefix: 'ft'):
?ft:newDashboard=trueПриоритет
От высшего к низшему:
URL-переопределение → runtime setFlag() → правила → loader → статические флаги → defaultValueЕсли у флага настроено schedule, неактивное окно принудительно делает его false после разрешения цепочки выше — но только если для этого флага сейчас не задано ни URL-, ни runtime-переопределение. Активное URL- или runtime-переопределение всегда побеждает неактивное расписание.
Персистентные переопределения
По умолчанию setFlag/setVariant живут только в памяти. Передайте { persist: true }, чтобы сохранить в localStorage — это работает одинаково и для булевых, и для вариантных флагов:
const { setFlag, setVariant, clearPersistedFlags, isPersisted } = useFeatureProvider()
setFlag('darkMode', true, { persist: true })
// Значение переживает перезагрузки страницы
setVariant('checkoutFlow', 'v2', { persist: true })
// Вариантные переопределения сохраняются точно так же
isPersisted('darkMode') // → true
clearPersistedFlags() // удалить все персистентные переопределения (и булевы, и вариантные)Профили переопределений
Именованные наборы переопределений, хранимые в localStorage — полезны для QA, демонстраций и дизайн-ревью.
const { saveProfile, loadProfile, listProfiles } = useFeatureProvider()
saveProfile('demo-mode', {
newDashboard: true,
betaSearch: true,
maintenanceMode: false,
})
loadProfile('demo-mode') // применяет все флаги профиля как runtime-переопределения
loadProfile('default') // сброс к исходным значениям (вызывает resetAll)
listProfiles() // → ['demo-mode']Панель <FeatureDevTools> показывает выпадающий список профилей, когда они существуют.