Type-safe feature flags for Nuxt 3 with runtime evaluation and built-in A/B testing.
- Runtime flag resolution on server requests.
- Async config support (
defineFeatureFlags(async () => ...)). - Built-in variant assignment for experiments.
- Nuxt auto-imports for client and server helpers.
- Validation and test tooling for safer rollouts.
npx nuxi module add nuxt-feature-flags// nuxt.config.ts
export default defineNuxtConfig({
modules: ['nuxt-feature-flags'],
featureFlags: {
config: './feature-flags.config.ts',
},
})// feature-flags.config.ts
import { defineFeatureFlags } from '#feature-flags/handler'
export default defineFeatureFlags(async () => {
const remoteFlags = await $fetch('https://api.example.com/flags')
return {
newDashboard: true,
checkoutExperiment: {
enabled: true,
value: 'control',
variants: [
{ name: 'control', weight: 50, value: 'control' },
{ name: 'treatment', weight: 50, value: 'treatment' },
],
},
...remoteFlags,
}
})<script setup lang="ts">
const { flags, isEnabled } = useFeatureFlags()
const { flags: asyncFlags, pending, error } = useAsyncFeatureFlags()
</script>
<template>
<NewDashboard v-if="isEnabled('newDashboard')" />
<div v-if="pending">Loading flags...</div>
<div v-else-if="error">Could not refresh flags</div>
<CheckoutV2 v-else-if="asyncFlags.checkoutExperiment?.enabled" />
</template>// server/api/data.ts
import { getFeatureFlags } from '#feature-flags/server/utils'
export default defineEventHandler(async (event) => {
const { isEnabled, getVariant } = await getFeatureFlags(event)
if (!isEnabled('newDashboard')) {
throw createError({ statusCode: 404, statusMessage: 'Feature disabled' })
}
return {
variant: getVariant('checkoutExperiment'),
}
})-
useFeatureFlags()flagsisEnabled(flag)getValue(flag)getVariant(flag)
-
useAsyncFeatureFlags()flagspendingerrorrefresh()
await getFeatureFlags(event)flagsisEnabled(flag)getValue(flag)getVariant(flag)
<template>
<div v-feature="'myFlag'">Only when enabled</div>
</template>- Server resolution is async:
await getFeatureFlags(event). - Async config functions are supported.
useAsyncFeatureFlagsis available for client refresh states.useFeatureFlagsreads already-resolved flags from Nuxt app context.
Current branch status:
npm run lintpasses.npm run testpasses (208tests).npx nuxt-module-build buildpasses (non-blocking builder warnings may appear).
MIT License (c) 2024
