Přeskočit na obsah

React Compiler: můžu smazat všechna useMemo?

Kompilátor memoizuje za vás — chytřeji a jemněji než ruční useMemo. Kdy ruční memoizace dává smysl i dnes a jak kompilátor zapnout.

Autor
Jan Jarčík
Publikováno
Doba čtení
2 min čtení
Aktualizováno
SdíletXLinkedInBluesky

React Compiler je build-time nástroj, který analyzuje vaše komponenty a automaticky do nich vloží memoizaci. Výsledek odpovídá tomu, jako byste useMemo, useCallback a React.memo napsali všude, kde to dává smysl — jen jemněji, protože kompilátor umí memoizovat i jednotlivé JSX větve.

Zapnutí v Next.js

Shell
pnpm add -D babel-plugin-react-compiler
TypeScript
// next.config.ts
const nextConfig = {
  reactCompiler: true,
};
export default nextConfig;

Co se změní

TSX
// Dřív
const visible = useMemo(() => todos.filter((t) => !t.done), [todos]);
const onToggle = useCallback((id: string) => toggle(id), [toggle]);
 
// S kompilátorem
const visible = todos.filter((t) => !t.done);
const onToggle = (id: string) => toggle(id);

Obě varianty se chovají stejně — kompilátor sám pozná, na čem hodnota závisí.

Smím tedy smazat existující useMemo?

V nové kódové bázi je pište jen výjimečně. U existujícího kódu nespěchejte: kompilátor ruční memoizaci respektuje, a když ji odstraníte, může se změnit výstup memoizace — což vadí hlavně tam, kde je hodnota závislostí useEffect.

Ruční memoizace má smysl i dál jako escape hatch:

  • když potřebujete přesně kontrolovat, kdy se efekt spustí (stabilní reference v závislostech),
  • když předáváte hodnotu do knihovny, která porovnává reference, a chcete to mít explicitně.

Pravidla Reactu nejsou volitelná

Kompilátor předpokládá, že kód dodržuje Rules of React: čisté renderování, žádné mutace props a stavu, hooky jen na nejvyšší úrovni. Komponenty, které pravidla porušují, kompilátor přeskočí. Zapněte si ESLint pravidla z eslint-plugin-react-hooks (preset recommended obsahuje i pravidla kompilátoru) — upozorní vás na ně dřív než bug v produkci.

Problémovou komponentu dočasně vyřadíte direktivou "use no memo".