www.arjunp.pro
The Case Against SPAs in 2026 | Arjun.
Excerpt
People find this funny. A frontend engineer's portfolio with no frontend framework. But after years of building SPAs, I think the funnier thing is how rarely we ask whether we actually need one. ... At some point in the last decade, SPAs stopped being a technical choice and became the default. Junior devs spin up Next.js for a three-page portfolio. Agencies scaffold React apps for marketing sites. I've seen Gatsby projects for restaurant menus. A landing page that should be 4 KB of HTML ships as a 300 KB JavaScript bundle with a loading spinner. … ## Problems you didn't have before SPAs create entire categories of problems that plain websites don't have. Client-side routing means managing browser history and the back button. State management means context, reducers, or a store. Code splitting means loading states for every route. SSR means hydration mismatches that only reproduce in production and make you question your career choices. I deal with all of this at work. It's worth it there. But when the thing you're building is a portfolio or a blog - content that doesn't change between requests - you've imported all that complexity to serve static text. … If your app has state that changes frequently based on user interaction. If users expect instant navigation and optimistic updates. If twenty developers need to build consistent UIs from a shared component library. If your content comes from APIs and changes hourly. Those are real SPA problems with real SPA solutions. The mistake isn't using React for a SaaS dashboard. It's using React for a portfolio. It's reaching for the same tool regardless of the problem because it's the tool you know.
Related Pain Points
Performance Optimization and Initial Load Times
8SPAs often ship large JavaScript bundles causing slow initial load times. 84% of users expect sub-3-second loads, and delays reduce conversions (1-second delay = 7% conversion drop, 3+ seconds = 40-53% bounce rate). Initial page loads can be 300+ KB for content that should be 4 KB.
Hydration mismatches and runtime instability in Next.js 16
7Next.js 16 introduces hydration errors where client-side reconciliation doesn't match server-rendered HTML, causing flicker, broken interactivity, and console warnings. This issue is particularly prevalent with the new Server Component paradigm.
Client-Side Routing Complexity
6Managing browser history, back button behavior, and URL transitions between pages creates messy routing logic. Routing complexities introduce loading states for every route and require specialized libraries to manage navigation efficiently.