为什么用 fetch?
下面罗列了网上经常讨论,关于 fetch 的缺点,以及目前的解决方案
1. 没有自动 stringify
封装抽象方法,很简单
2. 接口抛出 4xx、5xx 类错误会归到成功里,只有网络错误才会抛出 reject
400 ≤ status < 600 情况下,可以在 then 里通过 res.ok 判断是否为错误情况,在根据 status 进行处理,而网络请求错误则在 catch 里处理
3. 缺少默认配置
需要自己封装默认的headers或credentials,不能开箱即用
4. 兼容性
IE 不兼容
在 fetch 刚出的时候很多人吐槽它的兼容性,但到 2020 年,caniuse上显示全球浏览器兼容性覆盖率达到了 95.11%,可以放心使用
如果需要兼容 IE,可以考虑使用whatwg-fetch,这是个 polyfill 库,原理是使用 XMLHttpRequest 来模拟 fetch
5. 请求超时、取消请求
可以使用AbortController实现相关功能
6. 下载进度
可以使用ReadableStream实现相关功能
7. 上传进度
暂无解决方案
优点
- 语法上比较简单简洁
- 基于浏览器提供的原生方法,使用
promise实现 - 属于原生 js 系列,不需要引入第三方库
- 属于底层 api,能够自行封装和控制
对比 axios
axios 是应用于 web 和 node 的 http 请求第三方库,使用promise,web 基于XMLHttpRequest实现,node 基于http模块实现
axios 功能十分强大,基本上 fetch 能做到的 axios 都能做到,甚至能做 fetch 做不到的事情,并且 api 简单,在兼容性方面,axios 最低兼容至 ie11
可以说 axios 是全面碾压 fetch,那么还有什么理由坚持 fetch 呢?请继续往下看
为什么坚持 fetch
fetch 作为底层 api,目前除了上传进度无解以外,其他都有对应的处理方法,只要抽象封装后完全能够应对大部分的场景
高度封装的库确实能够很方便的满足需求,但这中间封装的过程和原理却无从得知,会用仅仅是达到 20%而已
大部分情况下,http 请求并不需要特别复杂的功能,不需要引入额外库的 fetch 会是更好的选择
自己封装底层 api,能够更贴合实际业务中的需求,更加的理解里面的流程,出问题时能够更好的解决
