feature-flags について
Reactリポジトリの機能フラグを扱うスキルです。フォークごとのフラグ定義、テストのゲート制御、チャネル別の状態確認を説明します。
主な機能
- 01既定およびフォークのフラグファイルを管理
- 02@gateでテストを制御
- 03gate()でフラグ別の動作を検証
- 04フラグ状態とチャネル間の差分を確認
- 05__VARIANT__の両方の状態をテスト
活用シーン
- 01Reactの機能にフラグを追加
- 02機能の無効時と動作差分をテスト
- 03チャネル固有のテスト失敗を調査
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ react/ react --skill feature-flagsインストール後、Claude Code で/feature-flagsを入力して読み込まれたか確認します。
詳細
React の機能フラグ
フラグファイル
| ファイル | 目的 |
|---|---|
packages/shared/ReactFeatureFlags.js | デフォルトのフラグ(canary)、__EXPERIMENTAL__ による上書き |
packages/shared/forks/ReactFeatureFlags.www.js | www チャネル、__VARIANT__ による上書き |
packages/shared/forks/ReactFeatureFlags.native-fb.js | React Native、__VARIANT__ による上書き |
packages/shared/forks/ReactFeatureFlags.test-renderer.js | テストレンダラー |
テストのゲーティング
@gate プラグマ(テストレベル)
フラグがないと機能を完全に利用できない場合に使用します。
// @gate enableViewTransition
it('supports view transitions', () => {
// This test only runs when enableViewTransition is true
// and is SKIPPED (not failed) when false
});
インラインの gate()(アサーションレベル)
機能は存在するものの、フラグによって動作が異なる場合に使用します。
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');
}
});
新しいフラグの追加
ReactFeatureFlags.jsにデフォルト値とともに追加します- 各フォークファイル(
*.www.js、*.native-fb.jsなど)に追加します - www/RN で変化させる場合は、フォークファイルで
__VARIANT__に設定します - テストを
@gate flagNameまたはインラインのgate()でゲーティングします
フラグの状態を確認する
/flags を使って、各チャネルの状態を確認します。コマンドの全オプションについては、flags スキルを参照してください。
__VARIANT__ フラグ(GK)
__VARIANT__ に設定されたフラグはゲートキーパーをシミュレートし、true と false の両方でテストされます。
/test www <pattern> # __VARIANT__ = true
/test www variant false <pattern> # __VARIANT__ = false
チャネル固有の失敗をデバッグする
/flags --diff <channel1> <channel2>を実行して値を比較します@gateの条件を確認します。テストが特定のチャネルにゲーティングされている可能性があります/test <channel> <pattern>を実行して失敗を切り分けます- 新しく追加したフラグがすべてのフォークファイルにあることを確認します
よくある間違い
- 両方のバリアントを試し忘れる -
__VARIANT__フラグでは、必ずwwwとwww variant falseの両方をテストします - 動作の違いに
@gateを使う - 両方の経路を実行する場合は、インラインのgate()を使用します - フォークファイルへの追加漏れ - 新しいフラグはメインファイルだけでなく、すべてのフォークファイルに追加する必要があります
- ゲート構文の誤り -
gate('name')ではなく、gate(flags => flags.name)です
コメント
Markdown 対応