Engineering / react-compiler
Write and review React code as if the React Compiler is enabled.
Install
Signed, graded provenance for this skill. Integrity, authorship, capability, and freshness as evidence you weigh, not a verified badge.
The compiler memoizes. You do not.
In any React 19+ codebase with the compiler enabled, do not add useMemo, useCallback, or React.memo by default. The compiler handles memoization at finer granularity than a human writes, and adding manual versions is at best noise. This is the most common failure mode in LLM-generated React: the bulk of any agent's React training corpus is pre-compiler, so the default output skews toward manual memoization.
Write components plainly:
tsxfunction DashboardRow({ entity, onSelect }) {const label = formatLabel(entity);const total = entity.items.reduce((sum, i) => sum + i.value, 0);return (<Row onClick={() => onSelect(entity.id)}><Label>{label}</Label><Total>{total}</Total></Row>);}
Not:
tsxconst DashboardRow = memo(({ entity, onSelect }) => {const formatted = useMemo(() => ({ /* ... */ }), [entity]);const handleClick = useCallback(() => onSelect(entity.id), [entity.id, onSelect]);return /* ... */;});
The compiler produces the equivalent of the first from any input that follows the Rules of React. Adding the second by hand is noise and can interfere with the compiler's analysis.
Keep manual useMemo or useCallback only in these cases:
addEventListener, an IntersectionObserver, third-party libraries with their own === checks, anything outside React that retains the reference.Anything outside these three cases gets deleted.
next.config (experimental.reactCompiler), vite.config or babel.config (babel-plugin-react-compiler), or framework defaults for Expo and TanStack Start. If not enabled, propose enabling first. Do not strip memoization on a compiler-off codebase.eslint-plugin-react-hooks is at v6+. The compiler rules merged in from the deprecated eslint-plugin-react-compiler in late 2025.error. recommended ships most at warn, which means CI does not fail on silent compiler skips. See lint-setup.md for the strict configuration.useMemo, useCallback, React.memo that do not match one of the three exceptions."use no memo" directives. Each is a performance cliff with a TODO behind it. Grep the count over time as a health metric.Five patterns drop the surrounding function out of compilation. The lint rules above catch them when configured strictly. Full list, code examples, and fixes in exceptions.md.
file: <path>findings:- removed: <useMemo | useCallback | memo> @ <line>, compiler handles- kept: <useMemo | useCallback> @ <line>, reason: <ref-identity | expensive | effect-dep>silent bails detected:- <pattern> @ <line>: <one-line fix>
Based on The React Compiler at Eighteen Months. Sibling detail in exceptions.md and lint-setup.md.