@exodus/ feature-flags (英语)
用于监测/控制现有特性的模块和原子 remoteConfig,设备 geolocation等 (中文(简体) ). 另见 @ exodus/ feature- control。 。 。 .
使用量
我们建议您通过 @exodus/headless,如下实例所示:
- 配置时指定您的特性旗
@exodus/headless举个例子. - 控制/控制特性标记 :
- 在模块/原子/插件/地物中,使用
featureFlagAtoms依赖性. - 在UI中:
- 使用
selectors.featureFlags.create(featureFlagName)要读取当前旗帜值的选择器. - 使用
exodus.featureFlags.enable(featureFlagName)财务报告和审定财务报表exodus.featureFlags.disable(featureFlagName)如果您需要切换运行时的旗帜值.
- 使用
参见下面的例子代码.
背景情况
import createExodus from '@exodus/headless'
const featureFlags = {
// ... other feature flags,
dogeMode: {
localDefaults: {
// `true` if feature is shipped (available at runtime), `false` otherwise
available: true,
// controls whether the feature is enabled by default
// NOTE: if `available` is false, `enabled` can NOT be true, or you can expect an error
enabled: true,
},
remoteConfig: {
// path to flag in remote config schema
path: 'features.dogeMode',
supportedOverrides: {
// can be enabled/disabled for all users via remote config
enabled: true,
// can be enabled/disabled for users in certain geolocations via remote config
geolocation: true,
// can be enabled/disabled for users on certain app versions via remote config
shutdownSemver: true,
// can be rolled out to a share of users via remote config, see "Gradual rollout"
rollout: true,
},
},
},
}
const exodusContainer = createExodus({
port,
adapters,
config: {
// ...,
featureFlags,
},
})
const checkDogeModePlugin = {
id: 'checkDogeModePlugin',
factory: ({ featureFlagAtoms }) => {
const onStart = () => {
featureFlagAtoms.dogeMode?.get().then(({ isOn }) => {
console.log('>>> is dogeMode enabled?', isOn)
})
}
return {
onStart,
}
},
dependencies: ['featureFlagAtoms'],
}
exodusContainer.register({
definition: checkDogeModePlugin,
})
const exodus = exodusContainer.resolve()
// ... continue as usual
UI 边
import selectors from '~/ui/flux/selectors'
const dogeModeFeatureName = 'dogeMode'
const HomePage = () => {
const dogeMode = useSelector(selectors.featureFlags.create(dogeModeFeatureName))
useEffect(() => {
if (Math.random() < 0.001) {
exodus.featureFlags.enable(dogeModeFeatureName)
}
}, [dogeMode])
return dogeMode?.isOn ? <DogeMode /> : <NormalMode />
}
逐步推出
与 supportedOverrides.rollout设置 rollout 在远程配置中到整数 0 改为 100数字 :
{ "features": { "dogeMode": { "enabled": true, "rollout": 10 } } }
每个用户都从 0 改为 99数字 : sha256(featureName + ":" + telemetryId),前4个字节,模式100。 水桶还小的时候就挂了 rollout因此:
- 用户在增加时会在同一组中停留
rollout,并在所有种子相同的设备上. - 每面旗帜都有独立的群.
- 重新命名的旗帜给新的群体.
- 无效
rollout值会关闭旗帜. - 旗帜在钱包解锁之前保持本地默认值, 因为
telemetryId来自于种子.
推出需要 analyticsUserIdAtom 依赖(来自 @exodus/analytics) (中文(简体) ).
不使用示例 @exodus/headless
见 实例 文件夹
构成部分
远程图形FeatureFlagAtoms
一个原子收藏 { [featureName]: atom },每个原子都为该特性旗发出当前远程配置值:
{
isOn: Boolean,
unavailableStatus: ?String
}
特性标记原子
一个原子收藏 { [featureName]: atom },每个原子释放其特征旗帜的当前状态:
{
isOn: Boolean,
unavailableStatus: ?String
}
特性标记原子
以对象映射所有特征标记的当前状态的原子 :
{
[featureName]: {
isOn: Boolean,
unavailableStatus: ?String
}
}
特性标记
模块,基于 remoteConfig 财务报告和审定财务报表 geolocation它将值写入原子 featureFlagAtoms,但可能更容易观测到集合特征标记原子 featureFlagsAtom。 。 。 .