Builder.io Svelte SDK 使用指南:从安装到 SvelteKit 集成实战
【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builder
本指南以 packages/sdks/output/svelte/README.md 为骨架,系统讲解 Builder.io Svelte SDK 的定位、生成方式、安装步骤与 SvelteKit 集成方案。你将掌握@builder.io/sdk-svelte的核心 API(Content、fetchOneEntry、isPreviewing、getBuilderSearchParams)的真实用法,并了解该 SDK 多环境构建(浏览器/Node/边缘运行时)的底层机制。
一、SDK 定位:由 Mitosis 生成的 Svelte 渲染层
Builder.io Svelte SDK 是 Builder.io 新一代 SDK 体系中的一员,它的核心职责是:在 Svelte 应用中渲染 Builder.io 可视化编辑器产出的内容,并将自定义组件接入可视化编辑流程。
关键信息来自 packages/sdks/output/svelte/README.md:
- 该 SDK 由 Mitosis 自动生成,并非手写维护;
- Mitosis 的源码位于仓库的 packages/sdks/src,生成产物输出到
packages/sdks/output/目录; - 同一套 Mitosis 源码同时生成 React、Vue 3、Svelte、SolidJS、Angular、Qwik、React Native、Next.js 等多个框架的 SDK(见 packages/sdks/README.md)。
从源码结构看,Content组件的核心实现位于 packages/sdks/src/components/content/content.lite.tsx,其类型定义在 packages/sdks/src/components/content/contentProps.types.ts。这些.lite.tsx文件就是 Mitosis 的框架无关源码,Svelte 版 SDK 是它的编译产物。
二、Feature Support:如何核对 SDK 功能状态
原文档明确说明:要查看该 SDK 的功能实现状态,请查看 Feature Implementation 表格。
该表格位于 packages/sdks/README.md 的 "# Feature Implementation" 一节,涵盖了各框架 SDK 的功能对比,包括:
- Available Features:各 SDK 已实现的功能列表;
- Builder Blocks:各框架可用的 Builder 基础块;
- Builder Widgets:各框架可用的 Builder 小组件。
仓库目前持续为各 SDK 实现新功能,因此在使用前核对功能表是一个值得养成的习惯——尤其是当你依赖某个较新的 Builder 块(Block)或组件时,应以该表格为准确认 Svelte 版是否已支持。
三、快速开始:安装与最小示例
3.1 安装
SDK 的 npm 包名为@builder.io/sdk-svelte,在 Svelte 或 SvelteKit 项目中直接安装即可:
npm install @builder.io/sdk-svelte从 packages/sdks/output/svelte/package.json 可以看到:
- 当前版本号为
5.2.11; - 包类型为
"type": "module",即 ESM 优先; peerDependencies要求svelte: ^4.1.2(适用于 Svelte 4);- 运行时依赖仅
isolated-vm: ^6.0.0(用于在服务端安全执行代码); - 开发依赖中包含
@builder.io/sdks(workspace 内部共享源码包)与@sveltejs/kit、vite等构建工具链。
3.2 多环境构建产物
该 SDK 通过svelte-package为三种运行环境分别打包(见 package.json 的scripts段):
| 构建目标 | 命令 | 产物目录 | 适用场景 |
|---|---|---|---|
| Browser | build:browser | lib/browser/ | 浏览器端渲染 |
| Node | build:node | lib/node/ | Node.js 服务端(SSR) |
| Edge | build:edge | lib/edge/ | 边缘运行时(Deno、Bun、Cloudflare Workers、Netlify Edge 等) |
包入口通过exports字段按运行环境自动分发:"svelte"/"browser"走lib/browser/index.js,"node"/"electron"走lib/node/index.js,"edge-routine"、"workerd"、"deno"、"lagon"、"netlify"、"edge-light"、"bun"等走lib/edge/index.js。这意味着同一个包可以在 SSR、静态生成和边缘函数等多种部署形态下工作。
注意:SDK 依赖
isolated-vm来在 Node 服务端安全执行代码。在 Node v20 + Apple Silicon(M1)机器上存在兼容性问题,运行服务端时需要设置环境变量NODE_OPTIONS=--no-node-snapshot,否则 SDK 会跳过isolated-vm(详见 packages/sdks/README.md 的 "Node v20 + M1 Macs Support" 一节)。
四、Fetch 行为说明
原文档特别强调:该包使用fetch。
在源码中,这一行为由 packages/sdks/src/functions/get-content/index.ts 实现:_fetchContent内部调用generateContentUrl(options)构造请求 URL,并通过options.fetch ?? fetch使用全局fetch发起请求(默认实现位于../get-fetch.js)。也就是说,SDK 没有内置自己的 HTTP 客户端,而是复用运行环境的标准fetch——这也解释了为什么它能在浏览器、Node 和边缘运行时之间无缝切换。
五、SvelteKit 集成实战
原文档指向官方示例仓库 examples/svelte/sveltekit,该示例完整演示了 SvelteKit 下如何接入 SDK。以下结合示例源码逐层拆解。
5.1 准备 API Key
在 examples/svelte/sveltekit/src/apiKey.js 中导出公开 API Key:
// TODO: enter your public API key export const BUILDER_PUBLIC_API_KEY = 'f1a790f8c3204b3b8c5c1795aeac4660'; // ggignore操作流程(对应示例 README):
- 登录 Builder.io,从账户页面复制你的 API Key;
- 将其填入
src/apiKey.js中的BUILDER_PUBLIC_API_KEY; - 打开 Builder.io Visual Editor,选择名为 "page" 的模型(model);
- 在编辑器右上角预览地址栏输入
http://localhost:3000; - 在 Layers 面板中拖入组件,页面即会实时出现在编辑器中。
5.2 服务端加载内容(+page.server.js)
SvelteKit 的load函数在服务端运行,负责拉取 Builder 内容。示例位于 examples/svelte/sveltekit/src/routes/[...catchall]/+page.server.js:
import { fetchOneEntry, getBuilderSearchParams } from '@builder.io/sdk-svelte'; import { BUILDER_PUBLIC_API_KEY } from '../../apiKey'; /** @type {import('./$types').PageServerLoad} */ export async function load(event) { // fetch your Builder content const content = await fetchOneEntry({ model: 'page', apiKey: BUILDER_PUBLIC_API_KEY, options: getBuilderSearchParams(event.url.searchParams), userAttributes: { urlPath: event.url.pathname || '/' } }); return { content }; }这里用到了两个核心 API:
fetchOneEntry(options):按条件获取单条 Builder 内容(model 匹配的第一条)。源码实现位于 packages/sdks/src/functions/get-content/index.ts,其内部实际是fetchEntries({ ...options, limit: 1 })的封装,取results数组的第一项,无结果时返回null;getBuilderSearchParams(url.searchParams):将 URL 查询参数转换为 SDK 请求参数。源码见 packages/sdks/src/functions/get-builder-search-params/index.ts,其注释明确提示:该函数一般并不需要,推荐改用isPreviewing()来判断是否处于预览模式(见下节);userAttributes.urlPath:传入当前页面路径,用于 Builder 的个性化与目标匹配(Targeting)逻辑。
5.3 客户端渲染与自定义组件(+page.svelte)
页面组件位于 examples/svelte/sveltekit/src/routes/[...catchall]/+page.svelte:
<script> import Counter from '../../lib/Counter.svelte'; import { isPreviewing, Content } from '@builder.io/sdk-svelte'; import { BUILDER_PUBLIC_API_KEY } from '../../apiKey'; // Create an array of your custom components and their properties const CUSTOM_COMPONENTS = [ { component: Counter, name: 'Counter', inputs: [ { name: 'name', type: 'string', defaultValue: 'hello' }, { name: 'count', type: 'number', defaultValue: 0 } ] } ]; // this data comes from the function in `+page.server.js`, which runs on the server only export let data; // we want to show unpublished content when in preview mode. const canShowContent = data.content || isPreviewing(); </script> <main> <h1>Welcome to SvelteKit</h1> <div>Below is your Builder Content:</div> {#if canShowContent} <div>page Title: {data.content?.data?.title || 'Unpublished'}</div> <Content model="page" content={data.content} apiKey={BUILDER_PUBLIC_API_KEY} customComponents={CUSTOM_COMPONENTS} /> {:else} Content Not Found {/if} </main>要点解析:
Content组件是渲染入口,接收model(内容模型名)、content(服务端加载到的数据)、apiKey(公开 API Key)以及customComponents(自定义组件注册表)等 props;isPreviewing():当在 Builder.io 可视化编辑器中预览时返回true。这里用data.content || isPreviewing()的组合判断——发布内容用服务端数据,预览时则允许显示未发布内容;customComponents注册协议:每个自定义组件需要声明component(Svelte 组件本身)、name(在编辑器中显示的名称)和inputs(可编辑的属性列表,含name、type、defaultValue)。这样 Builder 编辑器就能识别并可视化编辑该组件;- 自定义组件示例
Counter.svelte位于 examples/svelte/sveltekit/src/lib/Counter.svelte,是一个带弹跳数字动画的计数器,其name、count两个属性正好对应上面的inputs注册。
5.4 运行与构建
示例 README 给出的命令:
# install dependencies npm install # serve with hot reload at localhost:3000 npm run dev # or start the server and open the app in a new browser tab npm run dev -- --open生产构建与预览:
npm run build npm run preview部署到不同平台时,可能需要为 SvelteKit 安装对应的 adapter 供参考。
六、从源码理解 SDK 的工作方式
虽然 Svelte 版 SDK 是编译产物(packages/sdks/output/svelte/目录下只有工程配置,实际源码由 Mitosis 从 packages/sdks/src 生成),但我们可以通过共享源码理解其内部原理:
- 内容获取链路:
fetchOneEntry→fetchEntries→_fetchContent→generateContentUrl+fetch,最终请求 Builder 的 Content Delivery API,返回BuilderContent结构(见 packages/sdks/src/functions/get-content/index.ts); - 测试保障:packages/sdks/src/functions/get-content/index.test.ts 对
fetchEntries/fetchOneEntry的行为进行了单元测试,可作为理解参数语义的补充材料; - 内容渲染组件:
Content组件的 Mitosis 源码在 packages/sdks/src/components/content/content.lite.tsx,其 props 类型在 packages/sdks/src/components/content/contentProps.types.ts,想要深入了解可用属性时可查阅这两处。
七、小结
Builder.io Svelte SDK 以 Mitosis 单一源码为基础,为 Svelte 生态提供了与 React、Vue、Qwik 等框架对等的 Builder.io 内容渲染能力。通过npm install @builder.io/sdk-svelte即可接入,配合fetchOneEntry(服务端取数)、Content(渲染)、isPreviewing(预览模式)与customComponents(自定义组件注册)四个核心 API,即可在 SvelteKit 中完成从内容拉取到可视化编辑的完整闭环。功能支持状态、版本兼容性与 Node v20 环境注意事项,请以 Feature Implementation 表格 和 package.json 为准。
【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builder
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考