请求的单元不是一次调用,而是一个场景
alova 把各种请求场景总结成四个阶段,并封装成请求策略函数,请求完整性不再取决于工程师和AI提示词,而由特定场景的策略预先编排
请求场景的四个生命周期
以这四个生命周期阶段为指引,每一类请求场景都能被完整地组织起来,它们清楚何时触发、何时复用、何时真正发出请求,而不再依赖零散的人工拼装。
请求场景概念请求触发
在合适的时机触发请求,例如手动触发、状态变化、翻页、网络重连等,减少不必要的请求。
请求决策
判断发出请求前应如何处理本次请求。
请求执行
网络通信发生,通常由 fetch、axios 或 XHR 等处理。
数据应用
获得响应数据后的动作,如界面更新、自动转换、缓存更新和多端同步,以及后续步骤的使用等。
把触发、决策、执行与数据应用封装进同一个内聚的场景
alova 干净地位于你的传输层之上。axios 与 fetch 负责网络,alova 接管生命周期的其余部分。
一个请求策略,不止于发起请求
alova 的请求策略默认提供超出预期的完整请求功能,无需在提示词里额外说明。
防抖
自动合并高频、重复的触发。一连串按键也不会把后端打爆。
重试
指数退避自动重试。不稳定的移动与边缘网 络不再打断流程。
多级缓存
L1 内存叠加持久化存储。页面瞬时恢复,并支持离线。
竞态处理
自动处理竞态。永远采用最新请求的结果,过期响应直接丢弃。
自动刷新
窗口重新聚焦、网络重连或标签页再次可见时,自动重新校验数据。
轮询
灵活的连续或分步轮询,切换标签页时自动在后台暂停。
请求共享
把组件树中任意位置的相同并发请求去重为一次进行中的调用。
数据预加载
悬停时预加载下一页或详情视图。路由与翻页切换即时完成。
表单草稿
本地留存多步表单快照。误关标签页或刷新也不会丢失进度。
原子请求
把相关的读取与写入打包在一起。级联操作要么全部成功,要么整体回滚。
上传与下载
字节级精确的进度钩子,支持大文件传输的暂停、中止与续传。
状态驱动请求
去掉命令式派发。数据同步成为 UI 状态变化直接、响应式的结果。
每个策略都是一个完整场景
一次声明,预先编排触发、决策、执行与数据应用。
客户端策略
内置 Hook 用一次声明囊括完整场景:触发、决策、执行与应用。不必再手工拼装各个阶段。
分页请求
Client自动管理分页、预加载下一页并减少无效刷新。分页成为一次声明的场景。
了解更多const todoList = (page, size) =>alova.Get('/todos', { params: { page, size } });const { loading, data, page, pageSize, pageCount, total } =usePagination(todoList);
监听请求
Client状态一变即刻发请求。标签页切换与条件查询场景尤其好用。
了解更多useWatcher(() => alova.Get(`/rewards/${activeKey}`),[activeKey],{debounce: [500, 0]})
预加载数据
Client预加载数据以更快地显示视图,或跨组件重新拉取数据
了解更多const { fetching, error, fetch } = useFetcher()fetch(alova.Get('/todo/1'))
Token身份认证
Client带无感刷新 Token 的全局拦截器,统一管理登录、登出、令牌分配与刷新。
了解更多const { onAuthRequired, onResponseRefreshToken } = createServerTokenAuthentication({refreshTokenOnError: {isExpired: res => res.status === 401,handler: async () => {const { token, refresh_token } = await refreshToken()localStorage.setItem('token', token)localStorage.setItem('refresh_token', refresh_token)}}})const alovaInstance = createAlova({beforeRequest: onAuthRequired(),responded: onResponseRefreshToken()})
表单提交
Client自动管理表单状态,各类表单都能快速搭好。
了解更多const {loading: submitting,form,send: submit,onSuccess,onError,onComplete} = useForm(formData =>alova.Post('/api/submit', formData),{initialForm: { name: '', cls: '1' }});const handleSubmit = () => submit();
自动刷新数据
Client通过浏览器事件自动刷新数据,界面始终显示最新数据
了解更多const { loading, data, error } = useAutoRequest(() => alova.Get('/api/data'),{enableVisibility: true,enableFocus: true,enableNetwork: true,throttle: 1000,pollingTime: 2000});
服务端策略
服务端控制覆盖重试、限流与原子请求,无需额外中间件。
请求重试
Server在关键请求上自动重试,提升其稳定性。
了解更多const res = await retry(alova.Post('/api/order'),{retry: 3,backoff: {delay: 1000,multiplier: 2}});
请求速率限制
Server限制给定时间窗口内发出的请求数量。
了解更多const limit = createRateLimiter({points: 4,duration: 60 * 1000})const orderRes = await limit(alova.Get('/api/order'))
原子化请求
Server在多进程环境下,用分布式锁保证请求的原子性,无需手写加锁逻辑。
了解更多import { atomize } from 'alova/server';// a distributed lock keeps the request atomicconst res = await atomize(alova.Get('/api/user'),{channel: 'user_lock',timeout: 5000})
跨组件,零接线
在任何组件间触发并同步 请求。无需 prop 透传,也无需全局 store。
大量真实应用已在生产环境得到验证
已被用于处理每日数百万关键数据事件的生产环境采用。
已被真实团队用于生产
依赖 alova 的开源项目
像fetch和axios这样的请求库使请求变得非常简单,react-query和swr又进一步减少了请求的模板代码。但alova的目标是提供极致的API消费效率,实现更高效的数据交互,并且降低服务器压力
我很喜欢这个库,正在把代码从 Axios 慢慢迁移到 Alova。
alova是真的很细致,我看文档的时候每一个点都是痛点,解决了超多问题
alovajs很不错。我打算将我们的产品统一换成alovajs






