跳到主要内容

为什么用 fetch?

· 阅读需 4 分钟
youniaogu

为什么用 fetch?

下面罗列了网上经常讨论,关于 fetch 的缺点,以及目前的解决方案

1. 没有自动 stringify

封装抽象方法,很简单

2. 接口抛出 4xx、5xx 类错误会归到成功里,只有网络错误才会抛出 reject

400 ≤ status < 600 情况下,可以在 then 里通过 res.ok 判断是否为错误情况,在根据 status 进行处理,而网络请求错误则在 catch 里处理

3. 缺少默认配置

需要自己封装默认的headerscredentials,不能开箱即用

4. 兼容性

IE 不兼容

在 fetch 刚出的时候很多人吐槽它的兼容性,但到 2020 年,caniuse上显示全球浏览器兼容性覆盖率达到了 95.11%,可以放心使用

如果需要兼容 IE,可以考虑使用whatwg-fetch,这是个 polyfill 库,原理是使用 XMLHttpRequest 来模拟 fetch

5. 请求超时、取消请求

可以使用AbortController实现相关功能

6. 下载进度

可以使用ReadableStream实现相关功能

7. 上传进度

暂无解决方案

优点
  1. 语法上比较简单简洁
  2. 基于浏览器提供的原生方法,使用promise实现
  3. 属于原生 js 系列,不需要引入第三方库
  4. 属于底层 api,能够自行封装和控制
对比 axios

axios 是应用于 web 和 node 的 http 请求第三方库,使用promise,web 基于XMLHttpRequest实现,node 基于http模块实现

axios 功能十分强大,基本上 fetch 能做到的 axios 都能做到,甚至能做 fetch 做不到的事情,并且 api 简单,在兼容性方面,axios 最低兼容至 ie11

可以说 axios 是全面碾压 fetch,那么还有什么理由坚持 fetch 呢?请继续往下看

为什么坚持 fetch
  1. fetch 作为底层 api,目前除了上传进度无解以外,其他都有对应的处理方法,只要抽象封装后完全能够应对大部分的场景

  2. 高度封装的库确实能够很方便的满足需求,但这中间封装的过程和原理却无从得知,会用仅仅是达到 20%而已

  3. 大部分情况下,http 请求并不需要特别复杂的功能,不需要引入额外库的 fetch 会是更好的选择

  4. 自己封装底层 api,能够更贴合实际业务中的需求,更加的理解里面的流程,出问题时能够更好的解决