Modern React development, 40-part post series
React has become two things at once: a component model for client user interfaces and an architecture layer for full-stack React frameworks. This series teaches both from the same mental model: data flows through a tree, user intent flows through events and Actions, and each boundary owns the facts it is responsible for.
Every post introduces one concept, defines the terms needed to read React docs, explains the mental model, shows practical TypeScript examples, and names the details that matter when the pattern reaches real application code.
Reading order
- Components and JSX, the component and JSX model that every later post builds on.
- Props, children, and component boundaries, how parent components pass data, callbacks, and nested UI through explicit contracts.
- Rendering lists and stable keys, how React preserves identity when repeated UI changes order or membership.
- Events and local state, how event handlers record intent and local state remembers changing values.
- State shape and derived values, how to store the minimal facts and calculate the rest during render.
- Lifting state and controlled inputs, how shared state moves to the closest common owner and drives form controls.
- Reducers for multi-step state, how named actions make related state transitions easier to reason about.
- Context without global soup, how providers pass tree-wide dependencies without turning context into a junk drawer.
- Refs and DOM escape hatches, how refs hold DOM handles and mutable values outside render state.
- Effects, synchronization, and cleanup, how Effects start and stop synchronization with external systems.
- Custom hooks as reuse boundaries, how reusable stateful behavior gets packaged behind a focused Hook contract.
- Data loading with Suspense boundaries, how loading UI maps to meaningful sections of the React tree.
- Transitions for responsive updates, how non-urgent updates keep typing and direct interaction responsive.
- Forms with Actions, how React form Actions connect submitted data, pending state, and returned result state.
- Optimistic UI, how to show expected results immediately while server truth is still pending.
- Server Components and client boundaries, how server-rendered React composes with browser-interactive Client Components.
- Server Actions and mutation boundaries, how Server Functions handle trusted writes behind form and Action flows.
- TypeScript patterns for React, how prop, event, reducer, ref, and children types shape safer component APIs.
- Testing components by behavior, how to assert user-visible behavior instead of implementation details.
- Performance and React Compiler, how purity, measurement, memoization, and Compiler support fit together.
- Framework choice and project setup, how to decide whether the app needs a framework or a smaller client-only setup.
- Next.js App Router, how App Router uses files, layouts, Server Components, Suspense, and Server Functions.
- React Router v7, how route modules, loaders, actions, and nested layouts organize application flow.
- TanStack Router and TanStack Start, how type-safe routes and search params become application boundaries.
- Expo and React Native, how React’s component model maps to native screens through Expo and React Native.
- Vite and client-only apps, how Vite supports fast React development when the app owns routing and data choices.
- Storybook and component workbenches, how stories make component states visible outside product flows.
- Vitest, Testing Library, and Playwright, how to pick the right testing distance for a React behavior.
- ESLint, TypeScript, formatting, and CI gates, how automated checks keep React rules and project contracts out of manual review.
- Routing and nested layouts, how URL state and shared route shells structure application UI.
- Data fetching with a cache, how server data gets a shared owner for freshness, loading, and error state.
- Mutations and cache invalidation, how writes update or refresh every cached read that depends on changed data.
- Error boundaries and recovery, how render-time failures get contained and reported.
- Code splitting and lazy loading, how lazy imports and Suspense reduce initial JavaScript.
- Styling, design tokens, and variants, how component APIs expose supported visual states without open-ended styling.
- Accessibility as component API design, how labels, semantics, focus, and ARIA belong in component contracts.
- Validation at form and API boundaries, how untrusted input becomes parsed, typed, and safe enough to use.
- Auth, roles, and protected UI, how UI communicates permissions while server checks enforce them.
- Internationalization and formatting, how locale-aware formatting keeps display text separate from raw facts.
- Deployment, observability, and feature flags, how production builds, telemetry, and rollout controls close the React feedback loop.
Foundations
The first section builds the component mental model: components describe UI, props carry data down, state remembers changing facts, and Effects synchronize with external systems.
- Components and JSX
- Props, children, and component boundaries
- Rendering lists and stable keys
- Events and local state
- State shape and derived values
- Lifting state and controlled inputs
- Reducers for multi-step state
- Context without global soup
- Refs and DOM escape hatches
- Effects, synchronization, and cleanup
- Custom hooks as reuse boundaries
Modern React APIs
The second section covers newer React patterns for loading, transitions, forms, optimistic feedback, Server Components, Server Functions, TypeScript, testing, and performance.
- Data loading with Suspense boundaries
- Transitions for responsive updates
- Forms with Actions
- Optimistic UI
- Server Components and client boundaries
- Server Actions and mutation boundaries
- TypeScript patterns for React
- Testing components by behavior
- Performance and React Compiler
Frameworks And Tooling
The third section looks at the application layer around React: framework choice, App Router, React Router, TanStack tools, Expo, Vite, Storybook, testing stacks, and CI gates.
- Framework choice and project setup
- Next.js App Router
- React Router v7
- TanStack Router and TanStack Start
- Expo and React Native
- Vite and client-only apps
- Storybook and component workbenches
- Vitest, Testing Library, and Playwright
- ESLint, TypeScript, formatting, and CI gates
- Routing and nested layouts
Production Interfaces
The final section connects React code to production boundaries: data caches, mutations, error recovery, lazy loading, styling systems, accessibility, validation, auth, internationalization, and observability.
- Data fetching with a cache
- Mutations and cache invalidation
- Error boundaries and recovery
- Code splitting and lazy loading
- Styling, design tokens, and variants
- Accessibility as component API design
- Validation at form and API boundaries
- Auth, roles, and protected UI
- Internationalization and formatting
- Deployment, observability, and feature flags