When starting a new project, the real question isn't "Should I use React or Vue?" It’s something much more critical: are we building a Single-Page App (SPA), a Multi-Page App (MPA), or some hybrid?
Choosing between an SPA and an MPA is essentially a bet on where your navigation and HTML actually live. This decision dictates who controls that initial render and how much client state you'll have to manage manually. Too many teams get stuck debating frameworks when the real issue is the architecture.
In an MPA model, every URL is a document request. The server sends the HTML, and every move to a new page means loading a fresh document, the classic approach used by Rails or Laravel. An SPA, on the other hand, loads a single "shell" at the start, and then route changes are handled entirely on the client using JSON data.
The right choice depends on the level of interaction you need. If you're building something highly interactive, like a dashboard with complex filters or highly responsive panels, an SPA makes more sense because of how well it handles in-app motion. But an SPA has its downsides too; it forces you to build a complex data layer from scratch, covering everything from fetching mechanisms and cache management to handling loading spinners and error boundaries. This is exactly why tools like TanStack Query are so vital. Managing data on the client side is a massive technical undertaking.
On the other hand, MPAs excel when every URL is its own independent unit of information, like an article or a settings form. We often underestimate the power of built-in browser navigation, the back-forward cache, and the sheer ease of checking a render via "view source."
A common mistake is picking an SPA just to feel "modern." As a result, teams end up spending months re-implementing features the browser already provides for free, such as focus management, scroll position restoration, or even SEO meta tags.
Not every project needs a complex architecture. A simple MPA is often much more efficient than forcing an SPA that brings a massive amount of state management overhead. Before you pick a framework, figure out how much data dependency you actually need to manage on the client. Do you really need an app that feels like a native mobile app, or do you just need a website with smooth navigation?
Catch you on the next one.