react-brain
Browse decisions
React & language foundations 3App architecture 9UI 12Platform & native 9Build, test, observe, secure 6AI in React apps 3stack composerdecision recordscensusstaleness bencharchitecturechangelogmethodologyroadmap

entriesreact-foundations · verified 2026-07-10 · react + react-native

React core — version, Compiler, RSC, concurrent features

reviewedconfidence: hightrack: weakenedthis tier holds 75% on the public scorecard (6/11 graded · 0 overturned) →

related decisions: build · security · meta-frameworks

re-verified 3× — 2026-07-13 · 2026-07-10 · 2026-07-06 · changelog

recommendation

Stay on React 19.2 and turn on React Compiler 1.0 for new code — let it handle memoization; keep existing useMemo/useCallback as escape hatches (don't strip them — removing can change the compiler's output), and pin the exact compiler version if test coverage is thin.

  • new project → React 19.2 + Compiler from day one
  • web data-fetching/SSR → RSC via a meta-framework (RB-E-META-FRAMEWORKS); React Native → RSC does not apply
  • bundle-size-critical web → consider Preact; treat @tanstack/redact / Million / TSRX as experimental, not production bets

Options & tradeoffs

the field considered — and why each one isn’t the default here

optiontradeoff
React 19.2 (current line)latest 19.2.x; ships <Activity>, <ViewTransition>, useEffectEvent; RN 0.83+ runs React 19.2
React Compiler 1.0 (STABLE)auto-memoizes — drops most useMemo/useCallback; stable since 2025-10 (Meta prod); Rust port MERGED into SWC — ships via Rspack 2.1's built-in loader (7–13x the Babel plugin); enable via Babel/SWC/Oxc/Vite-8 plugin
React Server Components (RSC)server-rendered components over the Flight protocol; web-only; Server Functions = the mutation path (security-sensitive — see RB-E-SECURITY)
<Activity>hide a subtree while preserving its state (defer/restore); 100% satisfaction in State-of-React 2025; pair with Effect cleanup
<ViewTransition> / use()animated transitions (component or native startViewTransition); use() reads promises/context under Suspense
alternative React runtimesPreact (small, drop-in-ish); experimental @tanstack/redact (~9KB, claims 2–3x, TanStack-Start-scoped); Million; TSRX = a JSX-successor compiling to React/Preact/Solid — mostly experimental

Verified notes

React Compiler reached 1.0 STABLE (2025-10-07) and is production-ready — new code can drop most manual memoization. The Rust port LANDED: merged into SWC and shipping via Rspack 2.1's built-in SWC loader (7–13x faster than the Babel version; verified vs the Rspack 2.1 blog, 2026-07-06) — while Rolldown pulled ITS integration over napi binary size (that caveat stands, see RB-E-BUILD). React moved to the independent React Foundation (Linux Foundation, Feb 2026; exec director Seth Webster); repos moved facebook → react org (corroborated across React Status #464/#478 + TWiR). RSC/ Server Functions are a WEB concern (not RN) with an active DoS CVE history (see RB-E-SECURITY). Compiler-1.0 + RSC-DoS verified this session; other rows from release history + newsletters. Adversarially stress-tested 2026-06-25 (SURVIVES, caveats applied): 19.2 is still the stable line (19.3 in active canary — re-verify before quoting "19.2"); don't strip existing memoization when enabling the Compiler — useMemo/useCallback remain valid escape hatches.

Canonical reading

Editorial annotations on why each piece matters — the articles themselves are the originals; read them there.

The hidden cost of React.ActivityPeter Piekarczyk

The when-NOT-to caveat behind this entry's <Activity> row: hiding preserves STATE but destroys and re-creates EFFECTS on every toggle — so effect-shaped work (keyboard subscriptions, analytics, listeners) piles up subscription/setState waves each time a hidden RN screen is shown again. Pair <Activity> with disciplined effect cleanup or don't use it for effect-heavy subtrees.

How to Build the Fastest Apps: Break the Rules (App.js Conf 2026)Jay Meistrich (Software Mansion)

