What is React turns out to be a harder question than it looks, because most answers describe a library that stopped existing around 2020. React today has a compiler, a component type that never reaches the browser, a foundation instead of a corporate owner, and an official recommendation not to use it on its own.
Ask what is React and the durable answer is short: a JavaScript library for building user interfaces out of components. That much has held since 2013. Nearly everything around it has moved.
What is React at its core: the component model
A component is a JavaScript function that returns markup. That is genuinely the whole idea, and the rest follows from it.
The markup is written in JSX, an HTML-like syntax that compiles to function calls. It is not HTML and it is not a template language, which is why attributes read className rather than class and why expressions go in braces. Props are read-only arguments passed from a parent to a child. State is a component’s own memory. Data flows one way, down through props, and children talk back by calling functions their parent handed them.
When state changes, React re-renders the component and reconciles the tree it describes against the actual page. You describe what the interface should look like for a given state. You never write the steps to mutate it. That inversion is the thing people mean when they say React changed how the web is built.
Hooks, and the one that is not a hook
Hooks let function components hold state and reach outside themselves. The ones that carry most of the weight are useState for local state, useEffect for synchronizing with external systems, useContext for reading values passed down without threading props, and useRef for values that persist without triggering renders.
The current release line adds a few worth knowing. useEffectEvent pulls non-reactive logic out of an Effect and, importantly, should not go in the dependency array. useActionState manages form action state and returns a pending flag alongside it. useOptimistic shows a result before the server confirms it, and must be set inside a transition.
One correction that separates current writing from recycled writing: use is not a hook. It is an API for reading a promise or a context, and unlike hooks it can be called inside conditionals and loops. Two rules come with it. The promise must be cached, so never write use(fetch(...)) directly in a component. And rejections go to an error boundary rather than to a try/catch.
A smaller trap: useFormStatus lives in react-dom, not in react.
Library, not framework, and why it matters
This is the point the post exists to make, and React’s own documentation makes it first.
React gives you the component model, state and rendering. It does not give you routing. It does not give you data fetching. It does not give you build tooling, and it has opinions about none of them. React’s guide to building from scratch says so directly, noting that tools like Vite produce a client-only single page application and "don’t include solutions for" routing, data fetching, code splitting and styling.
The documentation then names the third-party pieces that fill those gaps: React Router or TanStack Router for routing, and TanStack Query, SWR, RTK Query or a GraphQL client for data. Every one of those is a decision you own.
This is React’s greatest strength and its standing tax. You get to assemble exactly the stack you need. You also have to, forever, including when the person who chose it leaves.
Server Components, stated precisely
React Server Components are the change that most explainers get wrong, usually by conflating them with server-side rendering.
Server-side rendering renders the same components to HTML on a server, then ships them to the browser to hydrate. Server Components are a different type of component that "renders ahead of time, before bundling, in an environment separate from your client app or SSR server." They run at build time or per request, and their code never reaches the browser at all. A Server Component can read your database directly, and none of that logic ships.
The stability position is genuinely two-tier, and flattening it is the common error. React’s documentation says Server Components in React 19 are stable and will not break between minor versions, but that "the underlying APIs used to implement a React Server Components bundler or framework do not follow semver and may break between minors." So they are stable to use and unstable to implement. That is why you meet them through a framework rather than wiring them up yourself.
The frameworks that implement them, named in React’s own security advisory, are Next.js, React Router, Waku, Parcel’s RSC support, the Vite RSC plugin and RedwoodSDK.
Two other naming points. Server Functions were renamed from Server Actions in September 2024, and a Server Function is only a Server Action when passed to an action prop.
The security episode you should know about
In December 2025 React disclosed an unauthenticated remote code execution vulnerability in the Server Components bundler packages, scored CVSS 10.0. Applications were exposed even if they had defined no Server Function endpoints of their own. It was fixed in the 19.0.1, 19.1.2 and 19.2.1 patch releases. A second advisory eight days later covered source code exposure and two denial of service issues, fixed in 19.0.4, 19.1.5 and 19.2.4.
The practical lesson is about patch discipline rather than about React specifically, and the versions page is the reference that matters. If you run Server Components, the patch line matters as much as the minor version, and pinning to a minor without tracking patches is how sites stayed vulnerable.
The Compiler, and who owns React now
The React Compiler reached 1.0 on October 7, 2025 and is stable. It performs automatic memoization at build time, including memoization after early returns that useMemo and useCallback cannot express, which means most hand-written memoization becomes unnecessary. It supports React 17 and above with configuration, and works best on 19. Meta reports load and navigation improvements up to 12 percent and some interactions around two and a half times faster, which are vendor figures. It is opt-in, with an incremental adoption path, and on by default for new apps in Vite, Next.js and Expo. The old compiler lint plugin is retired; its rules moved into eslint-plugin-react-hooks.
The governance change is larger and less reported. Since February 24, 2026, React, React Native and JSX are owned by the React Foundation, hosted by the Linux Foundation, with Amazon, Callstack, Expo, Huawei, Meta, Microsoft, Software Mansion and Vercel as platinum members. Calling React "Meta’s library" is now wrong. Meta is a member, not the owner.
Starting a React project in 2026
The official advice changed and a lot of tutorials did not follow.
Create React App was deprecated on February 14, 2025 for having no active maintainers and being unable to ship performant production applications. Any guide telling you to run create-react-app is quoting 2020.
React’s current guidance is unambiguous: "If you want to build a new app or website with React, we recommend starting with a framework." It lists Next.js with the App Router, React Router v7 on Vite, and Expo for native, with TanStack Start and RedwoodSDK also named. Vite, Parcel and Rsbuild appear as build tools rather than as recommended starting points. Where you deploy the result is a separate question, and our pillars on Vercel and Netlify cover the two most common answers.
What is React badly suited to?
Content-heavy sites where hydration buys nothing, and an islands architecture like the one we covered in our look at Astro delivers the same result with less JavaScript. Small interactive widgets bolted onto server-rendered pages, where Alpine, htmx or plain JavaScript are lighter answers. Teams who want batteries included and would be happier with a full framework. Projects where bundle size is the binding constraint.
And teams that will not maintain their own stack. What is React without somebody owning its choices is a slow accumulation of decisions nobody remembers making. React’s flexibility assumes somebody owns the choices. If nobody does, the choices rot.
Frequently Asked Questions
What is React used for?
Building user interfaces out of reusable components, most often for web applications and, through React Native, for mobile ones. It supplies the component model, state management primitives and the rendering engine that reconciles what you describe against the actual page. It deliberately does not supply routing, data fetching or build tooling, which you choose separately.
Is React a framework or a library?
A library, and React’s own documentation says so. It handles rendering and state and leaves routing, data fetching, code splitting and styling to the ecosystem. This is why React’s documentation recommends starting with a framework such as Next.js or React Router rather than using React on its own, since a framework supplies the pieces React deliberately omits.
What is JSX?
An HTML-like syntax for describing what a component renders, compiled to plain JavaScript function calls before it runs. It is not HTML and not a template language, which is why attributes use JavaScript naming such as className rather than class, and why any JavaScript expression can be embedded in braces. JSX is optional in principle and universal in practice.
What are React Server Components?
A component type that renders ahead of time in an environment separate from both the browser and the server-side rendering step, so its code never ships to the client. That lets a component read a database directly without exposing the query. They are stable to use, but the bundler APIs beneath them do not follow semantic versioning, which is why you use them through a framework such as Next.js rather than wiring them up yourself.
Should I still use create-react-app?
No. It was deprecated on February 14, 2025 because it had no active maintainers and could not produce performant production applications. React now recommends starting with a framework, naming Next.js with the App Router, React Router v7 on Vite, and Expo for native development. Any tutorial still recommending create-react-app is at least eighteen months out of date.
What does the React Compiler do?
It applies memoization automatically at build time, so components re-render only when their inputs genuinely change, without hand-written useMemo and useCallback everywhere. It reached version 1.0 in October 2025, supports React 17 and above with configuration, and is on by default for new applications in Vite, Next.js and Expo. Meta reports up to 12 percent faster loads and some interactions around two and a half times faster.
Is React still owned by Meta?
No. Since February 24, 2026 React, React Native and JSX have been owned by the React Foundation, hosted by the Linux Foundation, with platinum members including Amazon, Callstack, Expo, Huawei, Meta, Microsoft, Software Mansion and Vercel. Meta remains a member and a major contributor, but describing React as Meta’s library is now inaccurate.
What is the difference between Next.js and NestJS?
They solve unrelated problems despite the similar names. Next.js is a React meta-framework that renders user interfaces, handling routing, rendering modes and Server Components. NestJS is a backend framework for building server-side APIs in TypeScript, with dependency injection, controllers and providers. They are not alternatives to each other and frequently appear together in the same application.