news 2026/9/16 14:22:27

Builder.io Swell 插件实战指南:把 Swell 商品与集合数据无缝接入 Builder.io 内容平台

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Builder.io Swell 插件实战指南:把 Swell 商品与集合数据无缝接入 Builder.io 内容平台

Builder.io Swell 插件实战指南:把 Swell 商品与集合数据无缝接入 Builder.io 内容平台

【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builder

本文围绕 Builder.io 官方开源仓库中的plugins/swell插件,讲解如何将 Swell 电商平台的商品(Product)与集合(Collection)数据接入 Builder.io 的内容编辑与个性化体系。你将掌握插件的安装与鉴权方式、六种新增字段类型在自定义定向(Custom Targeting)、组件模型字段(Component Model Fields)与符号输入(Symbol Inputs)三种场景下的用法,理解字段值如何被自动解析为 Builder.ioRequest对象,并学会本地开发、调试与发布该插件。

插件定位:为 Builder.io 打开 Swell 数据通道

Swell 是一个 API 优先的电商平台(headless commerce),商品、分类、订单等数据都通过 REST/GraphQL API 暴露。plugins/swell插件的核心目标正如其 README 所述:"Easily connect your Swell data to your Builder.io content!",即让内容编辑者在 Builder.io 的模型(Model)、符号(Symbol)和自定义组件(Custom Component)中,直接搜索、选择 Swell 商品或集合,并把选中结果作为字段值写入内容。

插件本质是一个 Builder.io 平台插件(Plugin),通过 Builder 提供的插件注册机制动态扩展编辑器的字段类型与定向能力。在 plugins/swell/src/plugin.ts 中,插件调用@builder.io/commerce-plugin-tools提供的registerCommercePlugin完成注册:

