<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel><title>React.js — Trust is earned, not given</title><link>https://www.bobhuang.com/series/react-js/</link><description>React through the years it changed shape: the concurrent root and StrictMode, Suspense and transitions, Server Components, Server Actions, Context without re-render storms, the React 19 action hooks, the React Compiler, and offscreen Activity.</description><language>en</language><lastBuildDate>15 Sep 2026 12:00:00 GMT</lastBuildDate><atom:link href="https://www.bobhuang.com/series/react-js/feed.xml" rel="self" type="application/rss+xml"/><item><title>React.js, part 20: where React is heading — the Activity component and rendering what is offscreen</title><link>https://www.bobhuang.com/blog/1005/react-activity-component-future/</link><guid>https://www.bobhuang.com/blog/1005/react-activity-component-future/</guid><pubDate>15 Sep 2026 12:00:00 GMT</pubDate><description>The last thread to pull is the one that ties the concurrent work together: React is learning to keep a tree mounted while hiding it, instead of destroying and…</description></item><item><title>React.js, part 19: the React Compiler in production — the eslint plugin, bailouts, and measuring the win</title><link>https://www.bobhuang.com/blog/1004/react-compiler-in-production/</link><guid>https://www.bobhuang.com/blog/1004/react-compiler-in-production/</guid><pubDate>09 Jun 2026 12:00:00 GMT</pubDate><description>Turning on an optimizing compiler is the kind of change that either does nothing or does something surprising. Part 19 is the production checklist for the…</description></item><item><title>React.js, part 18: testing modern React — React Testing Library, Vitest, and queries that survive refactors</title><link>https://www.bobhuang.com/blog/1003/react-testing-library-vitest/</link><guid>https://www.bobhuang.com/blog/1003/react-testing-library-vitest/</guid><pubDate>14 Apr 2026 12:00:00 GMT</pubDate><description>Modern React made a lot of old testing advice wrong: act warnings, shallow rendering, and snapshot-everything all aged badly once components suspended…</description></item><item><title>React.js, part 17: startTransition with async functions and the useEffectEvent escape hatch</title><link>https://www.bobhuang.com/blog/1002/react-starttransition-async-useeffectevent/</link><guid>https://www.bobhuang.com/blog/1002/react-starttransition-async-useeffectevent/</guid><pubDate>24 Feb 2026 12:00:00 GMT</pubDate><description>Two ergonomic gaps closed by the mid-2020s: transitions that wrap asynchronous work, and a principled way for an effect to read the latest value without…</description></item><item><title>React.js, part 16: Suspense boundaries in production — streaming, nested fallbacks, and error recovery</title><link>https://www.bobhuang.com/blog/1001/react-suspense-boundaries-production/</link><guid>https://www.bobhuang.com/blog/1001/react-suspense-boundaries-production/</guid><pubDate>13 Jan 2026 12:00:00 GMT</pubDate><description>Placing one &lt;Suspense&gt; at the top of the app is the demo version. In production the interesting work is deciding where boundaries go, so that the page streams…</description></item><item><title>React.js, part 15: document metadata and stylesheets in React 19 — hoisting without a helmet library</title><link>https://www.bobhuang.com/blog/1000/react-19-document-metadata/</link><guid>https://www.bobhuang.com/blog/1000/react-19-document-metadata/</guid><pubDate>30 Sep 2025 12:00:00 GMT</pubDate><description>Every React app that cared about SEO shipped a helper library whose job was to move &lt;title&gt; and &lt;meta&gt; tags from wherever a component happened to render into…</description></item><item><title>React.js, part 14: ref as a prop, ref cleanup, and the refs you should stop writing</title><link>https://www.bobhuang.com/blog/999/react-refs-as-props-cleanup/</link><guid>https://www.bobhuang.com/blog/999/react-refs-as-props-cleanup/</guid><pubDate>15 Jul 2025 12:00:00 GMT</pubDate><description>For years passing a ref through a component meant wrapping it in forwardRef — a ceremony with no equivalent for any other prop. React 19 removed it: ref is now…</description></item><item><title>React.js, part 13: useFormStatus and pending states — a submit button that cannot double-submit</title><link>https://www.bobhuang.com/blog/998/react-useformstatus-pending/</link><guid>https://www.bobhuang.com/blog/998/react-useformstatus-pending/</guid><pubDate>22 Apr 2025 12:00:00 GMT</pubDate><description>Double submissions are the canonical web bug: a slow request, an impatient click, two orders. The traditional defenses — a disabled flag set in one handler and…</description></item><item><title>React.js, part 12: React 19 Actions and useActionState — the form lifecycle, finally built in</title><link>https://www.bobhuang.com/blog/997/react-19-actions-useactionstate/</link><guid>https://www.bobhuang.com/blog/997/react-19-actions-useactionstate/</guid><pubDate>04 Feb 2025 12:00:00 GMT</pubDate><description>By 2025 the biggest React releases were no longer about new rendering features but about finishing half-built abstractions. React 19 completed the form story…</description></item><item><title>React.js, part 11: useOptimistic — instant UI on top of a slow server</title><link>https://www.bobhuang.com/blog/996/react-useoptimistic/</link><guid>https://www.bobhuang.com/blog/996/react-useoptimistic/</guid><pubDate>12 Nov 2024 12:00:00 GMT</pubDate><description>The fastest interface is the one that never waits. Optimistic UI has always meant the same thing — show the expected result immediately, reconcile when the…</description></item><item><title>React.js, part 10: the React Compiler — what it memoizes, and when to stop hand-writing useMemo</title><link>https://www.bobhuang.com/blog/995/react-compiler-memoization/</link><guid>https://www.bobhuang.com/blog/995/react-compiler-memoization/</guid><pubDate>20 Aug 2024 12:00:00 GMT</pubDate><description>For a decade the performance advice was "wrap it in useMemo", and for a decade developers got the dependency arrays subtly wrong. The React Compiler is the…</description></item><item><title>React.js, part 9: Context without the re-render storm — splitting providers and stabilizing values</title><link>https://www.bobhuang.com/blog/994/react-context-performance/</link><guid>https://www.bobhuang.com/blog/994/react-context-performance/</guid><pubDate>07 May 2024 12:00:00 GMT</pubDate><description>Context is the first state-sharing tool everyone reaches for and one of the most common performance regrets. The failure mode is predictable: one big provider…</description></item><item><title>React.js, part 8: Server Actions — forms that talk to the server without a fetch</title><link>https://www.bobhuang.com/blog/993/react-server-actions-forms/</link><guid>https://www.bobhuang.com/blog/993/react-server-actions-forms/</guid><pubDate>13 Feb 2024 12:00:00 GMT</pubDate><description>A form submission used to be a small ceremony: prevent default, assemble a body, fetch, parse errors, branch on status, set state for each. Server Actions…</description></item><item><title>React.js, part 7: useDeferredValue and useId — the quiet hooks that fixed real bugs</title><link>https://www.bobhuang.com/blog/992/react-usedeferredvalue-useid/</link><guid>https://www.bobhuang.com/blog/992/react-usedeferredvalue-useid/</guid><pubDate>05 Dec 2023 12:00:00 GMT</pubDate><description>Not every useful hook arrives with a keynote. Two of them quietly removed whole classes of everyday problems: useDeferredValue gave back the responsive list…</description></item><item><title>React.js, part 6: useSyncExternalStore — connecting React to the world outside it</title><link>https://www.bobhuang.com/blog/991/react-usesyncexternalstore/</link><guid>https://www.bobhuang.com/blog/991/react-usesyncexternalstore/</guid><pubDate>26 Sep 2023 12:00:00 GMT</pubDate><description>Sooner or later a component must render data that React does not own: a browser API, a WebSocket, a global store, matchMedia, navigator.onLine. The old answer…</description></item><item><title>React.js, part 5: the use() hook and reading a promise in render</title><link>https://www.bobhuang.com/blog/990/react-use-hook-promises/</link><guid>https://www.bobhuang.com/blog/990/react-use-hook-promises/</guid><pubDate>20 Jun 2023 12:00:00 GMT</pubDate><description>For years the rule was absolute: data fetching belongs in an effect, render must be pure. The use hook bends that rule in a controlled way — it lets a client…</description></item><item><title>React.js, part 4: Server Components arrive — the mental model behind the App Router</title><link>https://www.bobhuang.com/blog/989/react-server-components-mental-model/</link><guid>https://www.bobhuang.com/blog/989/react-server-components-mental-model/</guid><pubDate>14 Mar 2023 12:00:00 GMT</pubDate><description>React Server Components (RSC) are less a feature than a change of subject. Until 2023 a React component was a function that ran in the browser. With RSC, a…</description></item><item><title>React.js, part 3: Suspense and useTransition — keeping the UI responsive while data loads</title><link>https://www.bobhuang.com/blog/988/react-suspense-usetransition/</link><guid>https://www.bobhuang.com/blog/988/react-suspense-usetransition/</guid><pubDate>06 Dec 2022 12:00:00 GMT</pubDate><description>Two concurrent features do most of the work in a modern React app: Suspense (which declares what to show while something is pending) and useTransition (which…</description></item><item><title>React.js, part 2: why your effect runs twice in development (and what StrictMode is really telling you)</title><link>https://www.bobhuang.com/blog/987/react-strictmode-double-effects/</link><guid>https://www.bobhuang.com/blog/987/react-strictmode-double-effects/</guid><pubDate>09 Aug 2022 12:00:00 GMT</pubDate><description>Every developer meets it the same way: a console.log inside useEffect fires twice, or a websocket opens two connections, and the first instinct is a bug in…</description></item><item><title>React.js, part 1: the React 18 concurrent root — createRoot, automatic batching, and what actually changed</title><link>https://www.bobhuang.com/blog/986/react-18-concurrent-root/</link><guid>https://www.bobhuang.com/blog/986/react-18-concurrent-root/</guid><pubDate>12 Apr 2022 12:00:00 GMT</pubDate><description>React 18 did not look like a big release from the outside — the component API barely moved — but under the surface it replaced the renderer's core with a…</description></item></channel></rss>