Server Components in Nuxt.js are Vue components that are rendered entirely on the server side and sent as HTML to the client. They do not include any client-side JavaScript, meaning they do not get hydrated on the client side. This makes them ideal for displaying static content without any interactivity.
You can use Server Components for parts of your application that display static information, such as headers, footers, or content that doesn't require user interaction.
Server components helps with performance optimization as well - reducing the amount of JavaScript sent to the client improves load times and overall performance, especially on slower networks or devices.
And finally, since content is rendered on the server, it's immediately available to search engine crawlers, improving SEO.
This makes them perfect for Landing pages or informational pages where content doesn't change dynamically, or the content that doesn't require client-side interaction such as static blogs or technical documents or help pages that are static.
Under the hood, Server Components use the <NuxtIsland>
component, enabling efficient server-side rendering and optimal performance.
When you create a Server Component, Nuxt.js wraps it with <NuxtIsland>
, which handles the server-side rendering and the communication with the client when necessary. The <NuxtIsland>
component accepts several props and slots that can influence its behavior:
lazy
Prop: When set, the component becomes non-blocking. This means it doesn't prevent the page from rendering while it's being fetched or processed on the server.#fallback
Slot: This reserved slot is displayed if the <NuxtIsland>
fails to fetch or render the component. It provides a way to gracefully handle errors or delays in rendering.As of now, Server Components are an experimental feature in Nuxt.js. To use them, you need to enable the componentIslands
option in your Nuxt configuration:
// nuxt.config.js
export default defineNuxtConfig({
experimental: {
componentIslands: true,
},
})
Server Components are identified by the .server.vue
suffix in their filenames. This convention tells Nuxt.js to treat these components differently during the build and rendering process.
Example:
components/
└── HighlightedMarkdown.server.vue
Suppose you have a component called HighlightedMarkdown
that uses the markdown-it
library to render Markdown content. By making it a Server Component, you ensure that markdown-it
is only used on the server and not included in the client-side bundle.
HighlightedMarkdown.server.vue:
<template>
<div v-html="renderedMarkdown"></div>
</template>
<script setup>
import MarkdownIt from 'markdown-it'
const props = defineProps({
content: {
type: String,
required: true,
},
})
const md = new MarkdownIt()
const renderedMarkdown = md.render(props.content)
</script>
In this example:
markdown-it
library is not shipped to the client, reducing the bundle size.nuxt-client
PropWhile Server Components are not hydrated on the client by default, you might encounter scenarios where a child component within a Server Component needs client-side interactivity. Nuxt.js provides the nuxt-client
prop to enable partial hydration for such cases.
Example:
<template>
<div>
<!-- The Counter component will be loaded and hydrated on the client side -->
<Counter nuxt-client :count="5" />
</div>
</template>
In this example:
<Counter>
component is a regular Vue component that requires client-side hydration.nuxt-client
prop instructs Nuxt.js to hydrate the <Counter>
component on the client side while keeping the parent component rendered on the server.Server Components work by leveraging server-side rendering to deliver fully rendered HTML to the client without additional JavaScript for those components. By using the .server.vue
suffix and configuring Nuxt.js appropriately, you can optimize your application by:
Remember that since Server Components are currently experimental, it's important to test thoroughly and keep an eye on Nuxt.js updates for any changes to this feature.