alova 是一个轻量级的请求策略库,支持开发者使用声明式实现例如请求共享、分页请求、表单提交、断点续传等各种较复杂的请求,让开发者使用非常少量的代码就可以实现高可用性和高流畅性的请求功能,这意味着,你再也不需要自己绞尽脑汁编写请求优化代码,再也不需要自己维护请求数据和相关状态,你只需要选择并使用请求模块,设置参数后,alova 帮你搞定。从而提升开发效率、应用运行效率,还能降低服务端压力。
安装
bash
# npm
npm install alova --save
# yarn
yarn add alova
alova 结合 UI 框架,让请求变得更简单,你可以使用 alova 提供的use hook 发起请求,它将返回例如loading
等多个请求相关的状态化数据,并在 alova 中自动管理它们,而无需自己维护。
使用 alova 时,请确保 UI 框架符合以下版本要求:
- React: >= v16.8
- Vue: 2.7、3.x
- Svelte: 任意
使用 useRequest 发送一个请求
首先创建一个 alova 实例,并使用这个实例创建对应的 method,把它传给 useRequest 即可。
vue
html
<template>
<div v-if="loading">Loading...</div>
<div v-else-if="error">{{ error.message }}</div>
<span v-else>responseData: {{ data }}</span>
</template>
<script setup>
import { createAlova, useRequest } from 'alova';
import GlobalFetch from 'alova/GlobalFetch';
import VueHook from 'alova/vue';
// 1. 创建alova实例
const alovaInstance = createAlova({
// VueHook用于创建ref状态,包括请求状态loading、响应数据data、请求错误对象error等
statesHook: VueHook,
// 请求适配器,推荐使用fetch请求适配器
requestAdapter: GlobalFetch(),
// 全局的响应拦截器
responded: response => response.json()
});
// 2. 使用alova实例创建method并传给useRequest即可发送请求
const { loading, data, error } = useRequest(
alovaInstance.Get('https://api.alovajs.org/profile', {
params: {
id: 1
}
})
);
</script>
react
jsx
import { createAlova, useRequest } from 'alova';
import GlobalFetch from 'alova/GlobalFetch';
import ReactHook from 'alova/react';
// 1. 创建alova实例
const alovaInstance = createAlova({
// ReactHook用于创建ref状态,包括请求状态loading、响应数据data、请求错误对象error等
statesHook: ReactHook,
// 请求适配器,推荐使用fetch请求适配器
requestAdapter: GlobalFetch(),
// 全局的响应拦截器
responded: response => response.json()
});
const app = () => {
// 2. 使用alova实例创建method并传给useRequest即可发送请求
const { loading, data, error } = useRequest(
alovaInstance.Get('https://api.alovajs.org/profile', {
params: {
id: 1
}
})
);
if (loading) {
return <div>Loading...</div>;
} else if (error) {
return <div>{error.message}</div>;
}
return (
<>
<span>responseData: {JSON.stringify(data)}</span>
</>
);
};
svelte
html
<script>
import { createAlova, useRequest } from 'alova';
import GlobalFetch from 'alova/GlobalFetch';
import SvelteHook from 'alova/svelte';
// 1. 创建alova实例
const alovaInstance = createAlova({
// SvelteHook用于创建ref状态,包括请求状态loading、响应数据data、请求错误对象error等
statesHook: SvelteHook,
// 请求适配器,推荐使用fetch请求适配器
requestAdapter: GlobalFetch(),
// GlobalFetch适配器将会返回Response实例,
// 你可以设置一个全局的响应拦截器返回json数据
responded: response => response.json()
});
// 2. 使用alova实例创建method并传给useRequest即可发送请求
const { loading, data, error } = useRequest(
alovaInstance.Get('https://api.alovajs.org/profile', {
params: {
id: 1
}
})
);
</script>
{#if $loading}
<div>Loading...</div>
{:else if $error}
<div>{ $error.message }</div>
{:else}
<span>responseData: {{ data }}</span>
{/if}
使用 method 实例发送请求
use hook 只能用于组件内发送请求,在组件外,你可以通过 method 实例直接发送请求。
javascript
const response = await alovaInstance.Get('https://api.alovajs.org/profile?id=1').send();
更多关于 method 实例发送请求的内容,请前往使用 method 实例发送请求阅读。
关于在何时使用 useRequest 发送请求,何时使用 method 实例发送请求,请移步阅读这边的最佳实践。
在静态 html 中使用
除了使用 esModule 的方式安装 alova 外,你还可以使用<script>
标签的方式使用 alova,以vue3为例。
html
<!DOCTYPE html>
<html lang="en">
<head>
<script src="https://unpkg.com/alova/dist/alova.umd.min.js"></script>
<script src="https://unpkg.com/alova/dist/adapter/globalfetch.umd.min.js"></script>
<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script>
<!-- vuehook依赖 vue,因此需先引入 vue -->
<script src="https://unpkg.com/alova/dist/hooks/vuehook.umd.min.js"></script>
<script>
const alovaInstance = window.alova.createAlova({
baseURL: 'https://api.alovajs.org',
statesHook: window.VueHook,
requestAdapter: window.GlobalFetch()
});
// ...
</script>
</head>
<body>
<!-- ... -->
</body>
</html>
alovajs其他信息
为什么创造 alova
数据请求一直是应用程序必不可少的重要部分,自从 XMLHttpRequest 诞生以来请求方案层出不穷,客户端的数据交互探索一直聚焦于请求的简单性,如$.ajax
、axios
、fetch api
以及react-query
等请求工具,编码形式从回调函数、Promise,再到 usehook 不断发展,这些 js 库在请求简单性上已经做得很好了,不过它们只提供了通用的功能,这意味着对于不同的请求场景例如共享请求、分页请求、表单提交、上传和下载文件等,开发者依然需要自己编写复杂的代码,降低开发效率,性能也无法得到保证,在越来越看重的用户体验的时代,应用的流畅性变得越来越重要。
而我们认为还有更简单的方案,例如使用一个 use hook 实现对分页数据的获取和管理、实现对表单数据的管理、实现断点续传等,即在不同的请求场景下使用不同的请求策略模块来高效地实现请求功能,从而让开发者在编写更少量代码同时,也能实现更高效地 Client-Server 数据交互,这就是我们提出的解决方案,也是 alova 的使命。
为什么使用alova
alova 也致力于解决客户端网络请求的问题,但与其他请求库不同的是,alova 选择了业务场景化请求策略的方向,它配合axios/fetch api
等请求库后能满足你绝大部分请求需求(99%)的同时,还提供了丰富的高级功能。
- 你可能曾经也在思考着应该封装
fetch
和axios
,现在你不再需要这么做了,通过 alova 使用声明的方式完成请求,例如请求共享、分页请求、表单提交、断点上传等各种较复杂的请求,以及自动化缓存管理、请求共享、跨组件更新状态等。 - alova 是轻量级的,只有 4kb+,是 axios 的 30%+。
- 目前支持
vue/react/react-native/svelte
,以及next/nuxt/sveltekit
等 SSR 框架,同时也支持Uniapp/Taro
多端统一框架。 - alova 是低耦合的,你可以通过不同的适配器让 alova 在任何 js 环境下,与任何 UI 框架协作使用(内置支持的 UI 框架为
vue/react/svelte
),并且提供了统一的使用体验和完美的代码迁移。 - 使用 alova 还能实现 api 代码的高聚合组织方式,每个 api 的请求参数、缓存行为、响应数据转换等都将聚集在相同的代码块中,这对于管理大量的 api 有很大的优势。
多框架支持
现在,你还可以在 vue options(vue2 和 vue3) 写法中完美使用 alova,点此查看详情。后续我们将陆续支持以下框架:
- 函数式,如
solid/preact/qwik
。 - class 式,如
angular/lit/stencil
。 - options 式,如
原生小程序(中国🇨🇳)
。
alovajs 还提供了其他强大的请求策略:
名称 | 描述 | 文档 |
---|---|---|
分页请求策略 | 自动管理分页数据,数据预加载,减少不必要的数据刷新,流畅性提高 300%,编码难度降低 50% | usePagination |
无感数据交互策略 | 全新的交互体验,提交即响应,大幅降低网络波动造成的影响,让你的应用在网络不稳定,甚至断网状态下依然可用 | useSQRequest |
表单提交策略 | 为表单提交而设计的 hook,通过此 hook 你可以很方便地实现表单草稿、多页面(多步骤)表单,除此以外还提供了表单重置等常用功能 | useForm |
文件上传策略 | 更简单的文件上传策略,支持对 base64、Blob、ArrayBuffer、Canvas 数据的自动识别和转换 | useUploader |
发送验证码 | 验证码发送 hook,减掉你在开发验证码发送功能时的繁琐。 | useCaptcha |
自动重新拉取数据 | 在一定条件下自动重新拉取数据,保证始终展示最新数据。 | useAutoRequest |
跨组件触发请求 | 一个 alova 中间件,消除组件层级的限制,在任意组件中快速地触发任意请求的操作函数 | actionDelegationMiddleware |
串行请求的 useRequest | 比alova 的串行请求方式更加简洁易用的串行请求 use hook,提供统一的 loading 状态、error、回调函数 | useSerialRequest |
串行请求的 useWatcher | 比alova 的串行请求方式更加简洁易用的串行请求 use hook,提供统一的 loading 状态、error、回调函数。 | useSerialWatcher |
请求重试策略 | 请求失败自动重试,它在重要的请求和轮询请求上发挥重要作用 | useRetriableRequest |
SSE 请求 | 通过 Server-sent Events 进行请求 | useSSE |
想学习更多 alovajs 的用法,欢迎来alova 官网学习。如果你也喜欢 alovajs,请在Github 仓库中贡献一颗 star,这对我们非常重要。
如果觉得文章对你有帮助,请别吝啬你的赞和评论哈,说说你对 alovajs 怎么看的,或者可以问一些问题,我会尽量回答的,你的支持是我创作的最大动力!哈哈哈哈哈哈~
欢迎加入交流社区
有任何问题,你可以加入以下群聊咨询,也可以在github 仓库中发布 Discussions,如果遇到问题,也请在github 的 issues中提交,我们会在最快的时间解决。
同时也欢迎贡献你的一份力量,请移步贡献指南。