Catalog / React

19.3.0

19.3.0 (September 9, 2026)

todayaddedfixedchangedOriginal notes

Below is a list of all new features, APIs, and bug fixes.

Read the React 19.3 release post for more information.

New React Features

New React DOM Features

  • browser(): a new react-dom API that returns a usable which errors during server rendering and resolves in the browser. use(browser()) inside a <Suspense> boundary marks a subtree as browser-only without reporting a recoverable error (@gnoff: #37143, #37241)
    • Added an onBrowserBailout option to the react-dom/server APIs to observe when a subtree defers to the browser (@gnoff #37193)

Notable changes

  • Enable Trusted Types API integration (@rickhanlonii #35816)
  • Transitions now render independently instead of being entangled into a single render, so a slow transition no longer holds up unrelated ones (@acdlite #37290)
  • Added a DEV-only warning when a component appears to have been unblocked by calling use() conditionally (@hoxyq, @eps1lon: #37104, #37203, #37491)

All Changes

React

  • Fast Refresh Fixes
    • Fix Fast Refresh to find and remount edits to components wrapped behind lazy() (@sophiebits #36965)
    • Fix Fast Refresh so edits to a memo() comparison function take effect (@sophiebits #36964)
    • Fix Fast Refresh crash when an edit changes the kind of a component's type (@sophiebits #36963)
    • Unify hot reload type resolution for Fast Refresh (@sophiebits #36962)
    • Fix Fast Refresh to remount correctly when an edit changes the component kind (@sophiebits #36950)
    • Double invoke effects in StrictMode after Fast Refresh (@eps1lon #35962)
  • Performance Track Fixes
    • Prevent crash when accessing $$typeof in Performance Tracks (@eps1lon #35679)
    • Handle non-string function names in Performance Tracks (@eps1lon #35659)
    • Use minus (-) instead of en dash for removed props in Performance Tracks (@eps1lon #35649)
    • Handle arrays with bigints in deep objects in Performance Tracks (@eps1lon #35648)
    • Don't enumerate typed array props in Performance Tracks in DEV (@UditDewan #36913)
    • Bail out of diffing wide objects and arrays in Performance Tracks (@eps1lon #34742)
    • Clear potentially large performance measures in DEV (@hoxyq #34803)
    • Fix missing else branch for renders with no props change in Performance Tracks (@hoxyq #34837)
  • Activity Fixes
    • Fix useSyncExternalStore missing store mutations that happened while an Activity tree was hidden (@sophiebits #36947)
    • Hide portal contents when an Activity is hidden (@acdlite #35091)
    • Prevent metadata hoisting in hidden <Activity> trees (@ronnakamoto #34983)
    • Prevent errors thrown inside a hidden Activity from escaping to the visible UI (@acdlite #35074)
    • Don't unhide a node if a direct parent Offscreen is still hidden (@sebmarkbage #34821)
    • Don't show internal <Offscreen> component in error messages (@rickhanlonii #35763)
  • Warn in DEV when a component appears to have been unblocked by a conditional use() (@hoxyq, @eps1lon: #37104, #37203, #37491)
  • Render transitions independently instead of entangling them into a single render (@acdlite #37290)
  • Fix hang when updating a dehydrated boundary inside a hidden tree (@gaearon #37135)
  • Don't reacquire Host Singletons during dev effect validation (@gnoff #37113)
  • Only remove properties from Host Singletons on release (@gnoff #37112)
  • Don't invoke effects on moved children in StrictMode (@sophiebits #36948)
  • Throw a clearer error when a rejected Promise is incorrectly instrumented (@eps1lon #36328)
  • Fix context propagation into Suspense fallbacks (@acdlite #36160)
  • Fix context propagation through suspended Suspense boundaries (@acdlite #35839)
  • Fix useDeferredValue getting stuck (@gaearon #36134)
  • Update useActionState error message to say "action state" instead of "form state" (@rickhanlonii #35790)
  • Don't warn when rendering data block scripts (@eps1lon #35953)
  • Treat fibers with alternates as mounted in getNearestMountedFiber (@sebmarkbage #35578)
  • Always instrument the lazy initializer thenable (@gnoff #35521)
  • Annotate cascading updates for DevTools performance tracks in DEV (@huntie #34961)
  • Resolve the .default export of a React.lazy as the canonical value (@sebmarkbage #34906)
  • Limit owner stacks to 10 frames (@eps1lon #34864)
  • Ensure useEffectEvent reads latest values in forwardRef and memo() components (@eps1lon #34831)

React DOM

  • Copy source onto the synthetic toggle event (@lazerg #37389)
  • Update HTML parser rules for the new <select> parser (@josepharhar #34804)
  • Update defaultValue for type="number" inputs to match other input types (@sophiebits #36980)
  • Avoid setting innerHTML when it hasn't changed (@sophiebits #36949)
  • Forward the nonce option in ReactDOM.preloadModule() (@UditDewan #36851)
  • Support fetchPriority for module resources (@TheAlexLichter #36835)
  • Track stylesheet preloads when explicitly preloaded to avoid unnecessary suspension (@gnoff #36386)
  • Suggest correct casing for the misspelled credentialless iframe attribute (@vmx906 #36322)
  • Add credentialless as a recognized boolean attribute for iframes (@vmx906 #36148)
  • Prevent reentrant finishedTask from calling completeAll multiple times (@gnoff #36287)
  • Update the CSS shorthand property list (@kidonng #35636)
  • Support the maskType SVG prop (@sleitor #35921)
  • Add support for onFullscreenChange and onFullscreenError events (@chirokas #34621)
  • Include submitter in submit events (@eps1lon #35590)
  • Fire onReset when automatically resetting forms (@eps1lon #35176)
  • Use the FormData submitter parameter (@jenseng #29028)
  • Fix form status reset when component state is updated (@eps1lon #34075)
  • Batch updates from resize events until the next frame (@eps1lon #35117)

React Server

  • Add nonce to rendered import maps (@mattcosta7 #37339)
  • Add an onBrowserBailout option to observe subtrees that defer to the browser (@gnoff #37193)
  • Stop the caller's signal from retaining a finished render (@unstubbable #37315)
  • Construct the render lifetime controller only when it is needed (@unstubbable #37357)
  • Fix react-dom/server hanging on Deno (@fraidev #35235)
  • Extend stack overflow recovery to retries in SSR (@jackpope #36977)
  • Fix false-positive hydration mismatch on nonce attributes (@MaxwellCohen #37030)
  • Guard shell-error callbacks instead of nulling them out on the request (@eps1lon #36916)
  • Stop firing onAllReady after the shell errored (@eps1lon #36903)
  • Treat an incomplete tree as an error during error recovery (@acdlite #36911)
  • Fix non-script modulepreload tracking (@fallintoplace #36564)
  • Finalize postponed nextSegmentId after the prelude flush (@gaojude #36779)
  • Preserve referrerPolicy in image preload headers (@ulises-jeremias #36803)
  • Allow pending work to specialize abort reasons (@gnoff #36586)
  • Abort tasks that suspend after aborting during render (@gnoff #36585)
  • Finish abort in a scheduled task (@gnoff #36580)
  • Fix aborts during resumed rendering (@gnoff #36584)
  • Track abort state on the request (@gnoff #36583)
  • Model external work scheduling explicitly in the fb bundle (@gnoff #36576)
  • Continue reporting aborted task errors after a fatal abort (@gnoff #36575)
  • Disallow abort reentrancy (@gnoff #36574)
  • Stop transpiling computed property names (@eps1lon #36542)
  • Fix crash when capturing the callsite of a stalled use() of a rejected Flight chunk (@lubieowoce #36544)
  • Double invoke effects in Strict Mode during hydration (@eps1lon #35961)
  • Add additional task reentrancy protections in Fizz (@gnoff #36291)
  • Don't outline Suspense boundaries with suspensey CSS during shell flush (@gnoff #35824)
  • Push a stalled use() to the owner stack and debug task (@eps1lon #35226)
  • Fix useId tracking on replay (@gnoff #35518)
  • Correctly handle replaying when hydrating (@gnoff #35494)
  • Simplify the createSuspenseBoundary path (@sebmarkbage #35087)
  • Unify preamble-only fields to save a field on Suspense boundaries (@sebmarkbage #35068)
  • Unify prerender-only fields to save a field on Suspense boundaries (@sebmarkbage #35067)
  • Push halted awaits to the owner stack for late-arriving I/O info (@unstubbable #35019)
  • Include all Node.js APIs in the Bun entrypoint for react-dom/server (@RiskyMH #34193)
  • Detach a Suspense boundary after flushing its segment (@gnoff #34694)

React Server Components

  • Keep an element pending while a referenced row is resolving (@unstubbable #37542)
  • Fix RangeError from exponential debug info growth (@unstubbable #37481)
  • Abort the cache signal when debug objects are retained (@unstubbable #37342)
  • Transfer key validation of lazy nodes when they are unwrapped (@unstubbable #37258)
  • Add pending_weak to the Flight thenable protocol (@acdlite #37154)
  • Outline and dedupe repeated strings (@gaearon #37147)
  • Port Reply Server traversal guards to the Flight Client (@eps1lon #37144)
  • Define Flight chunk .then with Object.defineProperty (@eps1lon #37109)
  • Support Turbopack's experimental array format for chunks (@sampoder #37095)
  • Limit fake JSX call site stacks to 10 frames (@timneutkens #37086)
  • Improve performance when decoding Flight replies (@gnoff #37090)
  • Recognize Node 22+ V8 frames for Promise statics in debug info (@gaearon #36969)
  • Tailor the warning for binary data serialized through toJSON (Node Buffer) (@unstubbable #36873)
  • Resolve models before JSON.stringify for faster serialization (@mhart #36795)
  • Prune debug info when chunks error (@gnoff #36782)
  • Avoid main-thread stalls from large debug strings (@unstubbable #36570)
  • Fix stranded row content under Node stream backpressure (@unstubbable #36516)
  • Fix dropped FormData entries in decodeReplyFromBusboy (@unstubbable #36468)
  • Harden types and improve performance of Flight replies (@eps1lon #36425)
  • Add more cycle protections to Flight replies (@eps1lon #36236)
  • Transport AggregateError.errors (@eps1lon #36156)
  • Bail out early when a backing entry for Blob deserialization is not a Blob (@eps1lon #36055)
  • Clear chunk reason after successful module initialization (@unstubbable #36024)
  • Add support for transporting Error.cause (@eps1lon #35810)
  • Walk parsed JSON instead of using a reviver for faster RSC payload parsing (@timneutkens #35776)
  • Skip transferReferencedDebugInfo during debug info resolution (@unstubbable #35795)
  • Add unstable_allowPartialStream option to Flight Client (@unstubbable #35731)
  • Fix encodeReply for JSX with temporary references (@unstubbable #35730)
  • Fix debug channel flag in Node.js renderToPipeableStream (@feedthejim #35724)
  • Fix stack overflow in visitAsyncNode with deep async chains (@unstubbable #35612)
  • Allow Server Components to render context providers from client modules (@rickhanlonii #35675)
  • Allow overriding request.timeOrigin via options.startTime (@lubieowoce #35598)
  • Warn once if eval is disabled in the dev environment (@eps1lon #35661)
  • Restore original function name in dev server callstacks served with unsafe-eval (@eps1lon #35650)
  • Fix react-markup types for server references (@eps1lon #35634)
  • Add more DoS mitigations to Flight replies and harden Flight (@unstubbable #35632)
  • Allow cyclic references to be serialized when unwrapping lazy elements (@unstubbable #35471)
  • Improve cyclic thenable detection in Flight reply server (@cvan20191 #35369)
  • Add extra loop protection to Flight reply server (@sebmarkbage #35351)
  • Patch Promise cycles and toString on Server Functions (@sebmarkbage #35345)
  • Move react-server-dom-webpack/*.unbundled to private react-server-dom-unbundled (@eps1lon #35290)
  • Never parse then functions in Flight replies (@sebmarkbage #35289)
  • Patch Flight reply server with fixes from Flight Client (@sebmarkbage #35277)
  • Complete the list of Node.js internal Promise awaits (@eps1lon #35161)
  • Reduce risk of maximum call stack exceeded when emitting async sequences (@eps1lon #35159)
  • Fix pending chunks count for streams and async iterables in DEV (@unstubbable #35143)
  • Fix broken byte stream parsing caused by buffer detachment (@unstubbable #35127)
  • Fix hasReadable flag in Node.js clients' debug channel (@unstubbable #35039)
  • Fix debug info filtering to include later resolved I/O (@unstubbable #35036)
  • Cache the value when visiting the same I/O or Promise along different paths (@sebmarkbage #35005)
  • Clone subsequent I/O nodes when resolved more than once (@sebmarkbage #35003)
  • Fix hang after resolving cyclic references (@unstubbable #34988)
  • Allow passing DEV-only startTime as an option (@sebmarkbage #34912)
  • Ignore bound-anonymous-fn resources as they're not considered I/O (@sebmarkbage #34911)
  • Fix detached ArrayBuffer error when streaming typed arrays (@unstubbable #34849)
  • Exclude RSC stream if the stream resolves in a task (@sebmarkbage #34838)
  • Forward the current environment when forwarding I/O entries (@sebmarkbage #34836)
  • Look for moved debug info when logging component performance track (@sebmarkbage #34839)
  • Respect displayName of Promise instances on the server (@sebmarkbage #34825)
  • Avoid unnecessary indirection when serializing debug info (@unstubbable #34797)
  • Fix preload as attribute for stylesheets (@unstubbable #34760)
  • Don't serialize toJSON in debug path and omit wide arrays (@sebmarkbage #34759)
  • Add support for <Activity> (@eps1lon #34697)