集成OpenAPI
alova 的开发工具可以展现出它更强大的力量。
- 自动生成请求代码和响应数据类型,在 js 项目中也能体验对接口数据的智能提示。
- 将 api 文档嵌入代码中,在编辑器中直接查看每个 API 的详细信息。
- 定时更新 api 并主动通知前端开发,不再依赖服务端开发人员通知。
这将打破过去的开发流程,在过去,当后端开发者交付 API 给你后,你需要先打开中间的 API 文档查询并复制关键 信息到你的项目里,你需要不断地在中间的 API 文档与编辑器切换,但现在,alova 的开发工具可以为你消除中间的 API 文档,通过它你可以在编辑器中快速查找所需的 API 并展示这个 API 的完整文档,参照 API 参数表快速完成参数传递,像虫洞一样拉近前后端的协作距离。
演示视频
安装
安装@alova/wormhole和 vscode 扩展,@alova/wormhole提供自动生成特性,vscode 扩展可以快速调用@alova/wormhole的能力,并提供在编辑器中浏览 API 文档,并快速查找接口文档的快捷键。
或者在扩展市场中搜索"alova",支持 swagger-v2 和 openapi-v3 规范
- npm
- yarn
- pnpm
npm install @alova/wormhole --save-dev
yarn add @alova/wormhole --dev
pnpm add @alova/wormhole -D
WebStorm 等非 vscode 系列的编辑器暂不提供编辑器扩展,你可以通过 @alova/wormhole 的命令 来自动生成 api 调用函数、api 的完整 TypeScript 类型和 api 文档信息。
配置
使用扩展时,你需要指定从 openapi 文件的输入源和输出目录等,你可以在项目根目录下创建配置文件,它支持以下格式:
alova.config.cjs:commonjs 规范的配置文件,使用module.exports导出配置。alova.config.js:ESModule 规范的配置文件,使用export default导出配置。alova.config.ts:typescript 格式的配置文件,使用export default导出配置。
也可以通过@alova/wormhole开发工具提供的alova init命令快速创建配置文件模板。
具体的配置参数和解释如下,以 commonjs 为例。
import { defineConfig } from '@alova/wormhole';
import { rename } from '@alova/wormhole/plugin';
module.exports = defineConfig({
// api生成设置数组,每项代表一个自动生成的规则,包含生成的输入输出目录、规范文件地址等等
generator: [
// 服务器1
{
// input参数1:openapi的json文件url地址
input: 'http://localhost:3000/openapi.json',
// 配置一个或多个插件,每个generator项单独设置
plugins: [
rename({
style: 'camelCase'
})
],
// input参数2:以当前项目为相对目录的本地地址
// input: 'openapi/api.json'
// input参数3:没有直接指向openapi文件时,是一个文档地址,必须配合platform参数指定文档类型
// input: 'http://192.168.5.123:8080'
// (可选)platform为支持openapi的平台,目前只支持swagger,默认为空
// 当指定了此参数后,input字段只需要指定文档的地址而不需要指定到openapi文件
platform: 'swagger',
// 接口文件和类型文件的输出路径,多个generator不能重复的地址,否则生成的代码会相互覆盖
output: 'src/api',
// (可选)指定生成的响应数据的mediaType,以此数据类型来生成2xx状态码的响应ts格式,默认application/json
responseMediaType: 'application/json',
// (可选)指定生成的请求体数据的bodyMediaType,以此数据类型来生成请求体的ts格式,默认application/json
bodyMediaType: 'application/json',
// (可选)指定生成的api版本,默认为auto,会通过当前项目安装的alova版本判断当前项目的版本,如果生成不正确你也可以自定义指定版本
version: 'auto',
/**
* (可选)生成代码的类型,可选值为auto/ts/typescript/module/commonjs,默认为auto,会通过一定规则判断当前项目的类型,如果生成不正确你也可以自定义指定类型:
* ts/typescript:意思相同,表示生成ts类型文件
* module:生成esModule规范文件
* commonjs:表示生成commonjs规范文件
*/
type: 'auto',
/**
* 全局导出的api名称,可通过此名称全局范围访问自动生成的api,默认为`Apis`,配置了多个generator时为必填,且不可以重复
*/
global: 'Apis',
/**
* 全局api对象挂载的宿主对象,默认为 `globalThis`,在浏览器中代表 `window`,在nodejs中代表 `global`
*/
globalHost: 'globalThis',
/**
* (可选)过滤或转换生成的api接口函数,返回一个新的apiDescriptor来生成api调用函数,未指定此函数时则不转换apiDescripor对象
*
* `apiDescriptor` 的类型和 openapi 文件的 api 项相同。
* @see https://spec.openapis.org/oas/v3.1.0.html#operation-object
*/
handleApi: apiDescriptor => {
// 返回falsy值表示过滤此api
if (!apiDescriptor.path.startsWith('/user')) {
return;
}
apiDescriptor.parameters = (apiDescriptor.parameters || []).filter(
param => param.in === 'header' && param.name === 'token'
);
delete apiDescriptor.requestBody.id;
apiDescriptor.url = apiDescriptor.url.replace('/user', '');
return apiDescriptor;
}
},
// 服务器2
{
// ...
}
],
// (可选)是否自动更新接口,默认开启,每5分钟检查一次,false时关闭
autoUpdate: true
/* 也可以配置更详细的参数
autoUpdate: {
// 编辑器开启时更新,默认false
launchEditor: true,
// 自动更新间隔,单位毫秒
interval: 5 * 60 * 1000
}
*/
});
handleApi钩子函数
需要注意的是,handleApi钩子函数可以自定义修改任意的API配置,例如修改API的参数名称、类型和返回值类型等,这将在OpenAPI文件错误或不详细的时候非常有用。
它将在生成每个api前被调用,接收apiDescription并返回修改后的apiDescription,它包含对应openapi文件中的每个api信息,具体参数可参考 OpenAPI Spec Operation Object
以下是几个示例。
修改api函数名
// 将下划线命名改为驼峰
const handleApi = apiDescription => {
apiDescription.operationId = apiDescription.operationId.replace(
/_([a-z])/g,
function (match, group) {
return group.toUpperCase();
}
);
return apiDescription;
};
修改tag
const handleApi = apiDescription => {
if (apiDescription.url.includes('/user')) {
apiDescription.tags = ['userTag'];
}
return apiDescription;
};
修改response数据生成
生成response.data对应的类型。
const handleApi = apiDescription => {
apiDescriptor.responses = apiDescriptor.responses?.properties?.data;
return apiDescriptor;
};
wormhole插件
为了简化生成数据的修改逻辑,alova 开发工具还支持配置plugin,目前提供了以下预设插件。
- rename: 重命名api调用函数和参数名,支持驼峰和下划线命名,也支持自定义修改。
- tagModifier: 修改api的tag名称。
- payloadModifier: 增加、删除和修改api的参数类型。
- filterApi: 根据url和tag匹配过滤api。
- apifox: 自动导入apifox中的项目,不需要再每次手动导出。
- importType: 用来排除需要自定义的类型,改用用户自定义的类型。
你可以在generator中配置plugins来使用插件,它们将会按配置顺序执行。
export default defineConfig({
generator: [
{
// ...
plugins: [
rename(...),
tagModifier(...),
]
}
]
})
如果需要自定义创建插件,请查看 插件开发指南。
使用
生成的 API 代码可通过Apis变量访问,可在配置文件中的global自定义变量名,你可以在编辑器中快速查看每个 API 的信息。

其中pet是 API 的 tag,API 名称对应operationId。

你可以通过两种方式访问Apis
全局挂载(默认)
可以在main.[js/ts]入口文件中引入自动生成目录下的index.[js/ts]。
import './your-generating-api-folder';
导入
在需要使用的文件中导入Apis变量。
import { Apis } from './your-generating-api-folder';
此时你需要在your-generating-api-folder/index.[js/ts]文件中删除mountApis(Apis),避免它被全局挂载。