00 / 00

功能开关

用轻量 feature flags 控制灰度、实验和临时功能

功能开关不是必需模块。如果产品还没有灰度发布、Beta 用户、临时维护模式或付费能力差异,直接用普通配置更简单。需要这些能力时,再用它做服务端判断。

这是什么

功能开关(Feature Flags)用于在不改数据库结构、不重新设计权限模型的情况下,临时控制某个功能是否可用。它适合做:

  • 灰度发布:先对少量用户开放新功能
  • Beta 功能:只给内测用户或管理员使用
  • 维护开关:通过环境变量临时关闭高风险入口
  • 付费差异:在已有订阅判断外,控制某个实验能力

当前模板没有保留独立的 @01mvp/feature-flags workspace 包,而是把原站的轻量 evaluator 放在 products/01mvp/packages/api/src/lib/feature-flags。这样功能开关默认属于服务端 API 基建,适合在 Hono 中间件、oRPC handler、后台任务里使用。

怎么用

import { createFlags, envFlag } from "@01mvp/api/server/feature-flags";

const flags = createFlags({
  maintenance: envFlag("MAINTENANCE_MODE"),
  betaDashboard: {
    defaultValue: false,
    description: "Beta dashboard access",
    resolve: ({ userId }) => userId === "demo-user",
  },
});

const enabled = await flags.isEnabled("betaDashboard", {
  userId: session.user.id,
});

envFlag() 会读取环境变量。true1yeson 会被识别为开启;其他非空值会被识别为关闭;变量不存在或为空时使用默认值。

const flags = createFlags({
  openApiDocs: envFlag("ENABLE_OPENAPI_DOCS", false),
});

如果运行时环境变量来自 Hono context 或 Cloudflare bindings,可以显式传入 env source:

const flags = createFlags({
  betaFeature: envFlag("ENABLE_BETA_FEATURE", false, {
    env: context.env,
  }),
});

在 oRPC 中使用

把 feature flag 放在 handler 附近,而不是散落在组件里。前端只接收最终结果。

import { ORPCError } from "@orpc/server";

import { createFlags, envFlag } from "@01mvp/api/server/feature-flags";

const flags = createFlags({
  aiImages: envFlag("ENABLE_AI_IMAGES", true),
});

export const createImage = protectedProcedure.handler(async ({ context }) => {
  const enabled = await flags.isEnabled("aiImages", {
    userId: context.session.user.id,
  });

  if (!enabled) {
    throw new ORPCError("FORBIDDEN", {
      message: "该功能暂未开放",
    });
  }

  // 继续执行真实业务逻辑
});

什么时候不要用

  • 长期稳定的权限:应该放进权限、订阅或角色系统
  • 前端展示文案:直接用配置或组件状态即可
  • 复杂实验平台:需要分流、指标分析、实验报表时,接入专业服务会更合适

功能开关适合“小而明确”的服务端控制点。它不替代权限系统,也不应该成为长期业务规则的堆放处。

相关文件

  • products/01mvp/packages/api/src/lib/feature-flags
  • products/01mvp/packages/api/src/lib/feature-flags/index.ts
  • products/01mvp/packages/api/src/server/feature-flags.ts
  • 配置指南

这篇文档有问题?