Библиотека для работы с фича-флагами на клиенте (веб)
Фича-флаг это самый простоый выключатель/вкючатель фичи, с ее помощью можно выкатывать спокойно не готовые фичи (чего я бы не стал делать), они полезны тем, что если что-то пошло не так, можно быстро выключить фичу без необходимости хотфикса.
Необходимо обернуть приложение в FeatureProvider и передать конфиг в props.config
import { FeatureProvider } from 'feature-flags'
. . .
const flagConfig = {
url: 'https://example.com'
}
const features = ['showNews', 'showPopup', 'canDoSmth'] // Интересующий нас список фича-флагов
const App = () => {
return (
<FeatureProvider features={features} config={flagConfig}>
<Router history={history}>
<Pages />
</Router>
</Provider>
)
}
Далее в нужном слое (slice) приложения можем воспользоваться одним из вариантов получения данных о фичи:
. . .
import { useFeature } from 'feature-flags'
const AuthForm = () => {
. . .
const isTwoFactory = useFeature('two-factory')
. . .
return (
<s.AuthForm>
. . .
{isTwoFactory && <TwoFactory />}
</s.AuthForm>
)
}
Если необходимо динамически подгружать флаги, будь то при переходе на другую страницу или в прочих условиях, используйте метод get(request: TFeatureFlagsRequest)
из контекста FeatureFlags
:
import { FeatureFlags } from 'feature-flags'
. . .
const News = () => {
const isShowNews = useFeature('showNews')
const { get } = useContext(FeatureFlags)
useEffect(() => {
get({ keys: ['showNews'], lang: 'ru', userAgent: window.navigation.userAgent })
}, [get])
if (!isShowNews) {
return <EmptyPage />
}
. . .
}
С помощью метода .get()
можем подгружать фича-флаги в самых разных сценариях, например при смене локации.
Запрос фича-флагов при изменении конфига или одного из свойств FeatureProvider
.
Изменение следующих пропсов для FeatureProvider
вызывают повторный запрос фича-флагов:
config, keys, lang, userAgent
В данной примитивной реализации данные хранятся исключительно внутри контекста, кажется лучшим способо хранения я бы использовал .sessionStorage()
.