React vs Backbone in 2025: What 15 Years of Progress Bought Us

3 min read
React vs Backbone in 2025: What 15 Years of Progress Bought Us - cover image
Summary

Put the same small feature in React and Backbone side by side and the code is about the same length. The real difference is where the complexity hides, and what that costs when things break in small and mid-sized apps.

Same Feature, Two Eras

A small demo has been making the rounds: one interactive feature written twice, once in Backbone.js, the 2010-era MVC library, and once in modern React. The two versions come out at roughly the same length and do exactly the same thing. One of them is backed by more than a decade of investment, a vast ecosystem and countless engineering hours; the other is a library many developers consider a relic.

The point of the comparison is not that React is bad. It is that, for everyday interface work, the measurable gain over fifteen years is smaller than most of us assume.

Readable Is Not the Same as Simple

React code usually looks tidier at first glance. Components read declaratively and the markup sits next to the logic. But that readability is bought with abstraction: explicit simplicity is traded for hidden machinery.

Backbone is blunt about what it does. An event fires, a handler runs, it builds some HTML and puts it into the DOM. The code is longer, but nothing happens off-screen. A junior developer can trace every step, and the mental model fits in one sentence: when this happens, do that.

React hides a great deal, and once you move past toy examples you meet bugs that only make sense if you understand its internals:

  • A form field keeps resetting. The list key was switched from a stable ID to an array index, so React treats the row as a new component, remounts it and discards its state. Or a value briefly became undefined, flipping the input between uncontrolled and controlled.
  • Data fetching loops forever. A useEffect depends on an object that is recreated on every render, so React sees a change each time and re-runs the effect. The usual cure is to scatter useMemo and useCallback around to stabilize identities, a concern that simply did not exist before.
  • A click handler reads old state. This is the stale closure problem: the function captured the value that existed when it was created, and later renders do not update it. The fixes, adding the state to a dependency list or using a functional update such as setCount(c => c + 1), both feel like workarounds.

The Price of Magic

None of these are exotic edge cases. They are routine in mid-sized applications, and debugging them requires knowing about reconciliation, render phases and how the scheduler batches and orders updates. Code can work without you knowing why, which is pleasant right up until it stops working.

A common line in the React community is that you only truly understand React after writing a small version of it yourself. That is probably true, and it is also a little alarming. Building a password-strength checker should not require knowledge of virtual DOM diffing, update priorities and concurrent rendering.

Backbone can be tedious, but it does not mislead you. jQuery-style code is hackable: open the source and you find thin wrappers over DOM APIs you already know. React's layers of abstraction make that kind of direct inspection much harder.

Where Frontend Could Go Next

The underlying problem has not changed: events plus state produce the interface. Both libraries solve exactly that, in different ways.

For very large applications with a thousand components on one screen, React's complexity may well pay for itself. The open question is the other ninety-nine percent of projects, small and medium apps that just need to work and gain nothing from the magic.

Could there be a model that feels as solid and predictable as working with the DOM directly, yet is pleasant to write? Something as hackable as Backbone and jQuery, where opening DevTools is enough to see what is going on? The formula is probably already known: events and state drive the UI directly. What is missing is a design that makes that formula fluent for everyday apps without forcing them to carry the abstraction debt that only the largest applications actually need.

Weekly Newsletter

This week’s posts, in your inbox every Monday

A short summary of the posts published that week on AI, Claude Code, MCP and web development. No new posts, no email.

  • One email a week
  • No ads
  • One-click unsubscribe