Drapeaux de fonctionnalités React
Fichiers de drapeaux
| Fichier | Objectif |
|---|---|
packages/shared/ReactFeatureFlags.js |
Drapeaux par défaut (canary), surcharges __EXPERIMENTAL__ |
packages/shared/forks/ReactFeatureFlags.www.js |
Canal www, surcharges __VARIANT__ |
packages/shared/forks/ReactFeatureFlags.native-fb.js |
React Native, surcharges __VARIANT__ |
packages/shared/forks/ReactFeatureFlags.test-renderer.js |
Moteur de test |
Tests avec contrôle d'accès
Pragma @gate (au niveau du test)
À utiliser quand la fonctionnalité est complètement indisponible sans le drapeau :
// @gate enableViewTransition
it('supports view transitions', () => {
// Ce test s'exécute uniquement quand enableViewTransition est true
// et est IGNORÉ (non échoué) quand false
});
gate() en ligne (au niveau de l'assertion)
À utiliser quand la fonctionnalité existe mais le comportement diffère selon le drapeau :
it('renders component', async () => {
await act(() => root.render(<App />));
if (gate(flags => flags.enableNewBehavior)) {
expect(container.textContent).toBe('new output');
} else {
expect(container.textContent).toBe('legacy output');
}
});
Ajouter un nouveau drapeau
- Ajouter à
ReactFeatureFlags.jsavec une valeur par défaut - Ajouter à chaque fichier fork (
*.www.js,*.native-fb.js, etc.) - S'il doit varier entre www et RN, définir à
__VARIANT__dans le fichier fork - Contrôler les tests avec
@gate nomDrapeauou inlinegate()
Vérifier les états des drapeaux
Utiliser /flags pour consulter les états sur tous les canaux. Consulter la skill flags pour les options de commande complètes.
Drapeaux __VARIANT__ (GKs)
Les drapeaux définis à __VARIANT__ simulent des gardiens d'accès - testés deux fois (true et false) :
/test www <pattern> # __VARIANT__ = true
/test www variant false <pattern> # __VARIANT__ = false
Déboguer les défaillances spécifiques à un canal
- Exécuter
/flags --diff <canal1> <canal2>pour comparer les valeurs - Vérifier les conditions
@gate- le test peut être contrôlé pour des canaux spécifiques - Exécuter
/test <canal> <pattern>pour isoler la défaillance - Vérifier que le drapeau existe dans tous les fichiers fork s'il vient d'être ajouté
Erreurs courantes
- Oublier les deux variantes - Toujours tester
wwwETwww variant falsepour les drapeaux__VARIANT__ - Utiliser @gate pour les différences de comportement - Utiliser
gate()en ligne si les deux chemins doivent s'exécuter - Fichiers fork manquants - Les nouveaux drapeaux doivent être ajoutés à TOUS les fichiers fork, pas seulement au principal
- Syntaxe gate incorrecte - C'est
gate(flags => flags.name), pasgate('name')