import { registerCommercePlugin } from '@builder.io/commerce-plugin-tools'; import swell from 'swell-js'; registerCommercePlugin( { name: 'Swell', // should always match package.json package name id: '@builder.io/plugin-swell', ... }, async settings => { ... } );

registerCommercePlugin是 Builder.io 为电商类插件提供的一站式基座(同一机制被 plugins/shopify/src/plugin.ts、plugins/bigcommerce/src/plugin.ts、plugins/vtex/src/plugin.ts 等大量电商插件复用),它约定了productcategory两组统一资源接口(findByIdfindByHandlesearchgetRequestObject)。Swell 插件只需按此契约实现 Swell API 的适配,即可自动获得 Builder 编辑器中的搜索弹窗、字段解析与定向能力。

安装插件与鉴权配置

安装插件在 Builder.io 后台完成,无需改动任何前端代码:

  1. 登录后进入Account > Organization(对应 README 中的 builder.io/account/organization)页面;
  2. 在插件列表中选中@builder.io/plugin-swell
  3. 点击保存(Save),此时系统会提示输入 Swell 商店的连接凭据。

凭据部分需要注意 README 与源码的一处差异:README 安装段落写作"you'll be prompted for storeId and secretKey",而插件实际注册的配置项(见 plugins/swell/src/plugin.ts)是storeIdpublicKey两个必填项,helperText 明确指示从 Swell 商店设置的 API Keys > Public api key 中获取:

settings: [ { name: 'storeId', type: 'string', required: true, helperText: 'Get your Store ID from swell store settings https://swell.store/docs/api/?javascript#authentication', }, { name: 'publicKey', type: 'string', required: true, helperText: 'Get your Public key from swell store settings > API keys > Public api key https://swell.store/docs/api/?javascript#authentication', }, ], ctaText: `Connect your swell.is store`,

连接按钮文案为 "Connect your swell.is store"。鉴权完成后,插件会执行swell.init(storeId, publicKey)(见 plugins/swell/src/plugin.ts)初始化swell-js客户端。需要说明:storeId 与 publicKey 都是公开信息(public key 仅用于只读的 storefront 请求),因此可以安全地以明文形式出现在前端插件中;如果后续需要写入订单等敏感操作,则应使用服务端密钥(secret key)而非该 publicKey。

安装成功后,编辑器中将出现六种新的字段类型,它们分别适用于三种上下文:自定义定向属性组件模型字段符号输入。下表是六种字段类型的速览:

字段类型适用上下文作用
Swell Product自定义定向 / 符号输入按商品 ID 定向或搜索选择商品
Swell Product Handle自定义定向按商品 handle(slug)定向
Swell Collection自定义定向 / 符号输入按集合 ID 定向或搜索选择集合
Swell Collection Handle自定义定向按集合 handle(slug)定向
Swell Product Preview组件模型字段动态拼接商品模板的预览 URL
Swell Collection Preview组件模型字段动态拼接集合模板的预览 URL

场景一:自定义定向(Custom Targeting)

Builder.io 的自定义定向允许内容按任意属性(attribute)做细分投放。Swell 插件将商品与集合扩展为可用的定向类型:当某个内容条目设置了Swell Product类型的目标属性时,只有访问上下文中携带了对应商品 ID 的用户才会命中该内容。

要让服务端渲染(SSR)或客户端渲染(CSR)正确识别,需要先在宿主站点设置目标属性。客户端渲染场景下,使用builder.setUserAttributes设置当前上下文(见 plugins/swell/src/plugin.ts 对应的 README 示例):

builder.setUserAttributes({ product: currentProduct.id, });

服务端场景下,则把用户属性作为查询参数传给内容 API(Query API 的userAttributes参数),或在 Gatsby、Next.js 中通过 GraphQL API 的 targeting 参数传入。例如通过 Query API 请求时大致形态为:

// https://cdn.builder.io/api/v1/html/page?...&userAttributes.product=<productId>

各字段类型的定向语义如下:

  • Swell Product:定向到"字段值等于商品 ID"的上下文。需要在宿主环境用上述任一方法设置当前商品 ID;
  • Swell Product Handle:若希望按商品的 handle(即 URL slug)而不是数字 ID 定向,改用此类型。宿主环境设置builder.setUserAttributes({ product: currentProduct.handle })即可;
  • Swell Collection:定向到特定集合,按集合 ID 匹配,宿主环境需设置集合 ID;
  • Swell Collection Handle:按集合 handle 定向,适合以语义化 slug 做匹配的场景。

从源码角度看,ID 与 handle 的解析分别由插件暴露的findByIdfindByHandle完成(见 plugins/swell/src/plugin.ts),二者都调用swell.products.get(id | handle)——Swell API 允许以 ID 或 slug 直接读取资源:

async findById(id: string) { const product = await swell.products.get(id); return transformResource(product); }, async findByHandle(handle: string) { const product = await swell.products.get(handle); return transformResource(product); },

场景二:组件模型字段(Component Model Fields)

组件模型(Component Model)通常用于表达"商品页模板"或"集合页模板",可作用于全部或某一组商品/集合。为了让内容编辑者在编辑器中实时预览任意商品/集合对应的模板页面,插件提供了两个预览字段:

Swell Product Preview

在组件模型上添加类型为Swell Product Preview的自定义字段,并给模型配置带变量的模板编辑 URL,例如:

https://www.mystore.com/product/${previewProduct.handle}

此后创建新的内容条目时,Builder 会基于"当前预览的商品"动态地把 handle 填入 URL。官方建议为该字段设置默认值,这样开发者进入模板组件开发时能直接落在某个具体的商品页,而不是空 URL。

Swell Collection Preview

用法与 Product Preview 完全对称:给模型添加Swell Collection Preview字段,并把模型 URL 配置为集合模板,例如:

https://www.mystore.com/collection/${previewCollection.handle}

创建条目后,handle 会基于预览集合动态填充。同样建议为字段设置默认值,保证开发时稳定落在某个集合页。

这两个字段依赖插件在transformResource(见 plugins/swell/src/plugin.ts)中返回的handle字段(取自 Swell 资源的slug),因此模型 URL 中可以直接引用${previewProduct.handle}/${previewCollection.handle}这样的插值:

const transformResource = (resource: any) => ({ id: resource.id, title: resource.name, handle: resource.slug, ...(resource.images && { image: { src: resource.images[0]?.file.url, }, }), });

场景三:符号输入(Symbol Inputs)与 Request 对象解析

当把Swell ProductSwell Collection用作符号(Symbol)输入字段时,编辑器中的 UI 会弹出搜索框,允许按关键字搜索 Swell 商品/集合。搜索由插件的search方法实现(见 plugins/swell/src/plugin.ts),通过swell.products.list/swell.categories.list拉取结果,并注明"如需分页可扩展 limit/page":

async search(search: string) { const response = await swell.products.list({ search, // TODO: pagination if needed limit: 100, page: 1, }); return response.results.map(transformResource); },

关键在于值形态:当字段被 API、SDK 或 Builder 编辑器消费时,选中的商品/集合不会被存成普通字符串,而是被自动解析为一个 Builder.io 标准的Request对象:

{ "yourFieldName": { "@type": "@builder.io/core:Request", "request": { "url": "..." }, "data": { "product": { "/* ... */" } } } }

这个对象由插件的getRequestObject方法生成(见 plugins/swell/src/plugin.ts),URL 拼接规则为https://{publicKey}@{storeId}.swell.store/api/products/{id}(分类同理为/api/categories/{id}):

getRequestObject(id: string) { return { '@type': '@builder.io/core:Request' as const, request: { url: `https://${publicKey}@${storeId}.swell.store/api/products/${id}`, }, options: { product: id, }, }; },

理解这一设计对内容架构很重要:Request对象是 Builder.io 的"延迟取数"机制——字段里只保存请求描述(URL),真正拉取响应数据发生在渲染阶段;data中的product/category是请求完成后填充的响应内容。因此内容条目天然携带"可重放"的数据请求,既能在编辑器里预览,也能在 SSR/CSR 阶段由 Builder SDK 自动请求并注入,避免把易过期的商品快照硬编码进内容。

本地开发:把插件跑起来

plugins/swell是仓库中独立的可开发插件包(npm 包名为@builder.io/plugin-swell,版本见 plugins/swell/package.json),本地开发流程如下:

1. 安装依赖

git clone <本仓库地址> cd plugins/swell npm install

2. 启动开发服务器

npm start

该命令等价于SERVE=true rollup -c rollup.config.ts -w(见 plugins/swell/package.json)。Rollup 的 serve 插件会在1268 端口托管dist目录下的构建产物(见 plugins/swell/rollup.config.ts),并附带Access-Control-Allow-Origin: *Access-Control-Allow-Private-Network响应头,以兼容浏览器私有网络访问(PNA)预检。

3. 把本地插件接入 Builder.io

回到 Account > Organization 的插件设置页,把本地地址填入插件配置:

http://localhost:1268/plugin.system.js?pluginId=@builder.io/ecom-swell-is

注意:Builder.io 后台是 https 站点,而本地开发地址是 http。浏览器会阻止混入的不安全脚本,需要在页面右上角点击盾牌图标并选择 "Load unsafe scripts"(加载不安全脚本)才能正常加载本地插件。每次修改源码后重启 Builder 页面即可看到最新版本;要卸载插件,直接在插件管理 UI 中移除即可。

4. 验证插件效果

创建一个自定义模型、自定义组件或符号,在其中添加 Swell 类型字段即可编辑验证。例如给模型加一个Swell Product字段,编辑器里应出现商品搜索弹窗,选中后字段值显示为商品卡片(含图片、标题、handle)。

5. 构建与发布

生产构建命令为npm run build(先rimraf dist清理,再tsc+rollup打包,见 plugins/swell/package.json)。产物入口为dist/plugin.system.js(SystemJS 格式,见 plugins/swell/rollup.config.ts)。插件发布走语义化版本:npm run release:dev打 dev 预发布版本用于联调,合并 PR 后npm run release:patch发布补丁版本(发布与测试流程详见 plugins/README.md)。仓库还配置了 jest 测试与 90% 以上的覆盖率门槛(见 plugins/swell/package.json),为插件行为提供回归保障。

插件 UI 技术栈与最佳实践

Builder.io 插件体系的 UI 统一基于ReactMaterial UI,样式使用Emotion(见 README 的 Frameworks 小节,以及 plugins/swell/package.json 中的react@material-ui/core@emotion/core依赖)。插件与宿主共享这些运行时,因此 Rollup 配置将这些包显式列入external(见 plugins/swell/rollup.config.ts),避免重复打包导致 React 多实例问题:

external: [ 'react', '@builder.io/react', '@builder.io/app-context', '@material-ui/core', '@emotion/core', '@emotion/styled', 'mobx', 'react-dom', 'mobx-react', ],

注释明确提示:不要改动这份 external 列表,新增依赖也应保持不被打包,这是插件在 Builder 编辑器内稳定运行的前提。

开发插件时遵循这一约定,配合@builder.io/commerce-plugin-toolsproduct/category资源契约,即可用极少的代码让任意电商后端接入 Builder.io——这正是plugins/swell这份实现(完整源码仅一个 plugin.ts 文件)所展示的典型范式。

【免费下载链接】builderVisual Development for React, Vue, Svelte, Qwik, and more项目地址: https://gitcode.com/GitHub_Trending/bu/builder

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/16 14:21:07

SpringBoot3+Vue3校园跳蚤市场毕业设计实战

简介&#xff1a;本资源是一套面向计算机专业本科生的2025届毕业设计实战项目——大学校园跳蚤市场平台&#xff0c;聚焦高校二手交易场景&#xff0c;完整覆盖需求分析、前后端开发、数据库设计与部署实践&#xff0c;适用于Java全栈入门到进阶学习者及课程设计/毕设选题参考。…

作者头像 李华
网站建设 2026/9/16 14:19:31

机械手PID控制与Simulink仿真:从PD控制到跟踪微分器

简介&#xff1a;面向机械手控制课程设计与毕业设计场景&#xff0c;一套基于Matlab的机械手PID控制源码包&#xff0c;提供了从动力学建模、控制器设计到Simulink仿真验证的完整参考路径。资源主要面向具备一定Matlab基础、需要完成机械手或机器人控制相关作业的高校学生&…

作者头像 李华
网站建设 2026/9/16 14:19:10

C语言课设实操:校园新闻发布管理系统链表设计与文件持久化

简介&#xff1a;基于C语言的校园新闻发布管理系统&#xff0c;是一套面向计算机专业课程设计与毕业设计的完整源码和说明文档。系统围绕新闻采集、编辑、审核、发布与用户评论等功能展开&#xff0c;采用模块化编程&#xff0c;源码由多个C源文件与头文件按功能拆分&#xff0…

作者头像 李华
网站建设 2026/9/16 14:17:19

10. 软件设计架构-分布式-分布式事务

文章目录前言一、分布式事务基础1. 什么是事务2. 本地事务3. 分布式事务4. 分布式事务的场景二、分布式事务解决方案三、二阶段提交1. 概述2. 处理流程3. 问题四、三阶段提交1. 概述2. 处理流程3. 问题五、补偿事务TCC1. 概述2. 工作流程3. 问题六、 通过消息队列实现1. 本地消…

作者头像 李华
网站建设 2026/9/16 14:16:29

GitHub热榜观察指南:从趋势洞察到技术选型实战

作为一个常年泡在 GitHub 上的人&#xff0c;我每天早上打开浏览器的第一件事&#xff0c;基本就是扫一眼 GitHub 热榜——也就是大家常说的 Trending。很多刚接触 GitHub 的朋友会把它当成“今天哪些项目最火”的娱乐榜单&#xff0c;但说实话&#xff0c;刷了这么多年&#x…

作者头像 李华