ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

深入 @urql/solid-start:基于 SolidStart 原生原语的 SSR GraphQL 集成方案

深入 @urql/solid-start:基于 SolidStart 原生原语的 SSR GraphQL 集成方案 前端【免费下载链接】urqlThe highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.项目地址https://gitcode.com/gh_mirrors/ur/urql点击查看免费下载urql/solid-start是 urql 生态中专门面向 SolidStart 应用的 GraphQL 集成包以 SolidStart 的query、action、createAsync等原生原语为核心将 URQL 的查询、变更与实时订阅能力无缝接入服务端渲染SSR流程。本文以该包的两个版本v0.1.0 初始发布与 v0.2.0 修复为脉络结合仓库源码与测试梳理其 API 设计、上下文机制、SSR 集成原理及关键演进帮助你理解并正确使用这一方案。包定位为 SolidStart SSR 而生根据 README.md 的明确说明urql/solid-start专为SolidStart 应用带 SSR设计而纯客户端 SolidJS 应用应使用urql/solid。两者使用场景的差异在 README 的对比表中得到清晰呈现使用场景使用包理由客户端 SPAurql/solid针对纯客户端应用优化使用 SolidJS 响应式模式SolidStart SSR 应用urql/solid-start与 SolidStart 的路由、SSR 与 action 系统集成这一分工决定了两个包 API 形态的根本差异urql/solid的createQuery返回[AccessorOperationResult, AccessorReExecute]的响应式元组而urql/solid-start的createQuery返回一个可被createAsync()包裹的查询函数从而获得 SolidStart 的缓存、去重与流式渲染能力。从源码看包的导出结构index.ts也很克制它直接重导出urql/core的全部内容并暴露Provider、useAction、useClient、useQuery、createQuery、createMutation、createSubscription与MaybeAccessor类型整体是对 URQL 核心的精简包装。核心 API 一览v0.1.0 初始发布CHANGELOG 的 v0.1.0 条目记录了初始发布的核心能力逐一展开如下。createQuery借助 SolidStart 的 query 与 createAsynccreateQuery(queryDocument, key, options?)使用 SolidStart 的query与createAsync原语创建查询函数query函数从上下文中自动获取无需手动注入。参数包括queryDocument: DocumentInput— GraphQL 查询文档key: string— SolidStart 路由缓存键options?: object— 可选配置variables查询变量、requestPolicy缓存策略、context额外PartialOperationContext典型用法详见 README.md 的 Quick Startconst queryTodos createQuery(TodosQuery, todos-list); const todos createAsync(() queryTodos());源码实现createQuery.ts揭示了一个关键细节createQuery在模块级调用useQuery()取出query原语随后返回一个函数。该函数在真正执行时会通过检测首参数是否具有executeQuery方法来区分两种调用形态——传入client直接使用自定义客户端或省略客户端时自动回退到上下文中的useClient()。最终它通过createRequest构造请求并调用client.executeQuery(request, context).toPromise()以 Promise 形式返回结果这与createAsync的异步模型天然契合。createMutationaction 驱动的渐进增强createMutation(mutation, key)基于 SolidStart 的action原语创建变更 action可配合useAction()与useSubmission()用于表单处理与渐进增强。其实现createMutation.ts同样从上下文中取出client与action并将client.executeMutation(request, context)的结果通过 wonka 的filter(result !result.hasNext)、take(1)、toPromise管线收敛为单个 Promise 结果——这保证了当 mutation 结果为流式如defer分片时只取最终完成的那一份。createSubscription实时订阅与数据累积createSubscription(args, handler?)支持实时订阅参数中的variables、context、pause均可接受响应式 accessorMaybeAccessorT实现自动重订阅。可选的handler函数(previousData, newData) data用于累积/变换订阅数据例如消息列表中不断追加新消息const [messages] createSubscription( { query: MessagesSubscription }, (prev [], data) [...prev, data.messageAdded] );从源码看createSubscription.ts该实现内部使用createComputed监听pause与variables的变化当pause为true时清空订阅源否则调用client.executeSubscription(request, context)生成新的 wonka 源。订阅结果通过createStore维护fetching、stale、data、error、extensions、operation状态并在每次推送时以reconcile合并新数据、以batch批量更新同时注册onCleanup在组件卸载或源切换时自动退订。Provider 与 useClient上下文中的客户端与路由原语Provider的value由三部分组成clientURQL 客户端、querySolidStart 的 query 原语、actionSolidStart 的 action 原语。对应的消费 Hook 分别为useClient()、useQuery()、useAction()。在 app.tsx 的示例中可以见到标准装配方式——在 SolidStart 的Router根部以root属性注入ProviderRouter root{props Provider value{{ client, query, action }}{props.children}/Provider} FileRoutes / /Router上下文实现context.ts中有一个值得注意的防御逻辑hasContext会在非生产环境下检测上下文是否为空若缺失则抛出No ${type} has been specified using urqls Provider. ...的错误帮助开发者快速定位忘记挂 Provider的配置问题。context.test.tsx 中的第二个测试用例正是验证了这一行为——在无 Provider 包裹时调用useClient()会抛错。v0.2.0 关键修复SSR 运行时失败的根因与解法CHANGELOG 的 v0.2.0 条目包含两项实质变更理解它们对生产环境至关重要。修复一action 从模块加载时导入改为 Provider 上下文读取Fix SSR runtime failures caused by importing SolidStartsactionAPI at module load time by readingactionfromProvidercontext instead背景若在模块顶层直接import { action } from solidjs/router那么在服务端渲染期间模块被加载时SolidStart 的actionAPI 就会被实例化/求值进而可能访问服务端并不具备的运行时环境如请求上下文、浏览器 API 等导致 SSR 运行时崩溃。解法将action的获取时机从模块加载时推迟到真正创建 mutation action 时即通过Provider上下文注入action组件内调用useAction()从 context 中读取。这正是 createMutation.ts 中const action useAction();这一行的来历——action 只在使用者组件渲染而非包模块加载时才被解析。这一修复也体现在包的 API 形态上Provider的value必须显式传入action例如在 examples/with-solid-start 示例中value{{ client, query, action }}的写法就是把路由原语的控制权交给应用由应用决定何时、以何种方式提供它们。修复二createSubscription 改用 urql/solid-start 上下文FixcreateSubscriptionto useurql/solid-startcontext instead of re-exporting the Solid-only implementation fromurql/solid背景v0.1.0 的createSubscription复用了urql/solidSolid 生态的实现。但在 SolidStart 场景下urql/solid的订阅实现所依赖的客户端上下文与urql/solid-start的Provider并不是同一个上下文导致在 SolidStart 应用中订阅无法正确取得客户端。解法将createSubscription改为从urql/solid-start自身的 context 中取客户端。从源码可见createSubscription.ts 顶部导入的是import { useClient } from ./context与createQuery、createMutation共用同一套上下文——这正是 CHANGELOG 所述修复的代码级印证。也就是说查询、变更、订阅三类操作现在都统一从同一Provider读取客户端与路由原语避免了跨包上下文不一致带来的隐性问题。响应式变量与动态查询的边界README 与测试均提示了一个重要边界由于 SolidStart 的query()原语不会在变量变化时自动重新执行createQuery传入的静态variables属于一次性配置若要实现切页重新拉取这类动态行为需要将queryUser()的调用放在createAsync内部并让响应式依赖如createSignal触发createAsync的重算const [userId, setUserId] createSignal(1); const queryUser createQuery(UserQuery, user-details, { variables: { id: userId() }, }); const user createAsync(() queryUser());createQuery.test.tsx 中有一个被it.skip跳过的测试用例其注释明确说明了这一点SolidStarts query() primitive doesnt automatically re-execute when variables change... This is expected behavior for SolidStart.这是使用该包时必须理解的行为边界——它不是缺陷而是 SolidStartquery缓存语义的一部分。测试用例揭示的行为契约仓库内的测试文件进一步固化了各 API 的行为契约createMutation.test.ts 验证了四个核心场景createMutation返回可调用函数通过 action 执行 mutation 并返回data当服务端返回错误时结果包含errorgraphQLErrors等字段以及将自定义context如requestPolicy: network-only透传给client.executeMutation。createQuery.test.tsx 验证了查询可执行通过 wonka subject 推送数据后createAsync收到结果以及pause选项存在时不会触发executeQuery。context.test.tsx 验证了Provider能向useClient与useAction正确传递值并验证缺失 Provider 时的报错行为。这些测试与源码共同构成了一份可验证的行为清单查询 Promise 化、变更流收敛、订阅自动退订、上下文统一、错误透传。安装与依赖说明安装urql/solid-start时需一并安装其运行时依赖README.md 的 Installation 章节npm install urql/solid-start urql/solid urql/core graphql # 或 pnpm add / yarn add 等效其中urql/solid是订阅功能所需的 peer 依赖urql/core提供createClient、cacheExchange、fetchExchange、gql等基础设施。包的运行时工具来自 Solid 生态标准库solid-primitives/utilsutils.ts 直接重导出其中的access、asAccessor与MaybeAccessor类型这也是 CHANGELOG v0.1.0 中Uses solid-primitives/utils条目对应的实现事实。版本演进一览版本类型关键变更0.1.0初始发布提供createQueryquery createAsync、createMutationaction useAction、createSubscription、Provider/useClient、响应式变量、完整 SSR 支持、TypeScript 类型、基于solid-primitives/utils0.2.0Minor / Patch修复 SSR 运行时失败action 改为从 Provider context 读取而非模块加载时导入createSubscription改用urql/solid-start自身 context取代对urql/solid实现的复用从 0.1.0 到 0.2.0 的演进主线清晰将包与 SolidStart 运行时原语的耦合从模块加载期彻底推迟到组件渲染期并统一所有 API 的上下文来源。这既是 SSR 稳定性的保障也是该包区别于urql/solid的核心设计哲学——如果要在 SolidStart 中构建带 SSR 的 GraphQL 应用urql/solid-start提供了与路由缓存、渐进增强和流式渲染深度绑定的开箱方案。赞分享前端【免费下载链接】urqlThe highly customizable and versatile GraphQL client with which you add on features like normalized caching as you grow.项目地址https://gitcode.com/gh_mirrors/ur/urql点击查看免费下载相关推荐urql × SolidStart 集成指南用 urql/solid-start 打造服务端渲染的 GraphQL 应用urql × SolidStart 集成指南用 urql/solid start 打造服务端渲染的 GraphQL 应用 本指南系统讲解如何在 SolidS前端深入解读 tanstack/solid-start-serverTanStack Solid Start 的 SSR 服务端渲染核心深入解读 tanstack/solid start serverTanStack Solid Start 的 SSR 服务端渲染核心 导读 tanstac前端路由SSR如何快速掌握Babel Handbook工具与插件生态系统完整指南如何快速掌握Babel Handbook工具与插件生态系统完整指南 Babel是一个强大的JavaScript编译器它允许开发者使用最新的JavaScrip前端上一篇Angular 2中的WebGL可视化基于gh_mirrors/awe/awesome-angular2的图形应用下一篇Shoelace终极指南如何通过响应式属性系统快速构建动态UI组件创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表