跳到主要内容
场景优先的架构 · 01

请求的单元不是一次调用,而是一个场景

alova 把各种请求场景总结成四个阶段,并封装成请求策略函数,请求完整性不再取决于工程师和AI提示词,而由特定场景的策略预先编排

快速开始GitHub
Pagination.ts
手写实现· 伪 JS · 框架无关
1let keyword = '';触发
2let page = 1;触发
3let data = [], total = 0;应用
4let loading = false;应用
5const cache = new Map();决策
6
7on(keywordInput, 'input', () => {触发
8 debounce(() => {触发
9 keyword = getValue();触发
10 page = 1;触发
11 fetchPage();触发
12 }, 300);触发
13});触发
14
15async function fetchPage() {
16 const key = keyword + ':' + page;决策
17 const nextKey = keyword + ':' + (page + 1);决策
18 afterLoaded(() => {决策
19 cache.set(nextKey, load(nextKey));决策
20 });决策
21
22 loading = true;执行
23 const res = await axios.post(执行
24 '/api/search', { keyword, page });执行
25
26 data = normalize(res.list);应用
27 total = res.total;应用
28 cache.set(key, data);应用
29 render(data);应用
30}应用
alova 场景声明
1const {
2 data, page, pageSize,应用
3 loading, isLastPage应用
4} = usePagination(
5 (page, size) =>执行
6 api.searchList(keyword, page, size),执行
7 {
8 watchingStates: [keyword],触发
9 debounce: 300,触发
10 preloadNextPage: true决策
11 }
12);
4 段手写→1 次声明
自动轮播

赞助商

金牌
在此展示你的 Logo
在此展示你的 Logo
银牌
在此展示你的 Logo
在此展示你的 Logo
在此展示你的 Logo
铜牌
watchthis.devwormaSealed Rose — AI Deepfake DetectorJamFeed — Instagram Account Analyzer for Musicians
请求场景模型(RSM)

请求场景的四个生命周期

以这四个生命周期阶段为指引,每一类请求场景都能被完整地组织起来,它们清楚何时触发、何时复用、何时真正发出请求,而不再依赖零散的人工拼装。

请求场景概念
阶段 01

请求触发

在合适的时机触发请求,例如手动触发、状态变化、翻页、网络重连等,减少不必要的请求。

触发01 / 触发
阶段 02

请求决策

判断发出请求前应如何处理本次请求。

评估02 / 决策
阶段 03

请求执行

网络通信发生,通常由 fetch、axios 或 XHR 等处理。

委托03 / 执行
阶段 04

数据应用

获得响应数据后的动作,如界面更新、自动转换、缓存更新和多端同步,以及后续步骤的使用等。

整合04 / 应用
RSM 信封原则

把触发、决策、执行与数据应用封装进同一个内聚的场景

alova 干净地位于你的传输层之上。axios 与 fetch 负责网络,alova 接管生命周期的其余部分。

RSM 核心→axios / fetch→零样板
默认即拥有

一个请求策略,不止于发起请求

alova 的请求策略默认提供超出预期的完整请求功能,无需在提示词里额外说明。

探索场景 Hook
01 / 防抖

防抖

自动合并高频、重复的触发。一连串按键也不会把后端打爆。

内置守卫启用
02 / 韧性

重试

指数退避自动重试。不稳定的移动与边缘网络不再打断流程。

容错启用
03 / 缓存

多级缓存

L1 内存叠加持久化存储。页面瞬时恢复,并支持离线。

亚毫秒级启用
04 / 竞态守卫

竞态处理

自动处理竞态。永远采用最新请求的结果,过期响应直接丢弃。

无竞态启用
05 / 重新校验

自动刷新

窗口重新聚焦、网络重连或标签页再次可见时,自动重新校验数据。

事件驱动启用
06 / 间隔

轮询

灵活的连续或分步轮询,切换标签页时自动在后台暂停。

智能频率启用
07 / 去重

请求共享

把组件树中任意位置的相同并发请求去重为一次进行中的调用。

单次合并启用
08 / 预取

数据预加载

悬停时预加载下一页或详情视图。路由与翻页切换即时完成。

零延迟启用
09 / 存储

表单草稿

本地留存多步表单快照。误关标签页或刷新也不会丢失进度。

自动保存启用
10 / 原子

原子请求

把相关的读取与写入打包在一起。级联操作要么全部成功,要么整体回滚。

状态一致启用
11 / 流

上传与下载

字节级精确的进度钩子,支持大文件传输的暂停、中止与续传。

分块控制启用
12 / 响应式

状态驱动请求

去掉命令式派发。数据同步成为 UI 状态变化直接、响应式的结果。

响应式同步启用
04 · 策略库

每个策略都是一个完整场景

一次声明,预先编排触发、决策、执行与数据应用。

客户端策略

内置 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 atomic
const res = await atomize(
alova.Get('/api/user'),
{
channel: 'user_lock',
timeout: 5000
}
)
了解更多

跨组件,零接线

在任何组件间触发并同步请求。无需 prop 透传,也无需全局 store。

操作委派

Cross

跨组件触发、中止和共享请求,无需额外状态管理。

了解更多

无感数据交互

Cross

自动状态同步,让跨组件共享数据保持一致。

了解更多

了解全部 20+ 策略

每个策略都是文档完备、开箱即用的模块。

05 · 弹性运行时

可在任意 JS 环境、配合任意请求工具运行

alova 把网络调用交给你已经用惯的请求库:axios、fetch 或 XHR。并兼容 React、Vue、Svelte 及各类主流框架,包括 options 与 class 风格。

06 · 值得信赖且开源

大量真实应用已在生产环境得到验证

已被用于处理每日数百万关键数据事件的生产环境采用。

6.2k+GitHub Star 数1000+ 依赖仓库
15+框架通用现代 JS 运行时
20+请求策略久经考验的场景
MIT开源协议100% 免费且开源
加入社区

已被真实团队用于生产

依赖 alova 的开源项目

Scott Hu
Scott Hualova创建者

像fetch和axios这样的请求库使请求变得非常简单,react-query和swr又进一步减少了请求的模板代码。但alova的目标是提供极致的API消费效率,实现更高效的数据交互,并且降低服务器压力

Proddy
ProddyThe author of EMS-ESP

我很喜欢这个库,正在把代码从 Axios 慢慢迁移到 Alova。

0x1EC10D
0x1EC10DDeveloper

alova是真的很细致,我看文档的时候每一个点都是痛点,解决了超多问题

Ah jung
Ah jungAuthor of Naive Admin

alovajs很不错。我打算将我们的产品统一换成alovajs

Alova 团队

认识核心成员

Scott HuScott Hu
MeetinaXDMeetinaXD
czhlinczhlin
07 · 现在尝试 Alova

让请求更完整,体验更流畅

从触发、决策、执行到应用,alova 把整个请求生命周期收拢到一起,让每一次交互都完整而流畅。