How components without any client JavaScript are meant to work, and what is already usable in practice today
Vue Server Components are still an experimental concept describing components that are fully rendered on the server and ship no JavaScript of their own to the client at all, not even for hydration. This article places the concept in context, distinguishes it from classic SSR, covers the current development status, and compares the idea to the already production-used React Server Components.
Table of Contents
- 1. What Vue Server Components describe as a concept
- 2. The difference from classic SSR with hydration
- 3. A practical precursor that already works today
- 4. Interactive islands inside server-rendered areas
- 5. Current development status inside the Vue core team
- 6. Comparison to the React Server Components concept
- 7. An honest maturity assessment for production use
- 8. What Nuxt server-only components already deliver today
- 9. Outlook and a concrete recommendation
- 10. Summary
- 11. FAQ
1. What Vue Server Components describe as a concept
The core idea behind server components is a third category alongside classic client-side and classic SSR components: a component that runs exclusively on the server, sends its finished output to the client as a serialized description, and contributes no JavaScript of its own to the shipped bundle at all. The browser therefore does not need to load, parse, or execute any code for that component, it merely displays the already finished result.
That is a fundamentally different approach from today's SSR components, where the server does pre-render HTML for the first page load, but the entire component code is still sent to the client so it can make the page interactive afterward. Server components in the narrow sense aim to skip exactly that second step entirely for components that never needed client interactivity in the first place, noticeably reducing the amount of JavaScript shipped.
2. The difference from classic SSR with hydration
Classic server-side rendering solves a pure delivery problem: the server produces finished HTML on the first request, so the user sees content right away instead of staring at an empty document, while the full JavaScript bundle loads in the background. Once that bundle is fully loaded, Vue takes control of the already present HTML through hydration, attaches event listeners, and makes the page interactive, which requires the entire component tree, including its rendering logic, to be present on the client.
True server components skip this hydration step for exactly the parts marked as pure server components, since no client interactivity is meant to happen there anyway. For those parts, the client only receives the serialized rendering result, inserted directly into the DOM, while classic client bundle plus hydration remains necessary only for genuinely interactive child components, such as an add-to-cart button.
3. A practical precursor that already works today
While the general server components idea in Vue core is still experimental, Nuxt already offers a usable, if more limited, version of the same core principle today through so-called server-only components, recognizable by the .server.vue file extension. Such a component is rendered exclusively on the server through the internal NuxtIsland mechanism and delivers only finished HTML to the client, with no JavaScript share of its own in the shipped bundle at all.
The snippet below shows such a component that loads and renders reviews for a product on the server. No additional JavaScript needs to load on the client for this component, this pattern is technically production-ready already today, even though it conceptually covers only a subset of what the broader Vue-core idea for server components ultimately aims for.
<!-- components/ProductReviews.server.vue -->
<script setup lang="ts">
interface Props {
productId: string
}
const props = defineProps<Props>()
const { data: reviews } = await useAsyncData(
`reviews-${props.productId}`,
() => $fetch(`/api/products/${props.productId}/reviews`)
)
</script>
<template>
<section>
<h3>Customer Reviews</h3>
<ul>
<li v-for="review in reviews" :key="review.id">
{{ review.author }}: {{ review.rating }}/5
</li>
</ul>
</section>
</template>
4. Interactive islands inside server-rendered areas
Both the Nuxt precursor and the broader Vue-core concept allow purely server-rendered areas to still contain small, deliberately interactive child components, similar to the islands principle known from Astro. A product review section, for example, could be fully server-rendered, while a single sort dropdown inside that section is embedded as an ordinary, client-interactive component, hydrated normally and shipped with its own JavaScript.
This combination makes it possible to deliver the large, mostly static part of a page with no client JavaScript at all, while exactly the small spots where interaction genuinely needs to happen in the browser keep the full Vue feature set. The result is much finer control over where JavaScript is actually needed on the client, instead of the previous all-or-nothing decision per page.
5. Current development status inside the Vue core team
The general server components concept for Vue is currently being worked out through RFC discussions within the Vue core team and is closely tied to the parallel work on Vapor Mode, an alternative compiler output format that fundamentally does away with today's virtual DOM. Both efforts share technical foundations but are distinguishable projects with their own timelines, so the server components concept cannot simply be equated with the progress of Vapor Mode.
Before a stable, officially documented API exists in Vue itself, further RFC iterations are still to be expected, and public statements from the core team suggest that fundamental questions around serialization, interplay with existing reactivity primitives, and build tooling integration still need to be resolved before a production-ready API design is settled.
6. Comparison to the React Server Components concept
React Server Components, or RSC for short, pursue the same core idea and are considerably further along in the React ecosystem: through the Next.js App Router they have already been usable in production for some time, with a clear convention between server and client components via the 'use client' directive, plus mature tooling for serialization and streaming from server to client components.
Vue is still at the beginning of a comparable path in this respect, but benefits from the experience already gathered in the React ecosystem, both good ideas and pitfalls encountered there, such as the initially confusing boundary between server and client components for many developers. Whether Vue ends up with a very similar or a deliberately different solution remains an open question at this point.
7. An honest maturity assessment for production use
For production use in a real project, the general Vue server components concept is clearly not ready at this point: there is neither a stable, officially documented API in Vue itself, nor any guarantee that details will not still change fundamentally before a final version. Anyone wanting to rely on this pattern in production today should instead reach for the already mentioned Nuxt server-only components, which are technically more narrowly scoped but stable and production-tested.
It is still worth keeping an eye on the Vue team's RFC discussions and keeping your project's architecture flexible enough that a later switch to a more mature, general solution does not require a full rewrite, for example by clearly documenting which components are already purely server-side today and which deliberately remain client-interactive.
8. What Nuxt server-only components already deliver today
Nuxt island components with the .server.vue extension already cover a large part of what many projects would actually want server components for: purely informational areas such as product reviews, static recommendation lists, or footer content can be rendered fully server-side, with no JavaScript ever sent to the client for those areas, and without waiting for a still nonexistent, experimental Vue-core API.
The most important conceptual difference from the general Vue-core idea is that Nuxt island components technically work through a separate rendering call and their own slot-based embedding model, while the long-term Vue-core goal aims for deeper, more seamless integration directly into the regular component tree. For the vast majority of practical use cases, however, that difference is barely noticeable day to day.
9. Outlook and a concrete recommendation
For teams wanting to benefit from a reduced amount of client JavaScript today already, the pragmatic recommendation is clear: use Nuxt server-only components in production for purely presentational, non-interactive areas, while genuine interactivity stays in ordinary, client-capable components. That split already largely matches the mental model that the general server components concept promotes as well.
Going forward, it is worth periodically checking the Vue team's official RFC repositories and the release notes of upcoming Vue minor versions, since the topic keeps evolving alongside Vapor Mode. Anyone who already cleanly separates their own component architecture into clearly server-side and clearly client-interactive parts today is well prepared for a later switch to a more mature, general API.
| Approach | Client JS for the component | Hydration needed | Maturity |
|---|---|---|---|
| Classic SSR | Full component bundle | Yes, full hydration | Production-ready, the standard |
| Nuxt *.server.vue (island) | None for this component | No, static HTML only | Production-ready in Nuxt |
| Vue Server Components (RFC) | None for server-only parts | Only for interactive islands | Experimental, no stable API |
| React Server Components | None for server components | Only at client component boundaries | Production-ready in the Next.js App Router |
Mironsoft
Vue architecture, Composition API, and Nuxt performance
Vue applications that don't get more complicated with every feature?
We review existing Vue and Nuxt projects for unstructured composables, unnecessary reactivity, and bloated bundles, then build an architecture that absorbs new features without making the codebase harder to follow.
Architecture Review
Checking composables, state management, and component structure for maintainability.
Performance Audit
Systematically optimizing reactivity overhead, bundle size, and Nuxt rendering strategy.
Nuxt Integration
Building robust, type-safe SSR/SSG setup and API integration.
10. Summary
Vue Server Components at a Glance
Concept
Components rendered on the server that ship no client JS of their own at all.
Status in Vue
Still experimental, RFC discussions in the core team, no stable API.
Practical alternative
Nuxt server-only components (*.server.vue) are already production-ready today.
Comparison
React Server Components are already used in production in the Next.js App Router.