Skip to content

Справочник ​

Типы TypeScript ​

Все публичные типы экспортируются из корня пакета:

ts
import type {
  FeatureTogglesOptions,
  FeatureProvider,
  FlagSource,
  FlagValue,
  FlagDefinition,
  FlagName,
  FlagMeta,
  FlagSchedule,
  SetFlagOptions,
  WatchFlagOptions,
  LiveUpdatesOptions,
  FeatureFlagNames,
} from 'vue-feature-toggles'
ts
// FlagValue — boolean ИЛИ строка варианта
type FlagValue = boolean | string

// Значение опции flags — это либо обычное значение, либо определение процентного раската
type FlagDefinition = FlagValue | { value: FlagValue; rollout: number }

// Все уровни источника флага
type FlagSource =
  'url' | 'runtime' | 'rules' | 'loader' | 'live' | 'static' | 'schedule' | 'default'

interface FlagMeta {
  description?: string
  owner?: string
  addedAt?: string // строка ISO-даты, напр. '2025-03-01'
  ticket?: string
}

interface FlagSchedule {
  from?: string // ISO-дата — флаг принудительно выключен до этой даты
  to?: string // ISO-дата — флаг принудительно выключен после этой даты
}

interface SetFlagOptions {
  persist?: boolean // сохранить в localStorage — работает и для setFlag(), и для setVariant()
}

interface WatchFlagOptions {
  debounce?: number // мс — дебаунс коллбэка
  immediate?: boolean // вызвать коллбэк один раз сразу с текущим значением
}

interface LiveUpdatesOptions {
  type: 'sse' | 'websocket'
  url: string
  reconnectDelay?: number // мс, по умолчанию: 3000
}

// FlagName разрешается в union объявленных вами имён флагов при дополнении FeatureFlagNames,
// либо откатывается к string, когда он пуст.
type FlagName = keyof FeatureFlagNames extends never ? string : keyof FeatureFlagNames

Типобезопасность ​

Расширьте встроенный интерфейс FeatureFlagNames, чтобы получить автодополнение и ошибки компиляции по именам флагов везде — useFeature, setFlag, isEnabled, <Feature name="..."> и т. д.

ts
// feature-flags.d.ts (или любой .d.ts файл в вашем проекте)
declare module 'vue-feature-toggles' {
  interface FeatureFlagNames {
    newDashboard: true
    betaSearch: true
    darkMode: true
  }
}
ts
useFeature('newDashbord') // Ошибка TS: аргумент типа '"newDashbord"' не может быть присвоен
useFeature('newDashboard') // ✔

Экспорты ​

ts
// Основная точка входа — vue-feature-toggles
import {
  FeatureToggles, // плагин для app.use()
  Feature, // компонент <Feature>
  FeatureVariant, // компонент <FeatureVariant>
  FeatureDevTools, // оверлей DevTools
  vFeature, // директива v-feature
  useFeature, // composable
  useFeatureVariant, // composable для вариантных флагов
  useFeatureProvider, // низкоуровневый composable
  FEATURE_PROVIDER_KEY, // ключ инъекции, для собственных сценариев provide()/inject()
  serializeFlags, // хелпер для SSR
} from 'vue-feature-toggles'

import type {
  FeatureTogglesOptions,
  FeatureProvider,
  FlagSource,
  FlagValue,
  FlagDefinition,
  FlagName,
  FlagMeta,
  FlagSchedule,
  SetFlagOptions,
  WatchFlagOptions,
  LiveUpdatesOptions,
  FeatureFlagNames,
} from 'vue-feature-toggles'

// Утилиты для тестирования (исключены из продакшен-бандла)
import {
  createTestFeatureProvider,
  withFeatures,
  setTestFlag,
  resetTestProvider,
} from 'vue-feature-toggles/testing'

// Декоратор Storybook (исключён из продакшен-бандла)
import { withFeatureToggles } from 'vue-feature-toggles/storybook'

// Адаптеры-загрузчики (LaunchDarkly, Unleash, Flagsmith)
import { launchDarklyLoader, unleashLoader, flagsmithLoader } from 'vue-feature-toggles/adapters'

// Плагин Vite — удаляет <FeatureDevTools> в продакшен-сборках
import { featureTogglesPlugin } from 'vue-feature-toggles/vite'

