ARTICLE DETAIL

资讯详情

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

openapi-fetch 集成 SvelteKit:端到端类型安全的 API 客户端实战指南

openapi-fetch 集成 SvelteKit:端到端类型安全的 API 客户端实战指南 开发工具代码生成后端【免费下载链接】openapi-typescriptGenerate TypeScript types from OpenAPI 3 specs项目地址https://gitcode.com/gh_mirrors/op/openapi-typescript点击查看免费下载本指南基于 openapi-fetch 仓库中的 SvelteKit 示例应用完整讲解如何在 Svelte / SvelteKit 项目中集成 openapi-fetch实现从 OpenAPI 规范生成 TypeScript 类型、构建类型安全 API 客户端并在客户端组件与 SvelteKit Page Data服务端加载两种场景下发请求的完整流程。读完本文你将掌握createClient客户端初始化、client.GET()类型安全的请求/响应推断、SvelteKitload函数中自定义fetch的注入以及服务端渲染下响应头序列化的必要配置。示例项目总览示例应用位于 packages/openapi-fetch/examples/sveltekit是一个基于 SvelteKit 2.x Svelte 5 的完整可运行项目演示了 openapi-fetch 在 SvelteKit 中的两种典型接入模式纯客户端模式Clientside在.svelte组件的onMount生命周期中直接调用 API见 src/routes/page.sveltePage Data服务端加载模式通过 SvelteKit 的page.ts的load函数在服务端获取数据并传给组件见 src/routes/page-data/page.svelte 与其配套的 src/routes/page-data/page.ts。示例使用的远端 API 是 Cat Facts APIhttps://catfact.ninja/其 OpenAPI 3.0 规范文件已保存在本地src/lib/api/v1.json并预先生成了对应的 TypeScript 类型声明文件 src/lib/api/v1.d.ts。快速启动安装依赖示例项目根目录下执行pnpm i项目的依赖清单见 package.json其中与本文主题直接相关的依赖是依赖说明openapi-fetchworkspace:^类型安全的 fetch 客户端运行时库体积小、零依赖openapi-typescriptworkspace:^负责把 OpenAPI 规范生成 TypeScript 类型sveltejs/kit、sveltejs/vite-plugin-svelte、svelteSvelteKit 框架本身示例使用 Svelte 5 的 runes 语法vite构建与开发服务器typescript、svelte-check类型检查工具pnpm run check注意这里openapi-fetch与openapi-typescript均以workspace:^方式引用当前 monorepo 内的源码包。在实际业务项目中请改为安装 npm 上发布的正式版本例如pnpm add openapi-fetch pnpm add -D openapi-typescript启动开发服务器pnpm run devdev脚本在 package.json 中定义为vite dev。启动后访问http://localhost:5173即可看到运行中的示例页面顶部有两个入口Client客户端模式与Page Data服务端加载模式。项目还内置了类型检查脚本pnpm run check # svelte-kit sync svelte-check --tsconfig ./tsconfig.json pnpm run check:watch # 监听模式项目结构与关键文件src/ ├── lib/ │ └── api/ │ ├── index.ts # 创建并导出 openapi-fetch 客户端唯一的客户端实例 │ ├── v1.d.ts # openapi-typescript 生成的类型paths 接口等 │ └── v1.json # Cat Facts API 的 OpenAPI 3.0 规范 ├── routes/ │ ├── page.svelte # 客户端模式示例 │ └── page-data/ │ ├── page.svelte # 消费服务端 load 数据的组件 │ └── page.ts # 服务端 load 函数 ├── app.d.ts ├── app.html └── hooks.server.ts # 服务端钩子配置响应头序列化其余配置文件包括 svelte.config.js使用vitePreprocess与adapter-auto、vite.config.ts仅引入sveltekit()插件、tsconfig.jsonstrict模式、moduleResolution: bundler与 app.htmlSvelteKit 入口 HTML。第一步用 openapi-typescript 生成类型SvelteKit 本身并不感知 API 的类型类型安全的核心前提是把 OpenAPI 规范文件转换为 TypeScript 类型声明。示例中这一步骤已完成产物是 src/lib/api/v1.d.ts文件头部注释明确标注/** * This file was auto-generated by openapi-typescript. * Do not make direct changes to the file. */该文件导出了一个核心接口paths按 URL 路径组织所有端点。例如v1.json规范中定义的/fact路径被映射为/fact: { parameters: { query?: never; header?: never; path?: never; cookie?: never; }; /** Get Random Fact description Returns a random fact */ get: operations[getRandomFact]; put?: never; post?: never; delete?: never; options?: never; head?: never; patch?: never; trace?: never; };每个 HTTP 动词对应规范中声明的 operation未声明的方法被标记为never从而在调用client.GET(/fact)时强制走类型检查。从源码结构看这就是 openapi-typescript 的核心能力解析 OpenAPI 3 规范JSON 或 YAML输出包含paths、components、operations等类型的.d.ts文件。在真实项目中可在 package.json 中注册生成脚本示例如下需根据实际 schema 路径调整{ scripts: { generate:api: openapi-typescript ./src/lib/api/v1.json -o ./src/lib/api/v1.d.ts } }生成的类型文件建议纳入版本控制当上游 OpenAPI 规范变更时重新运行生成命令即可让客户端类型与接口定义保持同步。第二步创建类型安全的客户端实例客户端实例集中在 src/lib/api/index.ts 创建并默认导出整个应用共享同一个实例import createClient from openapi-fetch; import type { paths } from ./v1; const client createClientpaths({ baseUrl: https://catfact.ninja/ }); export default client;要点说明createClientpaths是泛型工厂函数paths类型来自上一步生成的v1.d.ts此后所有请求的路径、参数、响应体都会被该类型约束baseUrl指向远端 API 的根地址SvelteKit 的路径别名$lib使$lib/api/index.js可以引用src/lib目录下的文件别名在 svelte.config.js 与 tsconfig.json 中按 SvelteKit 约定处理openapi-fetch 的客户端是零运行时依赖的轻量封装内部仍然基于标准fetch因此可以无缝运行在浏览器与 Node.js / SvelteKit 服务端两种环境。第三步两种请求模式实战模式一纯客户端请求Clientside在 src/routes/page.svelte 中请求发生在浏览器端的组件生命周期内script langts import { onMount } from svelte; import client from $lib/api/index.js; let fact: AwaitedReturnTypetypeof getFact | undefined $state(undefined); async function getFact() { return client.GET(/fact, { params: { query: { max_length: 500 }, }, }); } onMount(async () { fact await getFact(); }); /script div pExample: Client | a href/page-dataPage Data/a/p {#if fact} {#if fact.error} divThere was an error: {fact.error}/div {:else} precode{JSON.stringify(fact.data, undefined, 2)}/code/pre {/if} {/if} button typebutton onclick{async () (fact await getFact())} Another fact! /button /div值得注意的实现细节client.GET(/fact, { params: { query: { max_length: 500 } } })中路径/fact、查询参数max_length均由paths类型严格校验一旦拼错路径或参数TypeScript 会立即报错返回值是{ data, error, response }结构data 在 2xx 时携带响应体error 在非 2xx 时携带错误信息所以模板中用{#if fact.error} ... {:else} ... {/if}做分支渲染示例使用了 Svelte 5 的 runes 语法$state声明响应式状态onclick内联事件直接调用getFact()拉取新的随机事实并刷新页面该模式在组件挂载onMount后才发起请求因此适合数据无需 SEO、可接受首屏后异步加载的场景。模式二Page Data 服务端加载推荐SvelteKit 更推荐在load函数中预取数据再通过dataprop 注入组件。这一步在 src/routes/page-data/page.ts 完成import type { PageLoad } from ./$types; import client from $lib/api/index.js; // Note: this uses Svelte’s custom fetcher as an example, but Node’s // native fetch works, too. See Svelte’s docs to learn the difference: // see https://svelte.dev/docs/kit/load#Making-fetch-requests export const load: PageLoad async ({ fetch }) { const fact await client.GET(/fact, { params: { query: { max_length: 500 } }, fetch, }); return { fact: { data: fact.data, error: fact.error, }, }; };两个关键点注入 SvelteKit 的fetchopenapi-fetch 的请求选项支持传入自定义fetch函数。这里把 SvelteKitload上下文中的fetch传给client.GET()使得请求复用 SvelteKit 的 fetch 基础设施——它会在服务端渲染时直接请求目标 API并把结果连同响应序列化到客户端还能自动处理相对 URL、凭证与缓存策略。从源码结构看openapi-fetch 在 packages/openapi-fetch/src/index.js 中优先使用传入的fetch否则回退到全局fetch因此不传也完全可行使用 Node 原生 fetch类型安全的返回结构load返回{ fact: { data, error } }page.svelte通过PageProps类型自动获得精确推断。组件侧 src/routes/page-data/page.svelte 消费该数据script langts import type { PageProps } from ./$types; let { data }: PageProps $props(); /script div pExample: a href/Client/a | Page Data/p {#if data.fact.error} divThere was an error: {data.fact.error.message}/div {:else if data.fact.data} precode{JSON.stringify(data.fact.data, undefined, 2)}/code/pre {:else} divLoading.../div {/if} button typebutton onclick{() location.reload()}Another fact!/button /div组件使用 Svelte 5 的$props()rune 解构出data其类型由./$types中的PageProps提供该文件由svelte-kit sync生成与page.ts的返回类型保持同步。这里通过data.fact.error.message展示错误详情并提供了三种分支出错、成功、加载中。由于加载发生在服务端页面首屏即可拿到数据对 SEO 与首屏性能更友好。第四步服务端响应头序列化配置这是 SvelteKit openapi-fetch 集成中容易被忽略却至关重要的一步。SvelteKit 出于安全考虑默认不会把服务端 fetch 的响应头序列化给客户端但 openapi-fetch 需要依赖content-length响应头来判断空响应例如 204 No Content。若缺失该头空响应体的解析可能出错。src/hooks.server.ts 中的服务端钩子解决了这个问题import type { Handle } from sveltejs/kit; export const handle: Handle async ({ event, resolve }) { return resolve(event, { filterSerializedResponseHeaders(name) { // SvelteKit doesnt serialize any headers on server-side fetches by default but openapi-fetch uses this header for empty responses. return name content-length; }, }); };filterSerializedResponseHeaders返回true的响应头才会被序列化。这里仅放行content-length既补全了 openapi-fetch 判断空响应所需的信息又保持了最小化的头暴露面。代码注释直接点明了原因SvelteKit 默认不序列化任何服务端 fetch 的响应头而 openapi-fetch 使用该头处理空响应。类型安全验证与开发体验示例配套的类型检查命令pnpm run check即svelte-kit sync svelte-check会在开发期验证整个链路的类型一致性svelte-kit sync生成.svelte-kit/下的$types等声明文件保证./$types导入可用svelte-check依据 tsconfig.jsonstrict: true、moduleResolution: bundler、allowJs/checkJs对 Svelte 组件与 TS 代码做全量类型检查。你可以实际验证类型安全的效果把client.GET(/fact)改成client.GET(/facts)合法路径并传入错误的查询参数名或改成不存在的路径/foo保存后运行pnpm run checkTypeScript 会立刻指出类型不匹配——这正是从 OpenAPI 规范 → 生成类型 → 客户端调用这一整条类型链路的收益。小结与延伸通过这个 SvelteKit 示例可以看到 openapi-fetch 的完整集成套路准备持有 OpenAPI 3 规范如 v1.json用 openapi-typescript 生成类型如 v1.d.ts初始化在 src/lib/api/index.ts 中createClientpaths({ baseUrl })创建单例客户端消费客户端组件用onMountclient.GET()服务端用load函数 注入 SvelteKitfetch加固在 hooks.server.ts 放行content-length响应头保证空响应处理正确。两种模式可以按需组合对 SEO 敏感或需要首屏数据的页面走 Page Data 服务端加载对交互频繁、实时性要求高的局部区域走客户端请求。项目根目录的 docs/openapi-fetch 文档还提供了 middleware、测试docs/openapi-fetch/testing.md等进阶用法可作为继续深入 openapi-fetch 的起点。本示例的完整源码均可在 packages/openapi-fetch/examples/sveltekit 目录下查看与运行。赞分享开发工具代码生成后端【免费下载链接】openapi-typescriptGenerate TypeScript types from OpenAPI 3 specs项目地址https://gitcode.com/gh_mirrors/op/openapi-typescript点击查看免费下载相关推荐openapi-fetch基于OpenAPI的类型安全HTTP客户端openapi fetch基于OpenAPI的类型安全HTTP客户端 openapi fetch是一个轻量级HTTP客户端库专为现代Web开发设计完美结合开发工具代码生成后端openapi-fetch 完整指南为 OpenAPI 3 规范构建 6 kB 的类型安全 Fetch 客户端openapi fetch 完整指南为 OpenAPI 3 规范构建 6 kB 的类型安全 Fetch 客户端 openapi fetch 是 openapi开发工具代码生成后端告别命令行TortoiseGit让Git操作可视化零基础也能轻松上手告别命令行TortoiseGit让Git操作可视化零基础也能轻松上手 对于很多刚接触版本控制的开发者来说Git命令行常常让人望而生畏。繁杂的指令、晦涩的参桌面应用版本控制开发工具上一篇Seesaw v2集群管理双节点架构设计与部署规范下一篇eSpeak-NG文本转语音实操指南从安装到生成多语言音频的10分钟创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表