mcpField
S
sveltekit-remote-functions

sveltekit-remote-functions

github.com/spences10開発94427 回インストール2 週間前に更新
リポジトリ

sveltekit-remote-functions について

SvelteKit の実験的な Remote Functions を使い、サーバーで実行する読み取り、フォーム、変更、事前レンダリングを扱うスキルです。入力検証、呼び出しのバッチ処理、クエリ更新も解説します。

主な機能

  1. 01query、form、command、prerender の選択
  2. 02Standard Schema による入力検証
  3. 03query 呼び出しのバッチ処理
  4. 04クライアント要求のクエリ更新を制御

活用シーン

  1. 01SvelteKit でサーバー側の読み取りを実装
  2. 02プログレッシブエンハンスメント対応フォームの追加
  3. 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

リファレンスファイル

コメント