React Won by Default – And It's Killing Frontend Innovation
React-by-default has hidden costs. Here's a case for making deliberate choices to select the right framework for the job.
React Won by Default – And It’s Killing Frontend Innovation
React is no longer winning by technical merit. Today it is winning by default. That default is now slowing innovation across the frontend ecosystem.
When teams need a new frontend, the conversation rarely starts with “What are the constraints and which tool best fits them?” It often starts with “Let’s use React; everyone knows React.” That reflex creates a self-perpetuating cycle where network effects, rather than technical fit, decide architecture.
Meanwhile, frameworks with novel architectural approaches struggle for adoption. Svelte uses runtime signals with compile-time optimizations for smaller bundles. Solid delivers fine-grained reactivity without virtual-DOM tax. Qwik achieves instant startup via resumability. These approaches can outperform React’s model in common scenarios, but they rarely get a fair evaluation because React is chosen by default.
React is excellent at many things. The problem isn’t React itself, it’s the React-by-default mindset.
The Innovation Ceiling
React’s technical foundations explain some of today’s friction. The virtual DOM was a clever solution for 2013’s problems, but as Rich Harris outlined in “Virtual DOM is pure overhead”, it introduces work modern compilers can often avoid.
Hooks addressed class component pain but introduced new kinds of complexity: dependency arrays, stale closures, and misused effects. Even React’s own docs emphasize restraint: “You Might Not Need an Effect”. Server Components reduce client-side JavaScript and enable server-only data access, but add architectural complexity and new failure modes.
The React Compiler is a smart solution that automates patterns like useMemo
/useCallback
. Its existence is also a signal: we’re optimizing around constraints baked into the model.
React 19.2, released October 2025, continues this pattern. The new useEffectEvent
hook exists specifically to solve dependency array problems with effects. This is a patch for complexity that hooks themselves created. Frameworks like Svelte and Solid have similar untrack features, but they use automatic dependency tracking by default, requiring untrack only in edge cases. React requires manual dependency arrays for every effect, then adds useEffectEvent
to work around the limitations of that model.
The same release introduces an <Activity />
component for managing visible/hidden app states and new partial pre-rendering APIs. Each addition increases the API surface developers must master while alternatives achieve similar outcomes with simpler primitives.
Contrast this with alternative approaches: Svelte 5’s Runes use runtime signals for fine-grained reactivity; Solid’s fine-grained reactivity updates exactly what changed; Qwik’s resumability eliminates traditional hydration. These aren’t incremental tweaks to React’s model; they’re different models with different ceilings.
Innovation without adoption doesn’t change outcomes. Adoption can’t happen when the choice is made by reflex.
The Technical Debt We’re All Carrying
Defaulting to React often ships a runtime and reconciliation cost we no longer question. Even when it’s fast enough, the ceiling is lower than compile-time or fine-grained models. Developer time is spent managing re-renders, effect dependencies, and hydration boundaries instead of shipping value. The broader lesson from performance research is consistent: JavaScript is expensive on the critical path (The Cost of JavaScript).
Beyond performance, we’ve centered mental models around “React patterns” instead of web fundamentals, reducing portability of skills and making architectural inertia more likely. The loss isn’t just performance, it’s opportunity cost when better-fit alternatives are never evaluated.
The Frameworks Being Suffocated
Svelte: Signals with Compile-Time Optimization
Svelte 5 combines runtime signals for fine-grained reactivity with aggressive compile-time optimizations. No virtual DOM, smaller runtime than React. Components compile to efficient, targeted DOM operations. The mental model aligns with web fundamentals.
But “not enough jobs” keeps Svelte adoption artificially low despite its technical strengths for many use cases. Real-world examples, like The Guardian’s adoption of Svelte for their frontend, demonstrate measurable gains in performance and developer productivity, with reported reductions in bundle sizes and faster load times. For instance, as detailed in Wired’s article on Svelte, developer Shawn Wang (@swyx on X/Twitter) reduced his site’s size from 187KB in React to just 9KB in Svelte by leveraging its compile-time optimizations for smaller bundles. This leads to faster, more efficient apps especially on slow connections.
Solid: The Reactive Primitive Approach
Solid delivers fine-grained reactivity with JSX familiarity. Updates flow through signals directly to affected DOM nodes, bypassing reconciliation bottlenecks. Strong performance characteristics, limited mindshare. As outlined in Solid’s comparison guide, this approach enables more efficient updates than React’s virtual DOM, with precise reactivity that minimizes unnecessary work and improves developer experience through simpler state management.
While prominent case studies are scarcer than for more established frameworks, this is largely due to Solid’s lower adoption. Yet anecdotal reports from early adopters suggest similar transformative gains in update efficiency and code simplicity, waiting to be scaled and shared as more teams experiment.
Qwik: The Resumability Innovation
Qwik uses resumability instead of hydration, enabling instant startup by loading only what the current interaction needs. This requires all application state to be serializable, which imposes architectural constraints but delivers measurable performance gains. Ideal for content-heavy sites, slow networks, or mobile-first applications. According to Qwik’s Think Qwik guide, this is achieved through progressive loading and serializing both state and code. Apps can thus resume execution instantly without heavy client-side bootstrapping, resulting in superior scalability and reduced initial load times compared to traditional frameworks.
Success stories for Qwik may be less visible simply because fewer teams have broken from defaults to try it. But those who have report dramatic improvements in startup times and resource efficiency, indicating a wealth of untapped potential if adoption grows.
All three under-adopted not for lack of merit, but because the default choice blocks trying them out.
Furthermore, React’s API surface area is notably larger and more complex than its alternatives, encompassing concepts like hooks, context, reducers, and memoization patterns that require careful management to avoid pitfalls. This expansive API contributes to higher cognitive load for developers, often leading to bugs from misunderstood dependencies or over-engineering. For example, in Cloudflare’s September 12, 2025 outage, a useEffect hook with a problematic dependency array triggered repeated API calls, overwhelming their Tenant Service and causing widespread failures. In contrast, frameworks like Svelte, Solid, and Qwik feature smaller, more focused APIs that emphasize simplicity and web fundamentals, reducing the mental overhead and making them easier to master and maintain.
The Network Effect Prison
React’s dominance creates self-reinforcing barriers. Job postings ask for “React developers” rather than “frontend engineers,” limiting skill diversity. Component libraries and team muscle memory create institutional inertia.
Risk-averse leaders choose the “safe” option. Schools teach what jobs ask for. The cycle continues independent of technical merit.
That’s not healthy competition; it’s ecosystem capture by default.
Breaking the Network Effect
Escaping requires deliberate action at multiple levels. Technical leaders should choose based on constraints and merits, not momentum. Companies can allocate a small innovation budget to trying alternatives. Developers can upskill beyond a single mental model.
Educators can teach framework-agnostic concepts alongside specific tools. Open source contributors can help alternative ecosystems mature.
Change won’t happen automatically. It requires conscious choice.
Framework Evaluation Checklist
To make deliberate choices, use this simple checklist when starting a new project:
- Assess Performance Needs: Evaluate metrics like startup time, update efficiency, and bundle size. Prioritize frameworks with compile-time optimizations if speed is critical.
- Team Skills and Learning Curve: Consider existing expertise but factor in migration paths; many alternatives offer gentle ramps (e.g., Solid’s JSX compatibility with React).
- Scaling and Cost of Ownership: Calculate long-term costs, including maintenance, dependency management, and tech debt. Alternatives often reduce runtime overhead, lowering hosting costs and improving scalability.
- Ecosystem Fit: Balance maturity with innovation; pilot in non-critical areas to test migration feasibility and ROI.
The Standard Counter‑Arguments
“But ecosystem maturity!” Maturity is valuable, and can also entrench inertia. Age isn’t the same as fitness for today’s constraints.
Additionally, a mature ecosystem often means heavy reliance on third-party packages, which can introduce maintenance burdens like keeping dependencies up-to-date, dealing with security vulnerabilities, and bloating bundles with unused code. While essential in some cases, this flexibility can lead to over-dependence; custom solutions tailored to specific needs are often leaner and more maintainable in the long run. Smaller ecosystems in alternative frameworks encourage building from fundamentals, fostering deeper understanding and less technical debt. Moreover, with AI coding assistants now able to generate precise, custom functions on demand, the barrier to creating bespoke utilities has lowered dramatically. This makes it feasible to avoid generic libraries like lodash or date libraries like Moment or date-fns entirely in favor of lightweight, app-specific implementations.
“But hiring!” Hiring follows demand. You can de‑risk by piloting alternatives in non‑critical paths, then hiring for fundamentals plus on‑the‑job training.
“But component libraries!” Component libraries are bloat, useful primarily when delivery speed trumps everything else. Building components around your application’s specific needs creates leaner solutions because you’re not shipping code for problems you don’t have. Framework-agnostic design systems and Web Components reduce lock-in while preserving velocity when you do need shared components.
“But stability!” React’s evolution from classes to hooks to Server Components to React 19.2’s useEffectEvent
and <Activity />
component demonstrates constant churn, not stability. Alternative frameworks often provide more consistent APIs.
“But proven at scale!” jQuery was proven at scale too. Past success doesn’t guarantee future relevance.
The Broader Ecosystem Harm
Monoculture slows web evolution when one framework’s constraints become de facto limits. Talent spends cycles solving framework-specific issues rather than pushing the platform forward. Investment follows incumbents regardless of technical merit.
Curricula optimize for immediate employability over fundamentals, creating framework-specific rather than transferable skills. Platform improvements get delayed because “React can handle it” becomes a default answer.
The entire ecosystem suffers when diversity disappears.
The Garden We Could Grow
Healthy ecosystems require diversity, not monocultures. Innovation emerges when different approaches compete and cross-pollinate. Developers grow by learning multiple mental models. The platform improves when several frameworks push different boundaries.
Betting everything on one model creates a single point of failure. What happens if it hits hard limits? What opportunities are we missing by not exploring alternatives?
It’s time to choose frameworks based on constraints and merit rather than momentum. Your next project deserves better than React-by-default. The ecosystem deserves the innovation only diversity can provide.
Stop planting the same seed by default. The garden we could cultivate through diverse framework exploration would be more resilient and more innovative than the monoculture we’ve drifted into.
The choice is ours to make.