원클릭으로
sveltekit-remote-functions
// SvelteKit remote functions guidance. Use for query(), form(), command(), and prerender() patterns in .remote.ts files.
// SvelteKit remote functions guidance. Use for query(), form(), command(), and prerender() patterns in .remote.ts files.
Svelte component patterns. Use for web components, component libraries (Bits UI, Ark UI, Melt UI), form patterns, or third-party integration.
Svelte deployment guidance. Use for adapters, Vite config, pnpm setup, library authoring, PWA, or production builds.
Svelte runes guidance. Use for reactive state, props, effects, or migration. Covers $state, $derived, $effect, $props, $bindable. Prevents reactivity mistakes.
Svelte CSS styling patterns. Use for scoped styles, CSS custom properties, style: directive, :global, or styling child components.
SvelteKit data flow guidance. Use for load functions, form actions, server/client data, and invalidation. Covers +page.server.ts vs +page.ts, serialization, fail(), redirect(), error(), invalidateAll().
SvelteKit structure guidance. Use for routing, layouts, error handling, SSR, or svelte:boundary. Covers file naming, nested layouts, error boundaries, pending UI, and hydration.
| name | sveltekit-remote-functions |
| description | SvelteKit remote functions guidance. Use for query(), form(), command(), and prerender() patterns in .remote.ts files. |
Remote functions are experimental in SvelteKit 2.58. Enable them in
svelte.config.js:
export default {
kit: { experimental: { remoteFunctions: true } },
compilerOptions: { experimental: { async: true } } // only for await in components
};
File naming: export remote functions from *.remote.ts or *.remote.js.
Remote files can live anywhere under src except src/lib/server.
Which function?
query()form()command()prerender()// posts.remote.ts
import { command, query, requested } from '$app/server';
import * as v from 'valibot';
export const getPosts = query(v.object({ tag: v.optional(v.string()) }), async (filter) => {
return db.posts.find(filter);
});
export const createPost = command(v.object({ title: v.string() }), async (data) => {
await db.posts.create(data);
for (const { query } of requested(getPosts, 5)) {
void query.refresh();
}
});
Client:
<script lang="ts">
import { createPost, getPosts } from './posts.remote';
const posts = $derived(await getPosts({ tag: 'svelte' }));
</script>
<button onclick={() => createPost({ title: 'New' }).updates(getPosts)}>
Create
</button>
devalue; avoid functions, class instances, symbols, circular refs, and RegExp.valibot, zod, arktype, etc.) or use .unchecked/'unchecked' deliberately.query.batch() batches calls from the same macrotask to solve n+1 reads.form().enhance() submit() returns true when submission is valid/successful and false for validation failures..updates() is client-requested; server handlers must opt in with requested(queryFn, limit).requested() now yields { arg, query }; call query.refresh()/query.set(...) on the bound instance.limit is required for requested() to cap client-controlled refresh requests.void query.refresh()/void query.set(value); SvelteKit awaits and serializes the updates.form() over command() where progressive enhancement matters.prerender() for data that changes at most once per deployment.