在 Vue 3 中调用 Midway 函数式 API:@midwayjs/vue 桥接插件与组合式 API 实践指南

发布时间:2026/9/29 5:53:29
在 Vue 3 中调用 Midway 函数式 API:@midwayjs/vue 桥接插件与组合式 API 实践指南 后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载导读midwayjs/vue是 Midway 框架为 Vue 3 前端提供的一套“函数式 API 桥接”集成包它让 Vue 应用可以直接复用后端 Midway 项目中通过defineApi声明的 API 定义以api.user.getUser({ params: { id } })这样类型安全、语义化的方式发起请求。本文基于该包源码与仓库内可运行的 samples/vue-functional-api 示例讲解从安装、注册插件到组合式调用、Provider 注入的完整链路并深入src/index.ts揭示其基于 Vue 3provide/inject的底层实现原理。背景什么是 Midway 函数式 API 桥接Midway 的函数式 APIFunctional API允许开发者用defineApi在服务端集中声明路由并自动生成可供前端直接调用的“API 客户端”结构。midwayjs/vue与midwayjs/react、midwayjs/api-bridge、midwayjs/web-bridge同属于这一桥接家族midwayjs/web-bridge是运行时依赖负责提供createClient等核心客户端能力其 src/index.ts 直接export * from midwayjs/api-bridgemidwayjs/vue在其之上补齐 Vue 专属的插件与组合式 API让 Vue 组件可以用最“Vue 化”的方式消费客户端。从 package.json 可以看到midwayjs/vue将midwayjs/web-bridge作为依赖并将vue声明为peerDependencies要求vue 3因此它天然面向 Vue 3 组合式 API 生态。安装与依赖npm i midwayjs/vue midwayjs/web-bridge对应的package.json依赖声明为{ dependencies: { midwayjs/vue: ^4.0.0-beta.11, midwayjs/web-bridge: ^4.0.0-beta.11 } }要点说明vue无需显式安装为依赖但运行时版本需满足 3peerDependencies 约束否则插件注入与组合式函数将不可用midwayjs/web-bridge提供客户端核心createClientmidwayjs/vue提供 Vue 集成层二者需成对安装当前仓库中该包版本为4.2.3engines要求node 20构建产物同时提供 CommonJSdist/index.js与 ESMdist/index.mjs双格式并通过exports字段区分require与import入口见 packages/vue/package.json。基本用法插件注册 组合式调用1. 创建 Vue 应用并注册插件import { createApp } from vue; import { createMidwayApiPlugin } from midwayjs/vue; import { api } from ./api/client; import App from ./App.vue; createApp(App).use(createMidwayApiPlugin(api)).mount(#root);createMidwayApiPlugin(client)返回一个标准的 Vue 3 插件对象Plugin其内部通过app.provide(InjectionKey, client)将客户端实例注入到整个应用上下文见 src/index.ts此后任意组件树中都能取到同一个客户端实例。2. 在组件中调用 APIimport { useMidwayApiOperation } from midwayjs/vue; const callGetUser useMidwayApiOperation{ params: { id: string } }, { id: string }(user.getUser); await callGetUser({ params: { id: 1 } });useMidwayApiOperation是一个组合式函数Composable它接收operationId如user.getUser格式为模块名.路由名返回一个绑定好该操作 ID 的调用函数。泛型参数TInput, TOutput分别约束入参与返回值类型从而在编译期获得完整的类型提示。客户端创建从服务端 API 定义到api.user.getUser配合仓库内的可运行示例 samples/vue-functional-api完整的链路如下。服务端声明 API 定义// samples/vue-functional-api/src/server/api/user.api.ts import { defineApi } from midwayjs/core/functional; export const userApi defineApi(/users, api ({ getUser: api .get(/:id) .meta({ routerName: getUser }) .handle(async ({ input }) { return { id: input.params?.[id], name: harry, }; }), }));前端创建命名空间客户端// samples/vue-functional-api/src/web/api/client.ts import { createClient } from midwayjs/vue; import { userApi } from ../../server/api/user.api.js; export const api createClient( { user: userApi, }, { basePath: { browser: /api, server: http://127.0.0.1:7001/api, }, } );createClient的键user会成为调用前缀最终形成api.user.getUser(...)的链式调用风格。basePath支持browser/server双配置便于同构CSR/SSR场景下区分浏览器相对路径与服务器绝对路径。核心链路createClient 如何工作测试用例 test/index.test.ts 精确验证了这一行为传入带__midwayApiMeta.prefix与路由元信息的 API 定义后api.user.getUser({ params: { id: u-1 } })会按get /users/:id解析并调用底层的adapter最终返回{ id: u-1 }。也就是说createClient负责把声明式的路由元数据method、path、routerName转换为真实请求并通过可替换的adapter决定实际网络发送方式。核心 API 与底层实现源码级解析midwayjs/vue的全部导出集中在 src/index.ts除createClient来自 web-bridge外共提供 4 个 Vue 专属能力其实现全部建立在 Vue 3 的依赖注入机制之上。客户端类型约定interface MidwayApiClientLike { call(operationId: string, input: unknown): Promiseunknown; has(operationId: string): Promiseboolean | boolean; operationIds(): Promisestring[] | string[]; }这是桥接层的“最小客户端契约”call执行调用、has判断某操作是否存在、operationIds枚举全部操作 ID。只要对象满足该形状例如由createClient生成的真实客户端或测试中的 mock即可被注入与消费。注入键与 Provider 组件const MidwayApiClientInjectionKey: InjectionKeyMidwayApiClientLike Symbol(MidwayApiClient);注入键是Symbol(MidwayApiClient)配合 TypeScript 的InjectionKeyT泛型保证注入/取用时类型一致除插件方式外包内还提供了声明式组件MidwayApiProviderdefineComponent通过props.client接收客户端并在setup中provide给子树适合“局部注入”而非全局注册的场景见 src/index.ts。插件与组合式函数export function createMidwayApiPlugin(client: MidwayApiClientLike): Plugin { return { install(app) { app.provide(MidwayApiClientInjectionKey, client); }, }; }插件本质是对app.provide的一次封装而组合式函数则通过inject反向获取export function useMidwayApiClientTInput unknown, TOutput unknown() { const client inject(MidwayApiClientInjectionKey, null); if (!client) { throw new Error( useMidwayApiClient must be used inside app.use(createMidwayApiPlugin(client)) or MidwayApiProvider ); } // ... } export function useMidwayApiOperationTInput unknown, TOutput unknown( operationId: string ) { const client useMidwayApiClientTInput, TOutput(); return (input: TInput) client.call(operationId, input); }由此形成清晰的依赖链createApp(App).use(createMidwayApiPlugin(api)) // 全局注入 ↓ provide(Symbol(MidwayApiClient), api) useMidwayApiClient() // inject 取回客户端 ↓ useMidwayApiOperation(user.getUser) // 绑定 operationId ↓ await callGetUser({ params: { id: 1 } }) // client.call(user.getUser, input)错误保护未注入时的显式报错useMidwayApiClient在取不到客户端时抛出异常提示必须通过app.use(createMidwayApiPlugin(client))或MidwayApiProvider注入。对应测试 test/index.test.ts 明确断言了该错误信息帮助开发者快速定位“组合式函数用在了 Provider 之外”的常见误用。测试验证与 ESM 产物检查仓库为该包提供了两层测试保障单元测试test/index.test.ts覆盖客户端命名空间调用、插件install的provide调用次数与注入键expect.any(Symbol)、未注入时报错三组关键行为ESM 产物冒烟测试test/esm-dist.test.mjs直接import构建产物dist/index.mjs断言createClient、createMidwayApiPlugin、MidwayApiProvider、useMidwayApiClient、useMidwayApiOperation均已正确导出且可运行并使用自定义adapter验证createClient的operationId与input传递。这一“单测 dist 冒烟”的组合既验证了源码逻辑也保证了发布后双格式产物CJS/ESM的可用性。仓库内可运行的完整示例若希望端到端体验仓库内置了 Vue Midway 函数式 API 的可运行示例 samples/vue-functional-api# 在仓库根目录 pnpm install # 启动内置 Vite 开发服务器 内嵌 Midway HTTP 运行时 pnpm -C samples/vue-functional-api dev该示例的关键配置src/server/api/user.api.ts用defineApi(/users, ...)声明getUser、createUser两个操作src/web/api/client.tscreateClient({ user: userApi })并配置浏览器端/api、服务端http://127.0.0.1:7001/api双 basePathsrc/main.tscreateApp(App).use(createMidwayApiPlugin(api)).mount(#root)与本文核心用法完全一致后端为真实 Midway Koa 应用imports: [koa]/api/*请求由真实路由处理构建时可通过pnpm -C samples/vue-functional-api build:server与build:web拆分产出分别输出dist/server与dist/web。小结midwayjs/vue将 Midway 的函数式 API 桥接能力“翻译”成了 Vue 3 开发者熟悉的表达方式插件式注册createMidwayApiPlugin(api)全局注入客户端一行代码完成初始化组合式调用useMidwayApiOperation/useMidwayApiClient让组件内调用与 Vue 响应式生命周期自然融合Provider 局部注入MidwayApiProvider提供按子树注入的灵活性类型安全InjectionKey 泛型约束贯穿注入、取用与调用全过程。其底层实现极简而可靠一个Symbol注入键 provide/inject机制 最小客户端契约call/has/operationIds。理解这层实现后无论是接入现有 Vue 项目、排查“组合式函数未注入”报错还是基于同一契约实现自定义桥接层都会更加得心应手。赞分享后端微服务云原生【免费下载链接】midway A Node.js Serverless Framework for front-end/full-stack developers. Build the application for next decade. Works on AWS, Alibaba Cloud, Tencent Cloud and traditional VM/Container. Super easy integrate with React and Vue. 项目地址https://gitcode.com/gh_mirrors/mi/midway点击查看免费下载相关推荐Windows系统优化工具终极指南5分钟完成2小时的手动优化Windows系统优化工具终极指南5分钟完成2小时的手动优化 你是否厌倦了Windows系统缓慢、预装软件过多、隐私设置复杂的问题面对分散的系统管理工具和繁桌面应用运维Vue Native中的组合式APIsetup函数与Composition APIVue Native中的组合式APIsetup函数与Composition API 在移动应用开发中随着项目复杂度提升传统Options API选项式A移动开发跨平台前端gh_mirrors/vit/vitesse中的Vue 3组合式API实践gh_mirrors/vit/vitesse中的Vue 3组合式API实践 组合式API简介 组合式APIComposition API是Vue 3引入的新前端示例工程上一篇R3nzSkin国服换肤工具如何安全实现英雄联盟皮肤自定义下一篇终极免费实时屏幕翻译指南5分钟上手Translumo打破游戏与视频语言障碍创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考