Reframes rendering cost as the dominant hidden bottleneck: React's `render` doesn't just paint — it passes state down, updates context consumers, fires effects, and re-subscribes queries, so ordinary patterns (lift-state-up, effects-for-coordination, `useContext` on a whole value, deps-array callbacks) cascade renders top-down (measured ~10x CPU top-vs-leaf). The React Compiler can't save you when a prop *actually* changes. The prescribed toolkit — `useEffectEvent`/stable event callbacks (no deps-array cascades), imperative APIs over hooks (get-a-value + subscribe instead of re-render), `use-context-selector`, and providing *stable* objects through Context — extends the Erikson rendering guide below into a 'render once' discipline. Vendor angle (pitches Legend State), but the render-model reasoning is framework-agnostic. See RB-E-STATE for the state-architecture half.

A (Mostly) Complete Guide to React Rendering BehaviorMark Erikson, Redux maintainer

The end-to-end explanation of when and why React renders — render vs commit, reconciliation, the cascade to children, memo/useMemo/useCallback, Context behavior. The mental model that makes the React Compiler's auto-memoization comprehensible rather than magic.

Writing Custom Renderers for ReactMaciej Jastrzębski (Callstack)

How React's reconciler connects to a host environment (the renderer interface), and why React Native Testing Library needed its own renderer. The canonical explanation of React's renderer architecture.

Component Architecture for React Server ComponentsAurora Scharff

Traces the move from useEffect/React-Query/route-loaders to component-level RSC data fetching, with durable principles: component autonomy, deliberate Suspense boundaries, skeleton co-location. RSC architecture from a recognized educator.

Building Bulletproof React ComponentsShu Ding (Vercel; SWR creator)

Ten component-design patterns for SSR/hydration, multiple instances, concurrent rendering, portals, view transitions, and tainting (useId, React.cache, taintUniqueValue). A durable component-API mental model from an authoritative author.

Understanding why React Fiber existsSankalpa Acharya (inside-react)

Traces React 15's non-interruptible recursive reconciliation to Fiber's linked-list + time-slicing design — the 'why it exists' explainer for concurrent React. First in a React-internals series (key-prop, state-updates, out-of-order streaming also available).

How does React Fiber render your UISankalpa Acharya (inside-react)

A first-principles walk through Fiber's four phases (trigger/schedule/render/commit), the fiber-node shape, time-slicing, and the bitmask lane-priority system. Durable internals knowledge that survives version churn.

Two React design choices developers don't like (but can't avoid)Ryan Carniato (Solid.js)

A competing-framework author argues deferred state commits and effect dependency arrays are forced by async UI, not arbitrary — even signal-based frameworks hit the same wall. An unusually credible mental model for React's most-griped-about choices.

React Compiler at Eighteen MonthsSascha Becker

An 18-month retrospective: how auto-memoization retired the missing-dependency bug class, the five patterns where the compiler bails out, and a staged adoption path. The mental model for the compiler era (complements the official release post in sources).

Sources

Depth (in-domain rules) is owned by the engineering-principles skill — this entry is selection breadth.

The full explanation

The reviewed long-form essay behind this entry — the why, not a how-to. Also on GitHub.

About React core — the compiler era, RSC, and concurrent features

Diataxis: Explanation. This page builds understanding of where React itself is in 2026 and what that means for how you write it. It is not an API reference (that's react.dev) and not a rules-of-React linter (that's engineering-principles / ESLint). Read this for the why.

The one shift that reframes everything: stop hand-memoizing

For a decade, "React performance" meant manually wrapping things in useMemo, useCallback, and React.memo to stop needless re-renders. The React Compiler (1.0, stable since 2025-10-07) inverts that. It analyses your components and inserts memoization for you, more precisely than humans reliably do — across early returns and conditional branches. So the new mental model is: write straightforward code and let the compiler memoize; manual useMemo/ useCallback become escape hatches, not defaults. (Verified against the official React Compiler 1.0 announcement.)

That single change cascades: the old "which state library avoids re-renders" reasoning weakens (RB-E-STATE), and "where are my missing memos" stops being a routine bug class.

The mental model: React is now stable, plural, and compiler-optimized

