Alova 是一个轻量级、面向前端的请求策略库,旨在简化 API 调用、优化性能并提升开发效率。它通过声明式的 Method
实例管理请求,将复杂的请求逻辑(如参数、缓存、状态管理)高度抽象,号称将传统 7 步请求流程简化为“一步到位”。Alova 与 Vue 3 的 Composition API 深度集成,提供了响应式状态管理、丰富的业务场景策略以及强大的扩展性,特别适合现代前端开发。
Method
实例封装请求信息,减少手动编码。Alova 的设计理念是将 API 调用的配置、状态和行为集中到一个 Method
实例中,开发者只需关注业务逻辑,无需处理繁琐的请求细节。
Alova 的核心机制包括 方法代理设计、状态代理设计 和 请求策略中间件,以下详细解析。
每个 API 请求都被封装为一个 Method
实例,包含 URL、请求方法、参数、头信息、缓存策略等。开发者通过 alovaInstance.Get
、Post
等方法创建 Method
实例,调用时无需手动拼接请求逻辑。例如:
const todoListGetter = alovaInstance.Get('/todos', {
params: { page: 1, size: 10 },
cacheFor: 1000 * 60, // 缓存 1 分钟
transformData: (rawData) => rawData.list
});
Method
实例不仅定义了请求,还支持复用、链式调用和动态修改,适合复杂项目中的 API 管理。
Alova 通过 statesHook
与 Vue 3 的响应式系统(如 ref
和 reactive
)深度集成。使用 useRequest
或 useWatcher
等 Hook,请求状态(如 loading
、data
、error
)会自动变为响应式,状态变化直接触发视图更新。例如:
const { loading, data, error } = useRequest(todoListGetter);
当请求完成或失败时,data
或 error
会自动更新,Vue 3 会同步刷新视图。
Alova 提供了中间件机制,允许开发者在请求前后插入自定义逻辑。例如,自动添加认证头:
const alovaInstance = createAlova({
beforeRequest(method) {
method.config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
}
});
此外,Alova 内置了 20+ 种策略(如分页、表单提交),通过中间件实现,极大简化了业务逻辑。
以下以 Vue 3 的 Composition API 和 为主,展示 Alova 在多种场景下的使用方式。
npm install alova alova/vue alova/fetch
在项目根目录创建一个 alova.js
文件:
import { createAlova } from 'alova';
import adapterFetch from 'alova/fetch';
import VueHook from 'alova/vue';
export const alovaInstance = createAlova({
baseURL: 'https://api.example.com',
statesHook: VueHook, // Vue 3 响应式 Hook
requestAdapter: adapterFetch(), // 使用 fetch 适配器
responded: response => response.json(), // 响应数据处理
beforeRequest(method) {
// 添加认证头
method.config.headers.Authorization = `Bearer ${localStorage.getItem('token')}`;
},
errorHandler(error) {
console.error('Request failed:', error);
return Promise.reject(error);
}
});
为确保类型安全,添加类型定义:
import { Alova } from 'alova';
declare module '@vue/runtime-core' {
interface ComponentCustomProperties {
$alova: Alova;
}
}
useRequest
useRequest
是最常用的 Hook,用于发送请求并管理状态。以下是一个获取待办事项列表的示例:
加载中...
{{ error.message }}
- {{ todo.title }}
说明:
loading
、data
、error
是响应式对象,自动触发视图更新。send
用于手动触发请求,适合需要用户交互的场景。cacheFor
设置缓存时间,减少重复请求。useWatcher
当请求依赖动态参数(如分页、搜索条件)时,使用 useWatcher
监听参数变化并自动触发请求。
加载中...
- {{ todo.title }}
说明:
useWatcher
监听 page
、size
和 search
,任何变化都会触发请求。Alova 的表单策略支持草稿保存、验证和多页表单。以下是一个提交表单的示例:
说明:
useRequest
的 immediate: false
确保请求手动触发。onSuccess
用于处理提交成功后的逻辑。Alova 支持文件上传,自动处理 FormData
和进度监控。
说明:
onProgress
提供上传进度反馈。FormData
自动处理文件数据。通过 Alova 的中间件,可以拦截请求和响应,统一处理认证、错误等逻辑。
加载中...
{{ error.message }}
{{ JSON.stringify(data) }}
说明:
onError
用于处理特定错误,如 401 未授权。alovaInstance
中配置。Alova 支持请求队列和防抖,优化高频请求场景。例如,搜索输入防抖:
加载中...
- {{ todo.title }}
说明:
useDebounce
确保高频输入(如搜索)不会频繁触发请求。相比于 @tanstack/vue-query
或 swr
:
Method
实例统一管理请求,减少代码分散。Method
实例便于多人维护和 API 文档对接。通过 useHookToSend
自定义 Hook,支持复杂业务逻辑。例如,创建一个带重试的请求:
import { useHookToSend } from 'alova/vue';
const useRetryRequest = (method, maxRetries = 3) => {
const { loading, data, error, send } = useHookToSend(method);
let retries = 0;
const retrySend = async () => {
try {
return await send();
} catch (err) {
if (retries < maxRetries) {
retries++;
return retrySend();
}
throw err;
}
};
return { loading, data, error, send: retrySend };
};
使用:
Alova 支持将状态持久化到本地存储(如 localStorage),适合离线场景:
const todoListGetter = alovaInstance.Get('/todos', {
localCache: {
mode: 'storage',
expire: 1000 * 60 * 60 // 缓存 1 小时
}
});
Alova 提供 DevTools 插件,可在浏览器中查看请求详情、缓存状态和 API 文档。安装方式:
npm install @alova/devtools
在 alova.js
中启用:
import { installAlovaDevtools } from '@alova/devtools';
installAlovaDevtools(alovaInstance);
Alova 通过声明式请求、响应式状态管理和内置策略,极大简化了 Vue 3 项目中的 API 交互。无论是简单的数据获取,还是复杂的分页、表单提交和文件上传,Alova 都能提供高效、优雅的解决方案。它的轻量级设计和 TypeScript 支持使其在现代前端开发中独具优势。