Going Full Circle: From JavaScript Frameworks Back to Server-Side Rendering
The Evolution of Web Apps and Why Server-Side Rendering Still Wins

- Jay McBride
- 6 min read

Web 1.0: Simple, Static, Server-Rendered Pages
Remember the early days of the internet? When websites looked like glorified Word docs and loaded in the blink of an eye? That was Web 1.0. Back then, everything was server-rendered. Click a link, and the server sent a brand-new HTML page. No fancy JavaScript, no dynamic routing—just pure, simple content.
Web 2.0 and the Dynamic Server Era
Then came Web 2.0. Dynamic content, user sessions, databases! Suddenly, we had PHP, ASP.NET, and early Ruby apps serving up data-driven pages. This era was all about the server doing the heavy lifting—building HTML on the fly based on what the user needed.
Classic Full-Stack Frameworks (Rails, Laravel, .NET MVC)
Frameworks like Ruby on Rails, Laravel, and .NET MVC exploded in popularity because they made full-stack development not just possible—but enjoyable. They handled the backend, templating, routing, and even the front-end behaviors with helpers like form_with
or @Html.ActionLink
.
The JavaScript Revolution
Enter the SPA (Single Page Application)
Then came the JavaScript gold rush. Developers wanted snappier experiences, fewer full-page reloads, and instant transitions. SPAs (Single Page Applications) stepped in. Frameworks like AngularJS, Ember, and eventually React and Vue became the new shiny tools.
The React/Angular/Vue Boom
These tools were game-changers—for a while. The frontend became “the app,” fetching data from REST APIs. The backend? It was now a glorified JSON vending machine. This separation gave rise to microservices, GraphQL, and the JAMstack movement.
Why Developers Jumped Ship from Server-Side Rendering
Why did everyone move away from server rendering? One word: control. JavaScript gave devs full control over UX, components, and state. But like all revolutions, it got… out of hand.
The Cracks Begin to Show
Complexity Overload
Suddenly, shipping a simple blog meant installing 3,000 npm packages, configuring Webpack, transpiling JSX, and managing hydration. Want a contact form? That’s a whole React component with hooks, refs, and validation libraries. For what? A POST request.
JS Bloat, Performance, and SEO Nightmares
SPAs started to suffer. They were heavy, slow, and relied on too much JavaScript. SEO? A disaster without server-side rendering or pre-rendering. The “time to first meaningful paint” often took seconds. Entire dev teams were being hired just to optimize bundles.
The DX vs UX Trade-off
JavaScript frameworks prioritized developer experience (DX). But often at the cost of user experience (UX). A fast, responsive frontend is great—until the JavaScript fails, loads late, or blocks interaction entirely.
Coming Full Circle — The Return to the Server
SSR Reborn: Next.js, Nuxt, Remix, and Astro
Modern frameworks started realizing: maybe server-side rendering wasn’t so bad. Tools like Next.js, Nuxt, and Remix began rendering content on the server again—for speed, SEO, and simplicity.
The Rise of HTMX, Turbo, and Simpler JS
And then something even cooler happened: devs rediscovered the old tools. Projects like HTMX, Stimulus, and Hotwire/Turbo gave us client-side interactivity without a full-blown JS framework. Want to swap a div? Just send a partial. It’s 2007 all over again—and it’s amazing.
Rediscovering the Joy of Full-Stack Frameworks
Turns out, Rails and Laravel already did this. They were just waiting for the trend to catch back up. With tools like Turbo and Livewire, these frameworks feel modern again—without sacrificing developer sanity.
Why Frameworks Like Rails, Laravel, and .NET MVC Were Enough All Along
Batteries-Included Simplicity
These frameworks give you everything—routing, ORM, templating, validations—out of the box. No need to stitch 20 packages together. Just scaffold and go.
Convention Over Configuration
You don’t need to decide how to structure your app. Rails, Laravel, and .NET have opinions. And that’s a good thing. It means less thinking, less boilerplate, and faster development.
Developer Happiness and Sustainability
Burnout is real. And nothing kills joy faster than wrestling with build pipelines or debugging hydration errors. Full-stack frameworks are still around because they’ve always been built with developer happiness in mind.
The Modern SSR Stack: Best of Both Worlds
Progressive Enhancement and Turbolinks
With Turbolinks (now Turbo) and Livewire or Stimulus, you can build fast, responsive apps without rewriting your backend in JavaScript. You enhance the UX where it matters, not everywhere.
Handling Interactivity Without Overengineering
Need a modal or dropdown? Vanilla JS or Alpine.js gets it done. No need to ship 500kb of React just for interactivity. Keep it small. Keep it sane.
Performance and SEO Gains
When your server returns real HTML, your site loads faster, works without JS, and Google loves it. No extra hydration, no weird crawling issues. Just clean, crawlable, semantic content.
When to Use What
Use SPA/React When…
You’re building a real-time dashboard.
Your app is 95% client interactions (think Google Docs).
You need granular component-level control.
Use SSR/Traditional Stack When…
You’re building a content site, blog, or eCommerce store.
SEO and accessibility matter.
You want to move fast and keep complexity low.
Evaluate Based on the Problem, Not the Hype
Tools are tools. React isn’t bad. Neither is Rails. But if you’re reaching for a sledgehammer to hang a picture frame, you’re gonna have a bad time. Choose wisely.
The Future Is Full-Stack (Again)
Simple is the New Smart
In 2025 and beyond, devs are realizing: maybe we overcomplicated things. Maybe simplicity is the true innovation.
Why Full-Stack Legends Are Thriving Again
Rails, Laravel, and .NET MVC never went away. But now? They’re having a renaissance. Developers are returning to what works—and finally appreciating it.
Lessons from 15 Years of Web App Evolution
We’ve come full circle. From servers to clients… and now, back again. Not because of nostalgia, but because of practicality. Sometimes, what we had all along was already good enough.
Conclusion
JavaScript frameworks aren’t dead—but their dominance is being questioned. As web dev matures, we’re realizing that complexity for complexity’s sake is a trap. You don’t always need a client-side app. You don’t always need React. What you need is to solve problems well—and often, that means going back to the server. Full circle, full stack, full speed ahead.
FAQs
Is server-side rendering better for SEO?
Yes. Since the content is rendered on the server before reaching the browser, search engines can crawl and index it more reliably than with client-rendered SPAs.
Why are developers moving away from SPAs?
Because SPAs introduce complexity, larger bundle sizes, and often poor SEO and performance. Developers are prioritizing simplicity and better user experience again.
What’s the difference between SSR and static site generation?
SSR renders pages on each request, while SSG (like in Astro or Hugo) pre-renders pages at build time. SSR is dynamic; SSG is fast and great for mostly static content.
Can Rails and Laravel compete with modern JS frameworks?
Absolutely. With tools like Turbo, Livewire, and Stimulus, they offer modern interactivity while retaining the productivity and power of full-stack development.
What are alternatives to React for small projects?
Consider HTMX, Alpine.js, Stimulus, or even going fully server-rendered with Turbo. For many use cases, they’re faster to build and maintain—and more than enough.