查看原文
其他

我放弃 Axios,改用 Alova

点击上方 前端进阶之旅,关注公众号


原文:https://javascript.plainenglish.io/its-2023-drop-axios-and-use-alova-instead-e688a4f51e6c


Axios 是一个基于 Promise 的 HTTP 客户端,每周 npm 下载量超过 4000 万。如果回到10年前,promise式的请求工具是一个伟大的创新。它解决了繁琐的请求问题。

但随着时间的推移,Axios 在开发效率和性能上开始落后。特别是现在面对越来越复杂的需求,我们需要的是更加创新和领先的请求工具,而promise式的请求工具只能称之为传统。 

接下来,我会揭露Axios在某些方面的不足,并推荐一个比Axios更现代、更创新的请求工具,也就是上面的轻量级请求策略库。

一、Promise式请求工具(Axios)的弱点

1.1 与React、Vue等框架分离

现在前端几乎离不开React、Vue等前端UI框架。axios无法深度绑定这些框架的状态,需要开发者自行维护,导致开发效率低下。

1.2 性能方面没有

现在是2023年,应用已经比10年前的应用复杂了好几个数量级,对请求的要求也越来越高,以保证页面的性能要求。axios在这方面什么都不做,比如频繁重复请求,同时发起多个相同的请求等。

1.3 体积臃肿

根据bundle phobia,axios在压缩状态下的体积是11+kb,见下图

1.4 响应数据的Ts类型定义混乱

在使用axios的时候,你可能经常会这样写:

const inst = axios.create({ baseURL: 'https://example.com/'})
inst.interceptors.response.use(response => { if (response.status === 200) { return response.data } throw new Error(response.status)})
interface Resp { id: number}inst.get<Resp>('/xxx').then(result => { data.data})

不知道Axios是故意的还是忽略了。在上面发起的GET请求中,响应数据结果的类型一直是axios.AxiosResponse<Resp>,但是我们在响应拦截器中返回了response.data。这导致陷入混乱的响应数据类型。

2、Alova是如何解决以上问题的?

2.1 与UI框架深度集成,自动管理请求相关数据

假设我们需要发起一个基本的数据获取请求,以Vue为例,直接对比代码。

// axios<template> <div v-if="loading">Loading...</div> <div v-else-if="error" class="error"> {{ error.message }} </div> <div v-else>{{ data }}</div></template>
<script setup>import axios from 'axios';import { ref, onMounted } from 'vue';
const loading = ref(false);const error = ref(null);const data = ref(null);
const requestData = () => { loading.value = true; axios.get('http://xxx/index').then(result => { data.value = result; }).catch(e => { error.value = e; }).finally(() => { loading.value = false; });}onMounted(requestData);</script>
// alova<template> <div v-if="loading">Loading...</div> <div v-else-if="error" class="error"> {{ error.message }} </div> <div v-else>{{ data }}</div></template>
<script setup>import { createAlova, useRequest } from 'alova';
const pageData = createAlova({ baseURL: 'http://xxx' }).Get('/index');const { loading, data, error } = useRequest(pageData);</script>

在axios中,你需要创建相应的请求状态并自行维护,而Alova为你接手了这项工作。

2.2 开箱即用的高性能特性

传统的 Promise 风格的请求工具主要定位是通过 Promise 简化请求,提升性能可能是他们考虑最少的。 

但是,请求策略库Alova强调了这一点。在 Alova 中,默认情况下启用内存。缓存和请求共享,这两个可以极大的提升请求性能,提升用户体验,减轻服务器压力,我们一一来看。

内存缓存

内存模式是在响应请求后,将响应数据保存在本地内存中。下次再发起同样的请求时,将使用缓存的数据,而不是再次发送请求。

想象一下,当你在实现一个列表页面时,点击列表项就可以进入详情页面查看数据。你会认为用户可能会经常点击查看列表中的详细信息。在详情数据没有变化的情况下,每次进入详情页请求一次,每次都需要用户等待加载,太浪费了。在Alova,你可以默认享受这样的待遇。

要求分享

您可能遇到过这种情况。当一个请求发送但没有得到响应时,再次发起同一个请求,造成请求浪费,或者重复提交的问题,比如下面三种场景:

  • 当一个组件被创建时,它会获得初始化数据。当一个页面同时渲染多个组件时,会同时发送多个相同的请求。

  • 提交按钮未禁用且用户多次单击提交按钮。

  • 预加载完成前进入预加载页面时,会多次发起同一个请求。

共享请求就是用来解决这些问题的。它是通过多路复用请求来实现的。由于这种情况不能直观展示,就不展示了。有兴趣的小伙伴可以自行体验。

重量轻

压缩状态下的Alova只有4kb+,只有Axios的30%+,看下面截图

2.3 更直观的响应数据TS类型

在 axios 中,要定义响应数据的类型是令人困惑的。如果你是 Typescript 的重度用户,alova 可以为你提供完整的字体体验。当你在请求处定义响应数据的类型时,你可以在多个地方享受它,它会让你感觉很清晰,我们来看看。

interface Resp { id: number}const pageData = createAlova({ baseURL: 'http://xxx' }).Get<Resp>('/index');const { data, loading, error, onSuccess, send} = useRequest(pageData);onSuccess(event => { console.log(event.data);});
const handleClick = async () => { const data = await send();}

至此,相对于传统的Promise风格的请求库,你可能对alova的强大有了初步的了解。

3. Alova的其他特点

3.1 类似axios的API设计,更易上手熟悉

Alova 的请求信息结构与 Axios 几乎相同。让我们比较一下他们的 GET 和 POST 请求。

// axiosaxios.get('/index', { headers: { 'Content-Type': 'application/json;charset=UTF-8' }, params: { userId: 1 }});
// alovaconst todoListGetter = alovaInstance.Get('/index', { headers: { 'Content-Type': 'application/json;charset=UTF-8' }, params: { userId: 1 }});
// axiosaxios.post('/login', { username: 'xxx', password: 'ppp'}, { headers: { 'Content-Type': 'application/json;charset=UTF-8' }, params: { userId: 1 }});
// alovaconst loginPoster = alovaInstance.Post('/login', { username: 'xxx', password: 'ppp'}, { headers: { 'Content-Type': 'application/json;charset=UTF-8' }, params: { userId: 1 }});

3.2 高性能寻呼请求策略

自动维护分页相关数据和状态,提供通用的分页数据操作能力。据官方介绍,可提升列表页流畅度300%,编码难度降低50%。 

下面是官方提供的例子,感兴趣的同学可以去看看。

3.3 无感数据交互的请求策略

据我了解,它使用以下技术:

  • 持久化请求队列,保证请求的安全性和序列化

  • 请求重试策略机制,保证请求的顺利完成

  • 虚拟响应数据(一个创新概念)用作无响应数据的占位符,以便在响应后可以将其定位并替换为实际数据。

3.4 数据预取

数据是通过拉取数据进行预加载,缓存在本地。这部分数据用到的时候,可以打缓存,直接显示数据。这种方式也大大提高了用户体验。


欢迎长按图片添加 poetry 为好友,我会第一时间和你分享前端行业趋势,学习途径,成长内容等等。2023年陪你一起度过!点击领取精心为您整理的前端面试资料

如果觉得这篇内容对你有帮助,我想请你帮我2小忙:

1. 订阅「前端进阶之旅」官网 interview.poetries.top 让我们一起成长2. 订阅「前端导航」 nav.poetries.top 你想要的前端资源网站这里都有


点赞和在看就是最大的支持❤️

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存