Плавная выкатка фич на фронтенде без бэкенда
Когда новая функциональность уже готова, но включать её сразу всем пользователям рискованно — можно запустить плавную выкладку. Например, сначала дать доступ 5% аудитории, потом 10%, затем 30% — и так до 100%. Так можно протестировать фичу, снизить риски и не зависеть от серверных фичефлагов или частых релизов.
Что мы хотим сделать
Построить на фронтенде простой механизм, который: – равномерно делит пользователей на 100 сегментов (по 1% каждый); – знает, с какой даты началась выкладка и каким темпом она идёт; – сам включает фичу нужной доле пользователей;
управляется одним флагом в коде:
if (PERMISSION_NEW_FEATURE) { showNewFeature(); }
Как работает этот флаг
✅ 1. Сегментация пользователей
Каждый аккаунт попадает в одну из 100 групп (0–99), каждая группа — это 1% аудитории. Для этого используется стабильный идентификатор, например accountName, email, organizationId или домен. Мы превращаем его в число, используя простую хэш-функцию.
Можно использовать популярные варианты: FNV-1a MurmurHash CRC32 DJB2
Или — для простоты — такой пример:
const hash = (str) => str.split('').reduce((acc, c) => acc + c.charCodeAt(0), 0);
const getSegment = (id) => hash(id) % 100; // результат от 0 до 99
Один и тот же аккаунт всегда будет в своём сегменте — никаких случайных значений и хранения в базе не требуется.
✅ 2. Определение текущего процента выкладки
Для каждой фичи задаются две вещи:
1) дата начала релиза;
2) шаг — сколько процентов пользователей подключаются каждый день.
Фронтенд сам считает, сколько времени прошло, и определяет, какой процент аудитории уже должен видеть новую функциональность.
const getRolloutPercent = (startDate, incrementPerDay) => { const start = new Date(startDate); const now = new Date(); const days = Math.floor((now - start) / 86400000); return Math.min(100, (days + 1) * incrementPerDay); };
Например: Дата старта — 10 октября, шаг — 5% в день. → День 1 — 5% пользователей → День 2 — 10% → День 10 — 50% → День 20 — 100%
✅ 3. Формирование итогового флага const PERMISSION_NEW_FEATURE = (() => { const segment = getSegment(currentUser.accountName); // 0..99 const percent = getRolloutPercent('2025-10-10T00:00:00', 5); return segment < percent; })();
Если сегмент пользователя попадает в текущий процент выкладки — фича включается через то самое условие if.
Почему это удобно
📅 Нет зависимости от бэкенда — всё работает на фронте.
⚙️ Не нужны дополнительные релизы — процент увеличивается сам по времени.
👥 Пользователи распределяются равномерно и стабильно.
🚀 Фича управляется одним флагом — код чистый и прозрачный.
🧩 Можно добавить ручное включение для QA через query (?ff-feature=on) или localStorage.
💬 Темп легко регулировать — меняется шаг или дата без деплоя.
Такой подход прост, прозрачен и не требует инфраструктуры. Достаточно одной функции и даты — чтобы запускать фичи постепенно, безопасно и без лишних зависимостей.
· 06.01
Вы придумали feature flags и А/Б тесты с сегментацией. Поздравляю!
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
коммент удалён
· 06.01
фишка не в этом, но спасибо за поздравление!
0
ответить
коммент скрыт — часть юзеров считает его токсичным или некорректным
ответ удалён