sveltekit-remote-functions について
SvelteKit の実験的な Remote Functions を使い、サーバーで実行する読み取り、フォーム、変更、事前レンダリングを扱うスキルです。入力検証、呼び出しのバッチ処理、クエリ更新も解説します。
主な機能
- 01query、form、command、prerender の選択
- 02Standard Schema による入力検証
- 03query 呼び出しのバッチ処理
- 04クライアント要求のクエリ更新を制御
活用シーン
- 01SvelteKit でサーバー側の読み取りを実装
- 02プログレッシブエンハンスメント対応フォームの追加
- 03クエリのバッチ処理による N+1 読み取りの回避
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ spences10/ svelte-skills-kit --skill sveltekit-remote-functionsインストール後、Claude Code で/sveltekit-remote-functionsを入力して読み込まれたか確認します。
同梱ファイルREADME.mdreferences/remote-functions.md
詳細
SvelteKit リモート関数
現在の状況
SvelteKit 2.58 では、リモート関数は実験的です。svelte.config.js で有効にします:
export default {
kit: { experimental: { remoteFunctions: true } },
compilerOptions: { experimental: { async: true } } // only for await in components
};
クイックスタート
ファイル名: *.remote.ts または *.remote.js からリモート関数をエクスポートします。リモートファイルは、src/lib/server を除く src 配下のどこにでも配置できます。
どの関数を使いますか?
- 動的な読み取り →
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();
}
});
クライアント:
<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を使用します。関数、クラスインスタンス、シンボル、循環参照、RegExpは避けてください。 - 公開する入力は Standard Schema(
valibot、zod、arktypeなど)で検証するか、.unchecked/'unchecked'を意図的に使用してください。 query.batch()は同じマクロタスクからの呼び出しをまとめ、n+1 の読み取りを解消します。form().enhance()のsubmit()は、送信が有効かつ成功した場合はtrueを、検証に失敗した場合はfalseを返します。.updates()はクライアントから要求されます。サーバーハンドラーではrequested(queryFn, limit)を使って許可する必要があります。requested()は{ arg, query }を返すようになりました。バインドされたインスタンスでquery.refresh()/query.set(...)を呼び出してください。- クライアントが制御する更新リクエストの上限を設定するため、
requested()ではlimitが必須です。 - command/form ハンドラー内では
void query.refresh()/void query.set(value)を使用してください。SvelteKit が更新を待機し、シリアライズします。 - プログレッシブエンハンスメントが重要な場合は、
command()よりform()を優先してください。 - デプロイごとに最大 1 回しか変更されないデータには、
prerender()を使用してください。 - 最終確認日: SvelteKit 2.58.0、2026-04-24
リファレンスファイル
- references/remote-functions.md - 現在のパターン、例、注意点
コメント
Markdown 対応