在早些年(约 2021 年)的时候就 介绍过 使用 proto 来做 IDL 生成 ts 代码,经过最近一段时间的使用,对这个使用流程做了一些优化。
我们利用 proto 来作为前后端的接口文档类似于下图这样:
我们后端使用的是 grpc-gateway ,这里前端这边使用 他 提供的 open-api-v2 插件生成 swagger 在通过 swagger-typescript-api 生成对应的 ts 代码。
有同学可能会提出问题为什么不直接使用 proto 来作为前后端通讯的方法,而要兜圈子,用 swagger 来作为中间媒介生成代码。这里在重新讲一下。
时至今日,我们依然可以发现 grpc-web 在 2024 年仍然没有成熟的框架+较好的调试工具来辅助开发,对比 json 形式的 restful api,其易用性 仍然需要打一个巨大的问号,对于需要投入生产的商业项目,在这点上不愿意以此为基础冒险使用一个 前景很不明朗 的项目。
流程管理
我们对于 proto 的流程大体上在编写代码前,我们会和后端一起约定 proto ,当 proto 约定完成以后合并到指定的分支,此时会触发 ci/cd 构建 go 代码并通知 ts 构建服务开始工作,ts 构建服务是一个中心化的 mono 大仓,储存了所有项目使用的 proto 产物。
ts 构建服务完成构建以后会提交到代码仓库作为备份,同时推送到内网的 npm 上。
此时前端就可以通过 @taptap/proto-xxx
安装并使用对应的接口。
构建脚本
构建脚本是一个比较简单的事情,我们使用一份较大的 setting.ts 作为配置文件管理所有的配置项目, 相关的脚本使用 ts-node 配合带类型的 zx 运行这样可以少写一下代码:
这样我们的构建脚本就可以通过读取配置来完成代码封装,核心代码是下面这样写,其他的拉取代码操作就是简单的 git 操作,不多赘述。
- zx 中调用 git 不能使用 promise.all 因为 git 本身是 带锁的,同时调用 会抛出异常 提示 ‘.git/index.lock’: File exists
- openapi_naming_strategy 建议使用 fqn 否则碰到重名会比较麻烦,会出现互相覆盖的问题
在上面的 proto 将会生产一个 swagger.json 文件到 src 目录下面,随后按照自己的喜好编写 swagger-typescript-api 的模板,在编译 swagger 到 ts 代码即可,如果有需要的话,最后一步使用 tsc 简单的编译为 js + d.ts 提升在开发环境下的 ts 提示性能。
生成结果
随后在项目里面配合 @taptap/tool-kit-fe-vue
使用即可: