func-star / blog

杨玺的个人博客
https://github.com/func-star/blog/issues
20 stars 1 forks source link

axios 和 fetch 实战分析 #21

Open func-star opened 6 years ago

func-star commented 6 years ago

前言

趁着搭建公司新版 react 移动端脚手架的机会,对 http-client 库细致了解了一番。axiosfetch是目前比较火热的两款产品,这里就我了解到的一些信息记录一下。

fetch api 使用总结

之前我在 PC 端项目中选择的是 fetch api,使用了将近两年左右,这里我将个人的使用体验分享一下。

可能或许大概你会拿它和 $.ajaxaxios 这类封装的比较完善的库做对比,而且开始吐槽,这东西怎么哪哪都不如 axios 。 这里我们先要确定一下 fetch api 的定位,它是一个更加偏底层的库,提供了丰富的 API 给开发者调用,可以支持很多的底层功能,但是可能找不到基于场景封装好的功能。 因此,我们在选择 fetch 的时候需要考虑我们是不是有这么复杂的需求需要通过 fetch api 来支持,用 axios 是不是会更省事?

上述介绍了一大堆的 fetch api 的缺点,可能大家会认为我对 fetch api 有什么偏见... 哈哈😄。实际上我近两年的 http-client 库选择的都是 fetch api。 还是那句话,没有最好的产品,只有最适合的产品。如果某个产品你用的习惯了,你就咋看咋顺眼。

axios 使用总结

从去年下半年开始,我开始在线上移动端使用 axios 。接下来讲一下我个人的使用情况。

刚开始用的时候我也是看了很多的文档资料,毕竟网上把这东西夸的天花乱坠的,到底这东西魅力在哪里,得自己试试才知道呀。

这里先介绍一下我之前对 axios 做的分析,具体是不是真的有那么大魅力,我们后面用场景验证。

以上三点是我比较 care 的特性,其他的我就不罗列介绍了。 下面我们来看一下怎么封一个 axios 类(临时写的一个思路,未测试),让它帮我们的业务更好的赋能。

import axios from 'axios'
import Evnets from 'mona-events'

const CancelToken = axios.CancelToken

class Ajax extends Evnets {
    constructor(props) {
        super(props)
        axios.default.baseURL = 'https://api.monajs.cn'
        this.filter
    }

    get(url, params = {}, canCancel = false, cancelOption) {
        if (canCancel) {
            params.cancelToken = new CancelToken(function executor(c) {
                // executor 函数接收一个 cancel 函数作为参数
                cancelOption = c;
            })
        }
        return axios.get(url, params);
    }

    post(url, params = {}, canCancel = false, cancelOption) {
        if (canCancel) {
            params.cancelToken = new CancelToken(function executor(c) {
                // executor 函数接收一个 cancel 函数作为参数
                cancelOption = c;
            })
        }
        return axios.post(url, params)
    }

    filter() {
        axios.interceptors.request.use(config => {
            // 在发送请求之前做些什么
            return config;
        }, error => {
            // 对请求错误做些什么
            return Promise.reject(error);
        });
        axios.interceptors.response.use(response => {
            // 对响应数据做点什么
            return response;
        }, error => {
            // 对响应错误做点什么
            return Promise.reject(error);
        })
    }
}

上面基本上阐述了两个事情:

总结下来我的观点是选择哪个 http-client 库进行业务开发取决于实际场景,在移动端开发,我个人比较偏向于 axios 。它能够帮我们较少成本的上手使用。