SvelteKit
The @nano_kit/svelte-kit package integrates Nano Kit with SvelteKit. It re-exports everything from @nano_kit/svelte and @nano_kit/svelte-router, and adds SvelteKit-specific helpers for store dehydration, client hydration, navigation, router-aware links, and server cookies.
Installation
Section titled “Installation”Install the package using your favorite package manager:
pnpm add @nano_kit/store @nano_kit/router @nano_kit/svelte-kityarn add @nano_kit/store @nano_kit/router @nano_kit/svelte-kitnpm install @nano_kit/store @nano_kit/router @nano_kit/svelte-kitQuick Start
Section titled “Quick Start”The main SvelteKit integration point is store dehydration in +page.server.ts and hydration in the matching +page.svelte.
-
Set up the root layout
Create a request-scoped dehydration context in the root server layout and pass its reference to the root layout component.
// src/routes/+layout.server.tsimport {setDehydrationContext} from '@nano_kit/svelte-kit'import type { LayoutServerLoad } from './$types'export const load: LayoutServerLoad = () => {const contextRef = setDehydrationContext()return {contextRef}}<!-- src/routes/+layout.svelte --><script lang="ts">import { setHydrationContext } from '@nano_kit/svelte-kit'let { data, children } = $props()setHydrationContext({fromRef: () => data.contextRef})</script>{@render children()} -
Dehydrate page stores
Choose whether SvelteKit should dehydrate stores during client-side navigations.
// src/routes/characters/+page.server.tsimport {dehydrate,isFlight} from '@nano_kit/svelte-kit'import { Stores$ } from '$lib/pages/Characters.svelte'import type { PageServerLoad } from './$types'export const load: PageServerLoad = async () => ({dehydrated: !isFlight() && await dehydrate(Stores$)})isFlight()skips server dehydration during browser navigation. Stores still work, but navigation-time data is fetched in the browser instead of being prepared by the SvelteKit server load.// src/routes/characters/+page.server.tsimport { dehydrate } from '@nano_kit/svelte-kit'import { Stores$ } from '$lib/pages/Characters.svelte'import type { PageServerLoad } from './$types'export const load: PageServerLoad = async ({ parent }) => {await parent()return {dehydrated: await dehydrate(Stores$)}}Use this mode when you want server data preparation during browser navigation too.
await parent()is needed when those stores rely on providers installed by a parent layout, such as router navigation or cookies. -
Hydrate page stores
Pass the dehydrated page data to
setHydrationContextin the page component.<!-- src/routes/characters/+page.svelte --><script lang="ts">import { setHydrationContext } from '@nano_kit/svelte-kit'import CharactersPage from '$lib/pages/Characters.svelte'let { data } = $props()setHydrationContext({dehydrated: () => data.dehydrated})</script><CharactersPage />
Navigation
Section titled “Navigation”Set up navigation only when stores or components use Nano Kit router dependencies such as Location$, Navigation$, Link, or typed route navigation.
Server Navigation
Section titled “Server Navigation”In the root server layout, provide request navigation.
// src/routes/+layout.server.tsimport { provide } from '@nano_kit/store'import { Location$, Navigation$, serverNavigation, setDehydrationContext} from '@nano_kit/svelte-kit'import { routes } from '$lib/stores/router'import type { LayoutServerLoad } from './$types'
export const load: LayoutServerLoad = () => { const [location, navigation] = serverNavigation(routes) const contextRef = setDehydrationContext([ provide(Location$, location), provide(Navigation$, navigation) ])
return { contextRef }}Client Navigation
Section titled “Client Navigation”In the root layout component, provide browser navigation.
<!-- src/routes/+layout.svelte --><script lang="ts"> import { provide } from '@nano_kit/store' import { Link, Location$, Navigation$, getKitNavigation, setHydrationContext } from '@nano_kit/svelte-kit' import { routes } from '$lib/stores/router'
let { data, children } = $props() const [location, navigation] = getKitNavigation(routes)
setHydrationContext({ fromRef: () => data.contextRef, context: [ provide(Location$, location), provide(Navigation$, navigation) ] })</script>
<nav> <Link to="home">Home</Link> <Link to="characters">Characters</Link></nav>
{@render children()}Cookies
Section titled “Cookies”@nano_kit/svelte-kit exports CookieStore, a server adapter around SvelteKit’s cookies object. Provide it through CookieStore$ when stores use cookie-backed signals.
// src/routes/+layout.server.tsimport { provide } from '@nano_kit/store'import { CookieStore, setDehydrationContext} from '@nano_kit/svelte-kit'import { CookieStore$ } from '@nano_kit/platform-web'import type { LayoutServerLoad } from './$types'
export const load: LayoutServerLoad = ({ cookies }) => { const contextRef = setDehydrationContext([ provide(CookieStore$, new CookieStore(cookies)) ])
return { contextRef }}Then inject CookieStore$ in stores that use cookie-backed signals.
// src/lib/stores/session.tsimport { inject } from '@nano_kit/store'import { CookieStore$, cookieStored} from '@nano_kit/platform-web'
export function Session$() { const cookieStore = inject(CookieStore$) const $session = cookieStored<string | null>(cookieStore, { name: 'session', path: '/', sameSite: 'lax' }, null)
return { $session }}See SSR Cookies for the general cookie model.
See Also
Section titled “See Also”- Svelte - Svelte bindings for Nano Kit stores and dependency injection
- Svelte Router - typed links and router-aware Svelte components
- SSR Cookies - request-bound cookies and
Set-Cookieforwarding