Перейти к содержанию

gating

Параметр gating включает условную компиляцию и позволяет управлять тем, когда оптимизированный код используется во время выполнения.

1
2
3
4
5
6
{
  gating: {
    source: 'my-feature-flags',
    importSpecifierName: 'shouldUseCompiler'
  }
}

Описание

gating

Настраивает включение скомпилированных функций через функциональный флаг во время выполнения.

Тип

1
2
3
4
{
  source: string;
  importSpecifierName: string;
} | null

Значение по умолчанию

null

Свойства

  • source: путь к модулю, из которого импортируется функциональный флаг
  • importSpecifierName: имя экспортируемой функции, которую нужно импортировать

Предупреждения

  • Функция gating должна возвращать логическое значение
  • И скомпилированная, и исходная версии увеличивают размер бандла
  • Импорт добавляется в каждый файл со скомпилированными функциями

Использование

Базовая настройка функционального флага

  1. Создайте модуль функционального флага:
1
2
3
4
5
// src/utils/feature-flags.js
export function shouldUseCompiler() {
  // your logic here
  return getFeatureFlag('react-compiler-enabled');
}
  1. Настройте компилятор:
1
2
3
4
5
6
{
  gating: {
    source: './src/utils/feature-flags',
    importSpecifierName: 'shouldUseCompiler'
  }
}
  1. Компилятор генерирует код с условием:
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
// Input
function Button(props) {
  return <button>{props.label}</button>;
}

// Output (simplified)
import { shouldUseCompiler } from './src/utils/feature-flags';

const Button = shouldUseCompiler()
  ? function Button_optimized(props) { /* compiled version */ }
  : function Button_original(props) { /* original version */ };

Функция gating вычисляется один раз при загрузке модуля, поэтому после разбора и выполнения бандла JavaScript выбор компонента остаётся неизменным до конца сессии браузера.

Устранение неполадок

Функциональный флаг не работает

Убедитесь, что модуль флага экспортирует нужную функцию:

1
2
3
4
5
6
7
8
9
// ❌ Wrong: Default export
export default function shouldUseCompiler() {
  return true;
}

// ✅ Correct: Named export matching importSpecifierName
export function shouldUseCompiler() {
  return true;
}

Ошибки импорта

Убедитесь, что путь source указан верно:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
// ❌ Wrong: Relative to babel.config.js
{
  source: './src/flags',
  importSpecifierName: 'flag'
}

// ✅ Correct: Module resolution path
{
  source: '@myapp/feature-flags',
  importSpecifierName: 'flag'
}

// ✅ Also correct: Absolute path from project root
{
  source: './src/utils/flags',
  importSpecifierName: 'flag'
}

Источник — https://react.dev/reference/react-compiler/gating

Комментарии