React Compiler (стабільна версія 1.0) - інструмент етапу збирання, що автоматично додає мемоізацію в компоненти й хуки. Він аналізує код і кешує JSX, обчислення й функції так, щоб при повторному рендері перераховувалось лише те, що залежить від змінених даних.
До компілятора:
const Products = memo(function Products({ items, onSelect }) {
const sorted = useMemo(() => [...items].sort(byPrice), [items]);
const handleClick = useCallback((item) => onSelect(item.id), [onSelect]);
return sorted.map((item) => <Item key={item.id} onClick={() => handleClick(item)} />);
});
З компілятором - той самий код без memo, useMemo, useCallback. Компілятор мемоізує навіть те, що вручну зробити складно: стрілкову функцію () => handleClick(item) у циклі, яка з ручним useCallback все одно створювалась би щоразу й ламала б memo дочірнього компонента.
На чому фокусується:
- пропуск каскадних рендерів: якщо props дочірнього компонента не змінилися, він не рендериться;
- пропуск дорогих обчислень у компонентах і хуках.
Компілятор не мемоізує звичайні функції поза компонентами й хуками і не кешує результати між різними екземплярами компонента.
Правила React, на які він покладається:
- рендер чистий: компонент для тих самих props і стану повертає той самий результат, без побічних ефектів;
- props і стан незмінні: не мутувати отримані об'єкти й масиви;
- значення з хуків незмінні,
ref.currentне читається під час рендеру; - правила хуків (без умовних викликів).
Код, що порушує правила, компілятор пропускає (залишає без оптимізації), а не ламає. Порушення показує eslint-plugin-react-hooks.
Підключення: Babel-плагін babel-plugin-react-compiler (у Vite - через reactCompilerPreset плагіна React), підтримка в Next.js, Expo. Працює з React 17+ (для 17-18 - пакет react-compiler-runtime).
Що змінюється для розробника:
- нові компоненти пишуться без ручної мемоізації;
- існуючі
useMemo/useCallbackможна лишити - компілятор їх враховує; прибирати варто обережно, бо деякі з них впливають на залежності ефектів; - структурні оптимізації (віртуалізація, розділення коду, опускання стану) компілятор не замінює.