// Модуль Nuxt
// modules: ['vue-feature-toggles/nuxt']

Архитектура ​

vue-feature-toggles/
├── src/
│   ├── core/
│   │   ├── FeatureProvider.ts   # createFeatureProvider() — весь провайдер как одна функция-
│   │   │                        #   фабрика: сливает цепочку приоритетов (url → runtime → rules
│   │   │                        #   → loader → static → schedule → default), затем применяет
│   │   │                        #   принудительное отключение по зависимостям; отдаёт каждый
│   │   │                        #   метод FeatureProvider
│   │   ├── rollout.ts           # hashToFloat() (FNV-1a), resolveFlagDef() — процентный раскат
│   │   ├── persistence.ts       # чтение/запись localStorage для runtime-переопределений + профилей
│   │   ├── live-updates.ts      # setupLiveUpdates() — SSE / WebSocket, автопереподключение,
│   │   │                        #   помечает полученные флаги источником 'live'
│   │   ├── helpers.ts           # isFlagTruthy, parseUrlValue, parseVarValue
│   │   └── types.ts             # FeatureTogglesOptions, FeatureProvider и все публичные типы
│   ├── components/
│   │   ├── feature.vue          # <Feature>
│   │   ├── feature-variant.vue  # <FeatureVariant>
│   │   └── feature-dev-tools.vue# <FeatureDevTools> — собран из внутренних src/ui/*.vue частей
│   ├── directives/
│   │   └── vFeature.ts          # v-feature
│   ├── composables/
│   │   ├── useFeature.ts        # useFeature, useFeatureVariant
│   │   └── useFeatureProvider.ts# useFeatureProvider
│   ├── ui/                      # собственные подкомпоненты FeatureDevTools — внутренние, не экспортируются
│   ├── plugin.ts                # FeatureToggles — точка входа app.use()
│   ├── devtools.ts              # setupVueDevtools() — подключение расширения Vue DevTools,
│   │                            #   вызывается автоматически из plugin.ts в dev-режиме, не экспортируется
│   ├── ssr.ts                   # serializeFlags()
│   ├── testing.ts               # точка входа /testing
│   ├── storybook.ts             # точка входа /storybook
│   ├── adapters.ts              # точка входа /adapters
│   ├── vite.ts                  # точка входа /vite
│   └── index.ts                 # корневая точка входа
├── nuxt/
│   ├── module.ts                # модуль Nuxt 3 (defineNuxtModule)
│   └── runtime/
│       └── plugin.ts            # runtime-плагин Nuxt — глобальная регистрация + обработка SSR-состояния
└── bin/
    └── cli.js                   # подкоманды list / check / stale

FeatureProvider.ts — это одна плоская функция-фабрика, а не набор классов-менеджеров: разрешение флага — это один computed(), который наслаивает URL-переопределения, runtime-переопределения, правила, результат loader, статические флаги и проверку расписания друг на друга в порядке приоритета, а затем применяет принудительное отключение по зависимостям. См. порядок приоритета для точной цепочки.

Размер бандла и peer-зависимости ​

Точка входаPeer-зависимостиПримечания
vue-feature-togglesvue ^3.0 (обязательна)Ядро — плагин, компоненты, директива, composables
vue-feature-toggles/testingvue ^3.0Только тестовые хелперы; исключено из продакшен-бандла
vue-feature-toggles/storybookvue ^3.0Только декоратор Storybook; исключено из продакшена
vue-feature-toggles/adaptersvue ^3.0Загрузчики LaunchDarkly, Unleash, Flagsmith
vue-feature-toggles/viteне объявлена — нужен тот vite, что уже используется в проектеТрансформирующий плагин Vite
vue-feature-toggles/nuxtvue ^3.0, @nuxt/kit ≥3.0 (опциональный peer)Модуль Nuxt 3

Пакет поставляется как tree-shakeable ESM (dist/*.js) и CommonJS (dist/*.cjs), с полными объявлениями типов для каждой точки входа. @vue/devtools-api ≥7.0 (опциональный peer) загружается динамически для интеграции с DevTools и тихо пропускается, когда пакет отсутствует или Vue DevTools закрыты.

Лицензия ​

MIT