使用Orval自动生成前端接口文件
使用Orval自动生成前端TypeScript接口文档
先决条件:
- 后端使用swagger接口文档,即可以打开一个接口文档的网页,内容全是JSON文本的网页。原理其实很简单就是用脚本读取这个网页的JSON数据,然后转换为前端的TypeScript文档。
- 前端必须使用TypeScript,其实TypeScript不难,学了之后前端开发会变简单。
安装使用教学:
先使用你熟悉的包管理器安装Orval:
npm i orval -D
yarn add orval -D
pnpm add orval -D
安装完毕之后在前端的根路径下创建一个 orval.config.ts的配置文件,我这里给个模版:
import { defineConfig } from 'orval'
export default defineConfig({
petstore: {
input: {
target: 'http://127.0.0.1:8088/api/v3/api-docs/default', // openapi 文档地址
},
output: {
target: 'src/api-client/index.ts', // 生成请求函数
schemas: 'src/api-client/models', // 生成的类型文件
workspace: 'src/api-client', // 基础目录
mode: 'tags-split', // 按 tags 拆分文件
client: 'axios', // 使用 axios 作为请求库
clean: true, // 每次生成前清空目录
mock: false, // 是否生成 mock
override: {
mutator: {
path: '../axios-instance.ts', // 自定义 axios 实例(相对 workspace)
name: 'axiosInstance',
},
},
},
hooks: {
afterAllFilesWrite: 'prettier --write ',
},
},
})
具体的配置可以参考官网:Orval官网
这里注意一下 mutator的配置,他可以自定义你请求实例的配置,这也是我选择它的缘故:
然后在src目录下创建一个Axios实例的配置文件,我这里也给出参考,可以自行根据需求修改:
import axios, { type AxiosInstance, type AxiosRequestConfig } from 'axios'
// 复用的 Axios 实例
const instance: AxiosInstance = axios.create({
baseURL: import.meta.env.VITE_API_BASE_URL,
timeout: 5000,
})
// 请求拦截器
instance.interceptors.request.use(
(config) => {
return config
},
(error) => {
return Promise.reject(error)
},
)
// 响应拦截器(统一返回 data)
instance.interceptors.response.use(
(response) => {
return response.data
},
(error) => {
return Promise.reject(error)
},
)
// Orval mutator 期望的签名:axiosInstance<T>(config) => Promise<T>
export const axiosInstance = async <T = unknown>(config: AxiosRequestConfig): Promise<T> => {
const response = await instance.request<T>(config)
// 上面的响应拦截器已将返回值转为 data,这里为了类型安全再断言一次
return response as unknown as T
}
注意我的 BaseUrl使用了Vite的一个配置文件,他可以动态的解析,生成环境的和开发环境两个的 BaseUrl不同。这里不细说了。
自此我们基本配置就完成了。然后去 package.json里添加一个脚本,方便使用:
"gen:api:orval": "orval --config orval.config.ts"
运行之后就可以在 src/api-client下面看到生成的配置文件:

这里注意一下,后端 Controller接口上的Tag标签不能用中文,用中文这里生成也是中文。。。
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 程序员Hanserwei
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果