mrkeyoor.com_
Wed 30 Sept 21:10 UTC
Webevaluationupdated 30 Sept 2026

react-three-fiber review

React Three Fiber is a React renderer for Three.js, so you can describe a 3D scene with components and JSX instead of managing every object by hand. It connects React state, events, Suspense, and reusable components to the same Three.js objects you would use directly.

Verdict

Our react-three-fiber checkout installed 1,185 packages in 173 seconds, then passed its 15-second build and 101-second test run, giving contributors a heavy but green baseline. Use it when your 3D interface genuinely benefits from React components, state, events, and Suspense. Use Three.js directly when the render loop is the application and React would mostly sit around it.

We ran it

Lab card: what happened when we ran react-three-fiberScreenshot of react-three-fiber (docs.pmnd.rs/react-three-fiber)
Install✓ · 173s1185 packages · 835 MB
Build✓ · 15s
Tests✓ · 101sran, no count parsed
Repo211 files~14,761 lines of source · 3.3 MB · 2 CI workflows

Answers from our run

Does react-three-fiber build from source?

Dependencies installed in 173 seconds (1185 packages), and the build succeeded in 15 seconds. We cloned commit 2e77537 into a clean Debian container with 3 CPUs and no project-specific setup.

Do react-three-fiber's tests pass?

The test command failed in our container, and its output did not report a pass or fail count.

Who should not use react-three-fiber?

Developers hoping to avoid learning Three.js: the project README explicitly says you should understand scenes, cameras, meshes, geometry, and materials first.

What are the alternatives to react-three-fiber?

Three.js, Babylon.js, PlayCanvas Engine. Our react-three-fiber checkout installed 1,185 packages in 173 seconds, then passed its 15-second build and 101-second test run, giving contributors a heavy but green baseline.

Setup4/5Simple app install; contributor checkout took 173 seconds
Docs4/5Direct guides for versions, frameworks, testing, and frame loops
Community5/532,618 stars, 13 open issues, and same-day maintenance
Maturity5/5v9.8.1 is current, and our build and tests both passed

Discussed on

  1. hnReact Renderer for Three.js213 points

Who it’s for

React teams building product configurators, data scenes, games, or interactive 3D pages with Three.js.
Developers who want scene objects to follow the same component boundaries and state flow as the rest of a React app.
Web and React Native teams prepared to profile GPU work on their actual target devices.
Library authors building reusable controls, loaders, physics, accessibility, or XR components around Three.js.

Who it’s NOT for

Developers hoping to avoid learning Three.js: the project README explicitly says you should understand scenes, cameras, meshes, geometry, and materials first.
React 18 applications that cannot remain on React Three Fiber 8 or upgrade React: the README pairs Fiber 9 with React 19.
Animation code built around React state updates on every frame: the performance guide says fast updates belong in useFrame mutations with frame deltas.
v9.8.1 applications that depend on demand rendering to redraw immediately after unmounting objects: open issue 3980 reproduces a stale frame until another invalidation occurs.
WebGPU teams that require automated browser coverage on a real GPU today: issue 3798 says the v10 WebGPU checks still run as an interactive checklist.

Setup reality

Our sandbox installed commit 2e77537 in 173 seconds, adding 1,185 packages and using 835 MB. The build succeeded in 15 seconds, and the tests succeeded in 101 seconds. The checkout itself was 3.3 MB, with 211 files and about 14,761 lines of source.

An application installs three and @react-three/fiber; no account, API key, database, or hosted service is required. Version pairing matters: Fiber 9 is for React 19, while Fiber 8 is for React 18. Next.js projects may need three in transpilePackages.

React Native uses the /native entry point plus Expo GL and asset packages, and the docs warn that iOS simulators can crash because their OpenGL ES support is incomplete. The repository is a Yarn workspace with 2 CI workflows and no Dockerfile, which is normal for a browser renderer rather than a server.

React owns the scene graph, while Three.js still owns the graphics

React Three Fiber turns JSX such as <mesh> into real Three.js objects and keeps them in sync with React. A scene can use components, props, hooks, events, Suspense, and shared state without wrapping every Three.js class by hand. That is especially helpful when a 3D configurator or data view sits inside a larger React product and must respond to the same application state.

The abstraction stops at the right place. Materials, geometry, cameras, lights, loaders, and renderer behavior still come from Three.js. The README tells newcomers to learn those concepts before rushing in. React Three Fiber changes how you compose and update them; it does not explain lighting, shaders, draw calls, asset formats, or GPU budgets for you.

Version 9 requires React 19

The compatibility rule is unusually clear: React Three Fiber 9 pairs with React 19, while Fiber 8 pairs with React 18. That matters because this package is a renderer, like React DOM, rather than a component kit that can ignore React internals. The v9 migration guide also lists Strict Mode, JSX type, color management, and renderer-construction changes that deserve code review during an upgrade.

