Factory.ai

Open-Source Wikis

/

React

/

Lore

facebook/react

Lore

A short, opinionated history of facebook/react derived from the git log, the CHANGELOG.md, and the public react.dev blog. Dates and counts are approximate; speculation is hedged.

Eras

The original release (May 2013 – Sep 2016)

The first commit landed on May 29, 2013 as a Facebook open-source release. The codebase at that point was the original "stack" reconciler: synchronous, recursive, and tightly coupled to the DOM. The headline ideas — virtual DOM diffing, JSX as a syntactic sugar over createElement, components as the unit of composition — were already in place.

By the end of this era React 0.14 had split react from react-dom, and React 15 (April 2016) had moved to no-op-children-by-default and tightened the SSR API.

The Fiber rewrite (Sep 2016 – Sep 2017)

React 16 was a ground-up reimplementation of the reconciler around the Fiber data structure: a doubly-linked tree where each node has an alternate pointer, allowing the renderer to pause and resume work. The rewrite landed at the very end of this era (Sep 2017) and is the basis of everything in packages/react-reconciler/src/ today. Error boundaries (componentDidCatch) and fragments shipped as part of this release. Most files prefixed ReactFiber*.js were created or substantially restructured during this era.

Async, hooks, and concurrent (Oct 2017 – Aug 2020)

React 16.3 introduced the new lifecycle methods (getDerivedStateFromProps, getSnapshotBeforeUpdate); 16.6 brought React.lazy, React.memo, Suspense for code-splitting; 16.8 (Feb 2019) introduced Hooks — the largest API surface change in the project's history. The hook implementation now in packages/react-reconciler/src/ReactFiberHooks.js was the centerpiece.

The "concurrent mode" experiment ran in parallel: the lane-based scheduler (ReactFiberLane.js), useDeferredValue, useTransition, and Suspense for data were all developed during this era and shipped to opt-in users via the experimental channel.

React 18: concurrent by default (Aug 2020 – Mar 2022)

React 18 (March 2022) was the public flip of concurrent rendering on by default — createRoot replaced ReactDOM.render (the legacy entry was deprecated then removed in 19), automatic batching extended to all event types, useId, useSyncExternalStore, and useDeferredValue shipped as stable, and streaming SSR (Fizz) replaced the old string-builder server renderer. The Fizz core in packages/react-server/src/ReactFizzServer.js was written during this era; the legacy ReactDOMStringRenderer was removed.

Server Components and the compiler (Mar 2022 – Apr 2024)

Two parallel multi-year projects defined this era:

  • React Server Components moved from prototype to a real wire format and a production story bundled with Next.js's app router. The react-server package, the Flight format, and the bundler-specific clients (react-server-dom-webpack, react-server-dom-parcel, react-server-dom-turbopack, react-server-dom-esm) all became real, evolved their wire format multiple times, and stabilized. Server Actions — calling server functions from client components — landed at the end of this era.
  • The React Compiler (codename "React Forget" → renamed to React Compiler) was rewritten in TypeScript with a proper HIR (compiler/packages/babel-plugin-react-compiler/src/HIR/) and a multi-pass pipeline (Entrypoint/Pipeline.ts). The compiler workspace was open-sourced into this same monorepo.

React 19 and View Transitions (Apr 2024 – present)

React 19 (Apr/Dec 2024) shipped Server Actions and resource hoisting (<title>, <link>, async <script>), use(promise), the ref prop on function components (no more forwardRef needed for new code), Owner Stacks, and the formal API for the React Compiler.

Active areas in the months leading up to this wiki's generation (early 2026):

  • View Transitions<ViewTransition> and useSwipeTransition. Code in ReactFiberCommitViewTransitions.js, ReactFiberApplyGesture.js, ReactFiberGestureScheduler.js.
  • Activity (<Activity>) — the public name for the long-internal OffscreenComponent, finalized in React 19.2.
  • useEffectEvent — the long-discussed "non-reactive event" hook, shipping behind a flag and stabilizing.
  • Partial pre-renderingprerender + resume for splitting prerender across machines.
  • React Compiler stabilizationeslint-plugin-react-hooks v7 absorbed compiler-aware lint rules.

Longest-standing code

A handful of files have survived nearly intact since their introduction:

  • packages/react/src/ReactBaseClasses.jsComponent and PureComponent have changed only in micro ways since their original introduction.
  • packages/react/src/ReactChildren.js — the Children.map/forEach shape predates Fiber and has been stable for nearly a decade.
  • packages/scheduler/ — the cooperative scheduler has been refined many times (multiple MessageChannel rewrites, postTask integration) but its public shape is essentially the same shape it had when extracted from the reconciler in 2018.
  • packages/shared/ReactSymbols.js — adds new symbols every year for new node types (Suspense, Memo, Activity, ViewTransition, ...) but has not lost one yet.

Deprecated and removed

  • Legacy mount APIReactDOM.render and ReactDOM.hydrate were deprecated in React 18 and removed in React 19, in favor of createRoot and hydrateRoot.
  • String SSR (ReactDOMStringRenderer) — replaced by Fizz streaming.
  • ReactDOM.unstable_batchedUpdates — superseded by automatic batching in React 18.
  • ReactTestUtils.act — moved into react-dom/test-utils, then into the act re-export from react.
  • String refs — deprecated for years; removed in React 19.
  • PropTypes / defaultProps on function components — removed in React 19.
  • Paper renderer (legacy React Native) — removed in early 2026 ([react-native-renderer] Delete Paper (legacy) renderer (#36285) in Apr 2026). Only Fabric remains.
  • Internal ReactDOM.findDOMNode — long deprecated, removed in React 19.
  • react-cache (the old experimental module) — kept in the repo but superseded by Suspense + the cache() API on the react-server side.

Major rewrites

In rough order of size:

  1. Stack → Fiber reconciler (2016–2017). Largest rewrite in the project's history.
  2. Class components → Hooks (2018–2019). Not a rewrite of the reconciler, but a rewrite of how function components are implemented inside it.
  3. String SSR → Fizz (2020–2022). Replaced the entire server-rendering path.
  4. Forget → React Compiler (~2023). Rewrote the compiler into TypeScript with a proper HIR.
  5. Paper → Fabric (multi-year on the React Native side, completed in this repo in 2026 with #36285).
  6. OffscreenActivity (~2024). Public-facing rename of an existing internal primitive, plus stabilization.

Growth trajectory

  • 2013–2015: 1–2 maintainers actively committing day-to-day, dozens of external contributors.
  • 2016–2018: Fiber-era core team forms; ~5–10 frequent committers; external contributors expand.
  • 2019–2022: Hooks + concurrent era. Core team grows; 120+ distinct authors per year by the end of this era.
  • 2023–2026: Compiler workspace doubles the project's footprint. The team continues to be small (the MAINTAINERS file lists 23 names), but the long tail of contributors continues to grow.

The total number of unique authors over the project's lifetime is now around 1,970.

Built by Factory AutoWiki from public repository content. It is a generated preview for codebase exploration, not source-maintained documentation.

Lore – React wiki | Factory