Skip to content

Nuxt SSR & Hydration

Nuxt is the most opinionated integration path, so the package ships a dedicated module for it.

What the module solves

Without the module, you have to:

  • create and register a QueryClient
  • dehydrate it during server rendering
  • hydrate it on the client
  • ensure all pages and composables share the same cache instance

@elysia-vue-query/nuxt handles that wiring for you.

Install

sh
bun add @elysia-vue-query/nuxt

Register it

nuxt.config.ts
ts
export default defineNuxtConfig({
  modules: ["@elysia-vue-query/nuxt"],
});

Create helpers in a composable

composables/eden.ts
ts
import { treaty } from "@elysiajs/eden";
import { createEdenQueryHelpers } from "@elysia-vue-query/vue";
import type { App } from "@playground/api";

const client = treaty<App>("http://localhost:3000");
export const eden = createEdenQueryHelpers(client);

Use queries in pages

pages/users.vue
vue
<script setup lang="ts">
import { eden } from "~/composables/eden";

const users = eden.useQuery(eden.proxy.users.get);
const createUser = eden.useMutation(eden.proxy.users.post);
</script>

Why this avoids double fetching

On the server, Nuxt renders the page with a QueryClient that already contains prefetched results. The module dehydrates that cache into the Nuxt payload. On the client, it hydrates before the page re-runs the same query key, so TanStack can serve the cached entry.

When to still prefetch manually

Use eden.prefetch() when:

  • a page must be fully rendered with data on first response
  • you want SEO-sensitive content in the initial HTML
  • you want to warm the cache for expensive requests
pages/posts.vue
vue
<script setup lang="ts">
import { useQueryClient } from "@tanstack/vue-query";
import { eden } from "~/composables/eden";

const queryClient = useQueryClient();

if (import.meta.server) {
  await eden.prefetch(eden.proxy.posts.get, queryClient);
}

const posts = eden.useQuery(eden.proxy.posts.get);
</script>

Practical rule

For Nuxt, start with the module. Add manual prefetch() only to pages where first-render completeness matters.

Released under the MIT License.