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() 会读取环境变量。true、1、yes、on 会被识别为开启;其他非空值会被识别为关闭;变量不存在或为空时使用默认值。
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-flagsproducts/01mvp/packages/api/src/lib/feature-flags/index.tsproducts/01mvp/packages/api/src/server/feature-flags.ts- 配置指南
这篇文档有问题?