A browser app installs three and @react-three/fiber, with @types/three for TypeScript projects. Vite is the easy path. Next.js may need three added to transpilePackages when an add-on ships untranspiled code. React Native uses @react-three/fiber/native with Expo GL and asset packages, and the docs recommend testing on physical iOS hardware because simulator OpenGL ES support can be unreliable.

What happened when we ran it

Our sandbox installed commit 2e77537 in 173 seconds, pulling 1,185 packages and occupying 835 MB. The environment was a fresh unprivileged Debian container with 3 CPUs, 8 GB of RAM, Node 22, and no secrets. Installation was the slowest step by a wide margin, but it completed without an error.

The build succeeded in 15 seconds. Tests then succeeded in 101 seconds. Those results cover repository mechanics, not browser frame rate or scene quality. The checkout had 211 files, about 14,761 lines of source, and used 3.3 MB before installation. Its compact source tree expands into a much larger contributor toolchain because the workspace includes React, React Native, Expo, Jest, TypeScript, Vite, and release tooling.

Our scan found 2 CI workflow files, no Dockerfile, no conventional tests directory, and Yarn workspaces. The successful test command is the result that matters; folder names are only a repository-layout signal. We did not measure frames per second, model loading, memory use in a browser, or WebGPU behavior, so this run cannot support performance claims about a real scene.

A 60 fps loop needs mutation, not React state churn

Three.js animation code runs on a frame loop, often 60 times per second. The project's performance guide tells you to update object references inside useFrame, multiply movement by the supplied frame delta, and avoid routing each fast change through React state. That advice can feel odd to a React developer trained to treat mutation with suspicion. In this renderer, it is the intended hot path.

Object lifetime matters too. Creating materials and geometry can trigger GPU work, so the docs recommend reuse, caching, and instancing. The scaling guide suggests a few hundred draw calls where possible and treats 1,000 as a maximum target rather than a promise. useLoader caches assets by URL, while demand rendering can stop the loop when a scene is idle. React organizes these choices, but Three.js performance rules still set the bill.

Demand rendering in v9.8.1 can leave a removed object visible

Open issue 3980 reproduces a v9.8.1 regression with frameloop="demand". Unmounting a mesh does not request a new frame, so the removed object stays visible until another event invalidates the canvas. Mounting and prop changes still redraw. The report traces the behavior to invalidation occurring after the child's parent link is cleared and says the same reproduction worked in Fiber 8.

That is a narrow bug with a practical consequence. Demand rendering is recommended for scenes that can sit still because it reduces idle GPU work and battery use. If your interface frequently removes objects while otherwise idle, add this reproduction to your browser checks or issue an explicit invalidation until the fix reaches the version you ship.

WebGPU support still needs tests on a real GPU

Fiber 9 accepts an asynchronous renderer factory, which is needed to initialize Three.js's WebGPU renderer. Open issue 3782 reports that a React rerender during that asynchronous setup can create two renderers on one canvas and produce GPU validation errors. The report covers Fiber 9.6.1 and describes navigation failures as well as the duplicate initialization. Treat WebGPU as a path to test, not a drop-in flag.

Issue 3798 makes the project-level gap explicit for the upcoming v10 work: browser checks for WebGPU initialization, multiple canvases, visibility, pipelines, and related behavior are still run interactively against the example app. A planned non-headless Chromium harness has not yet replaced that checklist. Our 101-second Node test run therefore should not be read as proof of real-GPU coverage.

A September 30 push and 13 open issues show active maintenance

The measured commit landed on September 30, 2026, and fixed device-pixel-ratio changes. GitHub also showed issue and pull-request updates that day. Release v9.8.1 arrived on September 24 with fixes for renderer disposal and React Activity visibility. The open queue was small: 13 issues and 4 pull requests, rather than 17 bugs.

React Three Fiber is the right layer when your scene is part of a React application and benefits from the same component boundaries. The green 15-second build and 101-second test run make its source baseline easy to trust. The harder work begins in the browser: profile the assets, frame loop, disposal, and weakest target device before deciding that JSX made the 3D problem simple.

Alternatives

ProjectWhat it isPick it when
Three.js gh↗The underlying JavaScript 3D library, used directly without a React renderer.pick this instead when you want explicit control over the scene loop and do not need React to own the scene graph.
Babylon.js gh↗A larger web 3D engine with its own scene APIs, tools, physics options, and loaders.pick this instead when you want an engine-led architecture and editor tooling rather than React component composition.
PlayCanvas Engine gh↗A browser game and 3D engine that can pair with PlayCanvas's visual editor.pick this instead when a game-engine workflow and shared visual editing matter more than React integration.

What people are saying

  1. [velocity-scout] pmndrs/react-three-fiber

Sources

  1. React Three Fiber repository and README
  2. React Three Fiber installation guide
  3. React Three Fiber performance pitfalls
  4. React Three Fiber v9.8.1 release
  5. Issue 3980 on demand rendering after unmount
  6. Issue 3798 on a WebGPU browser test harness

More web reviews

chi · youtube-ambilight · hyalite--liquid-glass · human-atlas · liquid-glass-screens · echarts · the whole board →