- 低代码
- 前端
- 后端
【免费下载链接】plasmic
Visual builder for React. Build apps, websites, and content. Integrate with your codebase.
@plasmicpkgs/graphql是 Plasmic 官方维护的包,用于在 Plasmic Studio 的数据查询(Data Queries)与交互动作(Mutations)中直接执行 GraphQL 请求。通过本文,你将掌握fetchGraphQL函数的完整参数语义、GET/POST 请求构造的底层原理、返回值结构,以及如何在代码中通过registerGraphQL完成注册并与你自己的 React 代码库打通。
包概览:从 API 报告到真实源码
本仓库中与本文直接相关的文档是 plasmicpkgs/graphql/api/index.api.md,它是由 API Extractor 自动生成的公共 API 报告,完整刻画了该包的对外接口面。结合 plasmicpkgs/graphql/src/index.ts 的实现,我们可以得到一张完整的技术地图。
从 plasmicpkgs/graphql/package.json 可知:
- 包名:
@plasmicpkgs/graphql(当前仓库版本0.0.48) - 定位:
Custom functions for running GraphQL queries from Plasmic data queries.(为 Plasmic 数据查询提供执行 GraphQL 查询的自定义函数) - 模块格式:同时提供 CJS(
dist/index.js)、ESM(dist/index.esm.js)与类型声明(dist/index.d.ts),兼容各类打包器 - Peer 依赖:
@plasmicapp/host >= 1.0.211(注册机制)、@plasmicpkgs/fetch ^0.0.5(底层 HTTP 执行器)
包对外只暴露两个公共 API:fetchGraphQL函数与registerGraphQL注册函数,它们构成了"执行"与"注册"两个核心环节。
FetchGraphQLOpts:参数契约详解
根据 index.api.md 中的接口定义,fetchGraphQL接受一个名为opts的对象,其类型为FetchGraphQLOpts:
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
url | string | 是 | GraphQL 端点地址,例如https://graphql.contentful.com/content/v1/spaces/<space> |
method | "GET" \| "POST" \| "PUT" \| "DELETE" | 是 | HTTP 方法,Studio 面板中默认值为POST |
headers | Record<string, string> | 否 | 附加请求头(如Authorization、Content-Type),默认{} |
request | { query: string; variables?: object } | 是 | 核心请求体:query为 GraphQL 查询字符串,variables为查询变量对象 |
varOverrides | Record<string, any> | 否 | 变量覆盖层,用于在运行时注入/覆盖variables中的同名变量 |
从 源码实现 可以看到其硬性校验:url、method、request三者缺一不可,否则直接抛出Error("url, method, and request are required")。这一点与 Studio 注册元数据中url、request均标记为required: true完全对应。
请求构造:GET 与 POST/PUT/DELETE 的分支逻辑
fetchGraphQL的核心在于按 HTTP 方法分两条路径构造请求,源码 如下:
if (method === "GET") { // https://graphql.org/learn/serving-over-http/#get-request-and-parameters const urlWithQueryParams = new URL(url); urlWithQueryParams.searchParams.set("query", request.query); urlWithQueryParams.searchParams.set( "variables", JSON.stringify({ ...request.variables, ...varOverrides }) ); return fetch({ url: urlWithQueryParams.toString(), method: "GET", headers }); } else { return fetch({ url, method, headers, body: { query: request.query, variables: { ...request.variables, ...varOverrides }, }, }); }两条路径的关键差异:
- GET:遵循 GraphQL over HTTP 规范(代码注释明确引用了 graphql.org 的 GET 参数规范),将
query作为普通 URL 查询参数、variables作为JSON.stringify后的查询参数拼接到 URL 上,不发送请求体。 - POST/PUT/DELETE:将
{ query, variables }作为 JSON 请求体发送。
值得注意的合并逻辑:{ ...request.variables, ...varOverrides }意味着varOverrides中声明的变量会覆盖request.variables中的同名变量。这正是"Variable overrides"字段的设计意图——在 Studio 面板中配置的静态变量可以被运行时传入的动态值(如页面参数、用户上下文)覆盖。
返回值结构
fetchGraphQL返回一个 Promise,resolve 值为:
{ statusCode: number; // HTTP 状态码 headers: { [k: string]: string }; // 响应头映射 body: any; // 已解析的 JSON 响应体(含 data / errors) }该返回结构并非@plasmicpkgs/graphql自行定义,而是直接透传自底层@plasmicpkgs/fetch的fetch函数。查看 plasmicpkgs/fetch/src/index.ts 的实现可以发现三个重要的底层行为:
- 自动请求头:若调用方未显式提供,会默认补上
Accept: application/json;存在 body 时还会补上Content-Type: application/json。 - 响应体自动解析:响应文本会尝试
JSON.parse,解析失败时原样返回字符串(maybeParseJSON)。 - 错误抛出:非 2xx 状态码会抛出
HttpError(name为HttpError,携带status与info字段),错误处理模式参考自 SWR 文档。
因此在 Plasmic 数据查询中使用时,通常需要从body.data中读取 GraphQL 的data字段,并自行检查body.errors处理服务端错误。
registerGraphQL:向 Plasmic 注册自定义函数
registerGraphQL(loader?: Registerable)是包的第二个公共 API,用于把fetchGraphQL及其元数据注册到 Plasmic 运行时:
export function registerGraphQL(loader?: Registerable) { if (loader) { loader.registerFunction(fetchGraphQL, registerGraphqlFetchParams); } else { registerFunction(fetchGraphQL, registerGraphqlFetchParams); } }- 无 loader 参数:调用
@plasmicapp/host的全局registerFunction,将函数推入window.__PlasmicFunctionsRegistry(去重逻辑见 packages/host/src/registerFunction.ts)。 - 传入 loader:若你使用的是自定义 loader(如
@plasmicapp/loader-nextjs),则调用 loader 实例上的registerFunction方法。
在 Studio 画布环境中,platform/canvas-packages/src/graphql.ts 直接调用registerGraphQL()完成注册,这说明该函数会以"GraphQL"名称出现在 Studio 的函数/数据查询面板中(注册元数据的displayName: "GraphQL")。
注册元数据揭示的 Studio 集成细节
registerGraphqlFetchParams(源码)定义了该函数在 Studio 中的呈现形态,也是理解其"既能查询又能变更"能力的关键:
isQuery: true与isMutation: true:意味着它既可作为数据查询在页面加载时执行,也可作为**变更(mutation)**绑定到元素交互(如按钮 onClick)。isQuery/isMutation的语义定义见 packages/host/src/registerFunction.ts。- 参数面板采用
display: "flatten"的对象形式,各字段配置:url:字符串输入,必填;method:四选一选择器(GET/POST/PUT/DELETE),默认POST;request:GraphQL 代码编辑器(lang: "graphql"),必填,且编辑器的header 与 endpoint 提示会动态取自opts.headers与opts.url(headers: ([opts]) => opts?.headers、endpoint: ([opts]) => opts?.url ?? "");varOverrides:显示名为 "Variable overrides" 的对象输入。
在项目代码中接入
安装
pnpm add @plasmicpkgs/graphql @plasmicapp/host @plasmicpkgs/fetch # 或 npm install @plasmicpkgs/graphql @plasmicapp/host @plasmicpkgs/fetch注意@plasmicpkgs/graphql声明了 peer 依赖@plasmicapp/host >= 1.0.211与@plasmicpkgs/fetch ^0.0.5,安装时需要一并满足。
使用 loader 注册(推荐)
在 loader 模式(如 Next.js 的plasmic-init.ts)中:
import { registerGraphQL } from "@plasmicpkgs/graphql"; // 或直接从本地源码路径引入:plasmicpkgs/graphql/src/index.ts registerGraphQL(); // 全局注册,函数会出现在 Studio 的 "GraphQL" 数据查询中若使用自定义 loader 实例,则可改为registerGraphQL(loader)。
直接调用函数(脱离 Studio)
fetchGraphQL本身就是普通 async 函数,可在任意 JS/TS 环境中直接调用:
import { fetchGraphQL } from "@plasmicpkgs/graphql"; const res = await fetchGraphQL({ url: "https://graphql.contentful.com/content/v1/spaces/YOUR_SPACE_ID", method: "POST", headers: { Authorization: "Bearer YOUR_ACCESS_TOKEN", }, request: { query: ` query GetPosts { blogPostCollection(order: date_DESC, limit: 10) { items { slug title date } } } `, }, }); console.log(res.statusCode); // 200 console.log(res.body.data); // GraphQL data作为 GraphQL 查询与响应解析的参考范式,仓库的 examples/contentful/lib/api.ts 展示了针对 Contentful GraphQL 端点(含Authorization头、查询字符串常量、data字段提取)的完整写法,其中query字符串与响应提取逻辑可平滑迁移到fetchGraphQL的request.query与body.data上。
在 Studio 中的典型用法
- 打开 Plasmic Studio,进入支持数据查询的组件/页面;
- 添加数据查询(Data Query),选择
GraphQL函数; - 填写URL(GraphQL 端点)与GraphQL 查询(
request代码编辑器会基于 URL 提供端点补全); - 按需选择method(默认 POST)、配置headers(如认证 Token);
- 若需运行时动态变量,通过Variable overrides传入覆盖值;
- 查询结果以
{ statusCode, headers, body }形式暴露,绑定到组件属性时取body.data路径; - 若要触发写操作(mutation),将该函数绑定到元素交互动作,函数元数据中
isMutation: true使 Studio 允许此用途。
注意事项与边界
- 查询字符串长度:GET 方式将整个 query 与序列化后的 variables 放入 URL,超长查询可能导致 URL 超限或被代理截断,复杂查询建议使用 POST。
- 变量合并优先级:
varOverrides始终覆盖request.variables中的同名键,请避免命名冲突造成意外覆盖。 - 错误处理:网络/HTTP 层错误由
@plasmicpkgs/fetch以HttpError(携带status与info)抛出;GraphQL 层错误(errors数组)则以正常 200 返回在body.errors中,需要在业务侧判断。 - 版本约束:包名与 API 以当前仓库为准(
0.0.48),peer 依赖@plasmicapp/host >= 1.0.211;Studio 内嵌注册入口见 platform/canvas-packages/src/graphql.ts。
进一步阅读
- 公共 API 报告:plasmicpkgs/graphql/api/index.api.md
- 核心实现:plasmicpkgs/graphql/src/index.ts
- 底层 HTTP 执行器:plasmicpkgs/fetch/src/index.ts
- 自定义函数注册机制与元数据定义:packages/host/src/registerFunction.ts
- 包配置与依赖声明:plasmicpkgs/graphql/package.json
- GraphQL 查询参考范式:examples/contentful/lib/api.ts
- 低代码
- 前端
- 后端
【免费下载链接】plasmic
Visual builder for React. Build apps, websites, and content. Integrate with your codebase.
相关推荐
SVGR与GraphQL:在数据查询中集成SVG组件的方案
SVGR与GraphQL:在数据查询中集成SVG组件的方案 你是否还在为数据可视化中的图标系统与GraphQL数据查询难以协同工作而烦恼?本文将展示如何通过SV
前端开发工具next.roadmap.sh 中的 GraphQL 集成:高效数据查询方案
next.roadmap.sh 中的 GraphQL 集成:高效数据查询方案 GraphQL 作为一种高效的数据查询语言,在 next.roadmap.sh 项
DataV GraphQL集成:高效数据查询方案
DataV GraphQL集成:高效数据查询方案 引言:数据可视化的痛点与解决方案 在现代数据可视化(Data Visualization)项目中,开发者常常面
前端数据可视化UI组件
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考