关于 sveltekit-remote-functions
这项技能介绍如何使用 SvelteKit 的实验性 Remote Functions,实现由服务器执行的读取、表单、修改和预渲染数据操作,并涵盖验证、批处理与查询更新。
主要功能
- 01选择 query、form、command 或 prerender
- 02使用 Standard Schema 验证输入
- 03批处理 query 调用
- 04控制客户端发起的查询更新
适用场景
- 01在 SvelteKit 中实现服务器端读取
- 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 下的任何位置,但不能放在 src/lib/server 中。
选择哪个函数?
- 动态读取 →
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 会等待并序列化这些更新。 - 如果需要渐进式增强,优先使用
form()而非command()。 - 对于每次部署最多变化一次的数据,使用
prerender()。 - 最后验证时间: SvelteKit 2.58.0,2026-04-24
参考文件
- references/remote-functions.md - 当前模式、示例和注意事项
评论
支持 Markdown