Плавная выкатка фич на фронтенде без бэкенда

Когда новая функциональность уже готова, но включать её сразу всем пользователям рискованно — можно запустить плавную выкладку. Например, сначала дать доступ 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.

💬 Темп легко регулировать — меняется шаг или дата без деплоя.

Такой подход прост, прозрачен и не требует инфраструктуры. Достаточно одной функции и даты — чтобы запускать фичи постепенно, безопасно и без лишних зависимостей.

Плавная выкатка фич на фронтенде без бэкенда | Сетка — социальная сеть от hh.ru