Лёгкий, независимый от backend плагин фича-флагов для Vue 3 — булевы и мультивариантные флаги, контекстные правила, живые обновления и оверлей DevTools.

Код новой функции готов раньше, чем готовы маркетинг, QA или сам продакт-менеджер её включать — фича-флаг разделяет момент деплоя и момент, когда функция реально становится видна пользователям.
Сначала функцию видит 5% пользователей, потом 25%, потом все — если что-то пошло не так, откатить проще, чем разгребать последствия после полного релиза.
Часть пользователей видит старую кнопку оформления заказа, часть — новую, и конверсия сравнивается по факту использования, а не по мнению команды, какой вариант лучше.
Один набор функций включён для проверки нового онбординга, другой — для регрессии старого поведения. Вместо того чтобы вручную щёлкать десяток переключателей, весь набор сохраняется и включается одной кнопкой.
Ночью что-то пошло не так с недавно выпущенной функцией, а разработчика с доступом к серверу нет на месте — флаг можно выключить удалённо, и это применится сразу, без пересборки и повторного деплоя.

Управляйте функциями через простые boolean-флаги или строковые варианты для A/B-тестов и поэтапных раскаток. Статические флаги, асинхронная загрузка с бекенда, периодический опрос и приоритетная цепочка (URL → runtime → правила → загрузчик → статика → defaultValue) дают полный контроль над логикой.

Реактивные правила на основе любых условий (время, куки, prefers-color-scheme) автоматически обновляют флаги. URL-параметры позволяют переопределять флаги без перезагрузки страницы, а persist-флаги сохраняются в localStorage. Всё это работает вместе, давая гибкость на всех уровнях.

Объединяйте флаги в группы для массового включения/отключения. Настраивайте зависимости, чтобы один флаг автоматически отключался, если другой выключен. Сохраняйте именованные наборы оверрайдов как профили для быстрого переключения между сценариями (демо, QA).

Используйте декларативный компонент <Feature> со слотами default/fallback/loading, директиву v-feature для v-show-стиля и композабл useFeature для реактивной логики. Многовариантные флаги поддерживаются через <FeatureVariant> и useFeatureVariant. Все инструменты типобезопасны.

Встроенная плавающая панель DevTools для инспекции и управления флагами, CLI для анализа флагов в коде (list/check/stale), адаптеры для LaunchDarkly, Unleash и Flagsmith. Nuxt-модуль с SSR-гидрацией, Storybook-декоратор и Vite-плагин для удаления DevTools в продакшене.

Задавайте флагу объект { value, rollout } — он включится только для указанного процента пользователей, стабильно определяемого хешем идентификатора, а не случайно. Планируйте активацию флагов на конкретные даты, а метаданные и срок действия помогут находить устаревшие флаги.
Правила — обычные реактивные функции: тёмная тема по системным настройкам, виджет чата по времени суток, доступ разработчику по куке. Их всё ещё можно переопределить URL-параметром или setFlag().
import { FeatureToggles } from 'vue-feature-toggles'
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'),
},
})
// Rules are reactive functions, re-evaluated whenever their inputs change —
// still overridable by a URL param or setFlag() at runtime.checkoutFlow хранит строковый вариант, а не булево значение — <FeatureVariant> сам рендерит нужный слот, а переключение через ?feature:checkoutFlow=v2 работает без перезагрузки.
<script setup lang="ts">
import { useFeatureVariant } from 'vue-feature-toggles'
const variant = useFeatureVariant('checkoutFlow') // Ref<string>
</script>
<template>
<FeatureVariant name="checkoutFlow">
<template #v1><CheckoutV1 /></template>
<template #v2><CheckoutV2 /></template>
<template #fallback><CheckoutLegacy /></template>
</FeatureVariant>
</template>
<!-- URL overrides work identically: ?feature:checkoutFlow=v2 --> Сервер пушит { betaSearch: true } через SSE или WebSocket, и все компоненты с этим флагом перерисовываются мгновенно — polling не нужен.
import { FeatureToggles } from 'vue-feature-toggles'
app.use(FeatureToggles, {
loader: async () => fetch('/api/flags').then((r) => r.json()),
liveUpdates: { type: 'sse', url: '/api/flags/stream' },
})
// The server pushes { "betaSearch": true }, and every component using that
// flag re-renders instantly — no polling, no page reload.