Увімкнути компілятор на великому існуючому проєкті одним кроком ризиковано: код, що порушує правила React, але «випадково працював», може поводитися інакше після мемоізації. Документація радить поступове впровадження.
Три способи обмежити область дії:
1. За каталогами - через overrides Babel:
// babel.config.js
module.exports = {
overrides: [
{ test: './src/features/checkout/**/*.{js,jsx,ts,tsx}', plugins: ['babel-plugin-react-compiler'] },
],
};
2. Режим анотацій - компілюються лише функції з директивою:
['babel-plugin-react-compiler', { compilationMode: 'annotation' }]
function ProductGrid({ products }) {
'use memo'; // лише цей компонент оптимізується
// ...
}
3. Runtime-гейтинг (gating) - компілятор генерує обидві версії, і вибір між ними робить прапорець функцій: можна порівняти метрики на частині користувачів.
Виключення компонента - "use no memo":
function LegacyDataGrid(props) {
'use no memo'; // TODO: прибрати після виправлення мутації props у сортуванні (JIRA-123)
// ...
}
Директиви - тимчасові аварійні виходи: документація радить пояснювати причину коментарем і планувати їх видалення.
Режими компіляції: infer (за замовчуванням - компілятор сам визначає компоненти й хуки за іменуванням), annotation, all; директиви перевизначають рішення режиму.
Типові причини проблем після ввімкнення:
- мутація props чи стану - раніше рендер «підхоплював» зміну, тепер мемоізований результат лишається старим;
- читання
ref.currentпід час рендеру; - бібліотеки з власним механізмом відстеження змін (інкрементальні сховища, деякі бібліотеки форм і таблиць) - правило
incompatible-libraryпопереджає про відомі випадки; - ефекти, що залежали від нестабільних залежностей і раніше спрацьовували частіше.
Порядок дій:
- увімкнути правила компілятора в
eslint-plugin-react-hooksі виправити порушення; - ввімкнути компілятор на частині коду з хорошими тестами;
- перевірити в DevTools, які компоненти оптимізовано (мітка «Memo ✨»);
- порівняти метрики (INP, час рендеру), розширювати область.
Існуючі useMemo/useCallback не обов'язково прибирати одразу - компілятор їх враховує, а правило preserve-manual-memoization попередить, якщо не зможе зберегти ручну мемоізацію.