Replies: 4 comments
-
Feature Flag 简介Feature Flag(也称为 Feature Toggle、Feature Switch、Feature Flipper 或 Feature Control)是一种软件开发实践,它允许开发团队动态地更改系统的某些功能,而无需修改代码。这种做法可以用于各种目的,例如渐进式发布、A/B 测试、灰度发布或处理运行时的功能开关。 Feature Flags 的工作原理是在软件代码中添加条件逻辑,该逻辑根据配置或数据库中的标志值决定是否启用某个功能。这种方式使得开发人员可以推出新功能而不立即对所有用户可见,也可以根据需要对特定用户群体或环境启用或禁用功能。 Feature Flags 的主要优点包括:
然而,Feature Flags 也有一些潜在的缺点:
为了有效地使用 Feature Flags,团队应该制定明确的策略和最佳实践来创建、部署、管理和退役这些标志。这通常涉及到使用专门的 Feature Flag 管理系统,这些系统提供了界面和工具来控制和监控 Feature Flags 的状态。 |
Beta Was this translation helpful? Give feedback.
-
|
Feature Flags 的控制,我的想法是:
|
Beta Was this translation helpful? Give feedback.
-
关键实现整理配置文件
export const FeatureFlagsSchema = z.object({
webrtc_sync: z.boolean().optional(),
language_model_settings: z.boolean().optional(),
openai_api_key: z.boolean().optional(),
openai_proxy_url: z.boolean().optional(),
create_session: z.boolean().optional(),
edit_agent: z.boolean().optional(),
dalle: z.boolean().optional(),
});
export type IFeatureFlags = z.infer<typeof FeatureFlagsSchema>;
// 开关默认值
export const DEFAULT_FEATURE_FLAGS: IFeatureFlags = {
// WebRTC 多端同步,计划在 1.0 中将此值改为 false
webrtc_sync: true,
language_model_settings: true,
openai_api_key: true,
openai_proxy_url: true,
create_session: true,
edit_agent: true,
dalle: true,
};
// 将变量字段转换为在应用中进行判断的语义化变量名
export const mapFeatureFlagsEnvToState = (config: IFeatureFlags) => {
return {
enableWebrtc: config.webrtc_sync,
isAgentEditable: config.edit_agent,
showCreateSession: config.create_session,
showLLM: config.language_model_settings,
showOpenAIApiKey: config.openai_api_key,
showOpenAIProxyUrl: config.openai_proxy_url,
showDalle: config.dalle,
};
};服务端环境变量在 export const getServerFeatureFlagsValue = () => {
const flags = parseFeatureFlag(env.FEATURE_FLAGS);
return merge(DEFAULT_FEATURE_FLAGS, flags);
};
export const serverFeatureFlags = () => {
const serverConfig = getServerFeatureFlagsValue();
return mapFeatureFlagsEnvToState(serverConfig);
};服务端环境变量传递到客户端在 思想类似于 React Context 的用法。 客户端取值判断:组件中使用 const HeaderAction = memo(() => {
const { isAgentEditable } = useFeatureFlagStore(featureFlagsSelectors);
return (
<>
<ShareButton />
{isAgentEditable && <SettingButton />}
</>
);
}); |
Beta Was this translation helpful? Give feedback.
-
|
第二次在中间件(EdgeConfig) 的Feature Flag 实现: |
Beta Was this translation helpful? Give feedback.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
-
背景
我们有很多针对界面自定义的需求,主要在于需要隐藏部分界面功能,以满足不同场景的诉求
设计思路
在 LobeChat 中会计划添加两层 feature Flag 控制,一层在环境变量,一层考虑在中间件。先准备做到环境变量里
环境变量方案
实现语法复用之前 MODEL_LIST 那种, +abc 是开启某个功能,-abc 是关闭某个功能。多个配置之间通过 , 分割。
比如
FEATURE_FLAGS=+webrtc_sync,-openai_api_key代表了开启 WebRTC 同步,隐藏 OpenAI API keyBeta Was this translation helpful? Give feedback.
All reactions