Three facts define core React in 2026, and they're easy to conflate:

  • React-the-library is mature and stable on the 19.x line (19.2 ships <Activity>, <ViewTransition>, useEffectEvent, use()), and now lives under the independent React Foundation (Linux Foundation, Feb 2026). Stability is the headline.
  • React-the-protocol (RSC). React Server Components are a server rendering model over the Flight wire protocol. This is a web concern delivered through meta-frameworks (RB-E-META-FRAMEWORKS); it does not apply to React Native, and its security issues are server-side (below, RB-E-SECURITY).
  • React-the-projection (alternative runtimes). Preact, the experimental @tanstack/redact, Million, and the JSX-successor TSRX are other ways to run React-shaped code. Mostly experimental; interesting, not production defaults.

Keeping these three apart is most of "understanding modern React."

The default, and why

Stay on React 19.2 and turn on React Compiler 1.0 — let it handle memoization.

This is the low-regret baseline: you're on the stable line, you get the concurrent features, and you delete a category of manual-memo busywork (and the bugs that come with getting it wrong). New projects should adopt the Compiler from day one; existing apps can enable it incrementally. On the web, reach for RSC via a meta-framework when you actually need server rendering/data; on React Native, RSC simply doesn't apply.

The landscape, and when each piece earns its place

React Compiler 1.0 — on by default for new code; the Rust port is the in-progress part, but the compiler itself is production-proven at Meta. Enable via the Babel/SWC/Oxc/Vite plugin (RB-E-BUILD).

RSC + Server Functions — server-rendered components and the mutation path. Web-only, meta-framework-delivered, security-sensitive (RB-E-SECURITY). Use when the server is part of your architecture, not as a reflex.

Concurrent features<Activity> (hide a subtree while preserving its state — high satisfaction in State-of-React 2025), useEffectEvent (read latest values without re-subscribing effects), use() (read promises/context under Suspense), <ViewTransition> (animated transitions). Reach for them when the problem matches; they're tools, not obligations.

Alternative runtimes — Preact for bundle-size-critical web; treat @tanstack/redact, Million, and TSRX as experiments, not production bets. The decade of React libraries is the reason to stay on React unless a concrete driver pushes you off (RB-E-ALT-FRAMEWORKS).

Tradeoffs and failure modes to name out loud

  • Mutating objects you got from useState defeats the Compiler. The ecosystem's load- bearing caveat: prefer immutable updates and plain data over behaviour-rich class instances in render paths, or you fight the optimizer (RB-E-STATE).
  • Hand-memoizing by default in the compiler era. Adding useMemo/useCallback everywhere is now noise — and occasionally counterproductive. Let the compiler work; reach for manual memo only for measured, specific cases.
  • Treating RSC as universal. RSC/Server Functions are web + server. Assuming they apply to React Native, or that their CVEs affect RN, is a category error (RB-E-SECURITY).
  • Chasing experimental runtimes. Betting production on redact/Million/TSRX trades a vast, battle-tested ecosystem for unproven speed claims.

How it interacts with the rest of the stack

  • State (RB-E-STATE). The Compiler changes the perf calculus — choose a store for its sharing model and ergonomics, not as a memoisation workaround.
  • Meta-frameworks (RB-E-META-FRAMEWORKS). RSC/Server Functions are productised there; this entry is the primitive, that one is the frameworks.
  • Security (RB-E-SECURITY). The RSC/Server-Function DoS family is server-side and patched in React 19.0.5/19.1.6/19.2.5; it does not affect React Native.
  • Build (RB-E-BUILD). The Compiler is a build plugin; how you enable it depends on your bundler/toolchain.
  • Rendering depth. When you do need to reason about renders, the depth (render vs commit, reconciliation, Fiber) lives in the reading and in engineering-principles, not in this page.

In one paragraph

Modern React is stable, plural, and compiler-optimized: stay on 19.2 and turn on the React Compiler so you stop hand-writing useMemo/useCallback (just don't mutate state objects and defeat it). Keep the three Reacts straight — the library (stable, concurrent features), the protocol (RSC: web + server only, not RN, security-sensitive), and the projections (Preact/redact/Million/TSRX: mostly experimental). Reach for RSC and concurrent features when the problem calls for them, and stay on React for its ecosystem unless a concrete driver pushes you off.


See also: RB-E-STATE (Compiler changes the state-perf calculus), RB-E-META-FRAMEWORKS (RSC/Server Functions productised), RB-E-SECURITY (RSC CVEs are server-side), RB-E-TYPESCRIPT. Rendering/architecture depth: the engineering-principles skill.

Related in react-foundations: rn-versions · typescript