江山代有人才出,各领风骚数百年。

前言

Hello,大家好,我是编程三昧的作者隐逸王,小小前端一枚。

自昨天发了《还在死磕 Ajax?那可就 out 了!》一文后,收到了一些大家的一些评论,评论都很走心,也很有深度。

说实话,虽然我在尽可能努力地回复大家的问题,但还是避免不了对其中一些概念理解的模棱两可的情况,有幸得到同仁们的指点,比如:

感谢各位的不吝赐教,让我在成长的道路上又前进了几分。

现在总结一下,评论区涉及到的主要问题如下:

  • Fetch 和 Axios/Ajax 是什么关系
  • Fetch 真的会取代 Ajax 吗
  • 有封装良好的 Fetch 工具库推荐吗

为了不辜负大家的热情,我在这里试着解释一下这些问题,如有疏漏,还请海涵!

概念和特性

首先,我们来了解一下 Ajax、Axios 和 Fetch 它们各自的概念。

Ajax

英文全称为 Asynchronous JavaScript + XML ,翻译过来就是异步JavaScript和XML

它是用来描述一种使用现有技术集合的“新”方法的,这里的“新”方法主要涉及到: HTML 或 XHTML、CSS、 JavaScript、DOM、XML、XSLT,以及最重要的 XMLHttpRequest。

当使用结合了这些技术的 AJAX 模型以后, 网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载(刷新)整个页面。这使得程序能够更快地回应用户的操作。

Ajax 是一个概念模型,是一个囊括了众多现有技术的集合,并不具体代指某项技术。

Ajax 最重要的特性就是可以局部刷新页面

Axios

Axios 是一个基于 Promise 网络请求库,作用于 Node.js 和浏览器中。 它是 isomorphic 的(即同一套代码可以运行在浏览器和 Node.js中)。在服务端它使用原生 Node.js http 模块,而在客户端则使用 XMLHttpRequest。

这里我们只关注客户端的 Axios,它是基于 XHR 进行二次封装形成的工具库。

客户端 Axios 的主要特性有:

  • 从浏览器创建 XMLHttpRequests
  • 支持 Promise API
  • 拦截请求和响应
  • 转换请求和响应数据
  • 取消请求
  • 自动转换JSON数据
  • 客户端支持防御XSRF

Fetch

Fetch 提供了一个获取资源的接口(包括跨域请求)。

Fetch 是一个现代的概念, 等同于 XMLHttpRequest。它提供了许多与 XMLHttpRequest 相同的功能,但被设计成更具可扩展性和高效性

Fetch 的核心在于对 HTTP 接口的抽象,包括 Request、Response、Headers 和 Body,以及用于初始化异步请求的 global fetch。得益于 JavaScript 实现的这些抽象好的 HTTP 模块,其他接口能够很方便的使用这些功能。

除此之外,Fetch 还利用到了请求的异步特性——它是基于 Promise 的。

fetch() 方法必须接受一个参数——资源的路径。无论请求成功与否,它都返回一个 Promise 对象,resolve 对应请求的 Response。

Fetch 和 Axios/Ajax 的关系

通过上面对三者概念的解释,我们应该大体清楚它们之间的关系了,我在这里用图表示一下:

针对上图,我解释一下:

  • Ajax 是一种代表异步 JavaScript + XML 的模型(技术合集),所以 Fetch 也是 Ajax 的一个子集
  • 在之前,我们常说的 Ajax 默认是指以 XHR 为核心的技术合集,而在有了 Fetch 之后,Ajax 不再单单指 XHR 了,我们将以 XHR 为核心的 Ajax 技术称作传统 Ajax
  • Axios 属于传统 Ajax(XHR)的子集,因为它是基于 XHR 进行的封装。

Fetch 真的会取代 Ajax 吗?

其实这个问题更准确的问法应该是:Fetch 真的会取代传统 Ajax ( XHR ) 吗?

要回答这个问题,我们需要清楚以下几点:

  • 异步编程是 JavaScript 发展的大趋势,且绝大多数浏览器都已支持标准 Promise。
  • Fetch API 是浏览器自带的 API,且它是基于标准 Promise 的。
  • 传统 Ajax 原生写法结构比较混乱,不符合关注分离的原则,写过远程 XHR 的同学应该深有体会。
  • Axios 是基于 XHR 封装的 Promise 请求库,用起来确实方便。

基于以上几点,我的观点是Fetch 终会取代传统 Ajax,但过程可能比较漫长。

虽然目前来看,传统 Ajax (比如 Axios 之类的)在使用规模上远远超过 Fetch,但要知道,这是 XHR 十来年累积下来的效果。

封装得到的 Axios 在易用性上甩了原生 XHR 十万八千里,但毕竟是封装的,和原生的 Fetch 相比较,Axios 在出身上就已略输一筹,且原生的 API 天然上会支持更多的功能,使用上会更加灵活。

Fetch 工具库推荐

在昨天文章的评论区,有一位同学推荐了一个 Fetch 工具库,名为 Mande,有兴趣的同学可以去看看。

总结

以上就是针对 Fetch 和 Ajax 问题的一份简单解释,希望能够给大家带来启发。

就我个人而言,倒是蛮期待 Fetch 能够取代传统 Ajax,技术的发展需要不断注入活力才行,我还能再干几十年,可不希望前端技术裹足不前,那样该多无聊 !

~

~本文完,感谢阅读!

~

学习有趣的知识,结识有趣的朋友,塑造有趣的灵魂!

大家好,我是〖编程三昧〗的作者 隐逸王,我的公众号是『编程三昧』,欢迎关注,希望大家多多指教!

你来,怀揣期望,我有墨香相迎! 你归,无论得失,唯以余韵相赠!

知识与技能并重,内力和外功兼修,理论和实践两手都要抓、两手都要硬!

有同学问我:Fetch 和 Ajax 有什么区别?相关推荐

  1. fetch 发送 AJAX请求

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  2. fetch和ajax的区别?

    一.写在前面 今天总结一下fetch和ajax的区别. 二.Ajax ajax的本质就是使用XMLHttpRequest对象来请求数据,下面是简单的原生js实现. function ajax(url, ...

  3. git:Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists)....

    Git fetch和git pull的区别, 解决Git报错:error: You have not concluded your merge (MERGE_HEAD exists). 解决办法一:保 ...

  4. axios如何在nodejs项目里封装_【面经】jq 中 ajax 和 axios 区别,瀑布流布局,添加删除事件...

    [jq 中 ajax 和 axios 区别] jq的ajax 1.本身是针对MVC的编程,不符合现在前端MVVM的浪潮 2.JQuery整个项目太大,单纯使用ajax却要引入整个JQuery不合理 a ...

  5. jQuery与JavaScript与ajax三者的区别与联系

    jQuery与JavaScript与ajax三者的区别与联系 简单总结: 1.JS是一门前端语言. 2.Ajax是一门技术,它提供了异步更新的机制,使用客户端与服务器间交换数据而非整个页面文档,实现页 ...

  6. git pull不同步_Git fetch和git pull的区别?

    要讲清楚git fetch,git pull的区别必须要附加讲清楚git remote,git merge .远程repo, branch . commit-id 以及 FETCH_HEAD. 1. ...

  7. ajax同步异步的区别

    ajax同步异步的区别 一.什么是ajax? Ajax是(Asynchronous JavaScript And XML)是异步的JavaScript和xml.也就是异步请求更新技术.Ajax是一种对 ...

  8. AJAX 同步 异步 区别

    AJAX 同步 异步 区别 异步处理: 我们通过事件触发到 ajax,请求服务器,在这个期间无论服务器有没有响应,客户端的其他代码一样可以运行.(JS代码加载到当前AJAX的时候会把页面里所有的代码停 ...

  9. 和ajax区别_AJAX、Fetch和Axios的细微区别

    前端技术真的是一个发展非常飞快地领域,现在只知道原生的XHR和Jquery AJAX是不能满足开发的需求的,现在axios和fetch已经开始抢占"请求"这个前端高地了,今天就给阐 ...

最新文章

  1. JDK 1.6 HashMap 源码分析
  2. DM368学习--捕获视频图像分辨率修改
  3. 战友!6.19决战光荣日,一个真实的魔兽世界在等你!
  4. 从零开始学习docker(十七)Swarm mode ---service
  5. 内存泄漏与内存溢出的区别
  6. MassTransit Get Started-
  7. 蓝桥杯-算法提高-打水问题
  8. Python数据存储:pickle模块的使用讲解(测试代码)
  9. 【redis系列】redisTemplate缓存常用工具类
  10. Spring容器创建流程(3)对beanFactory设置
  11. Grow heap (frag case) to 6.437MB for 1114126-byte allocation
  12. emctl start dbconsole失败问题的解决
  13. mysql小问题集锦
  14. c语言答辩ppt案例,c语言ppt例子课题答辩ppt成品中南民族大学.ppt
  15. vue元素实现动画过渡效果
  16. Ubuntu 安装 QEMU
  17. Leetcode 刷题 - 排序(day2)_桶排序_Top K Frequent Elements
  18. 华三防火墙旁路部署三种方式之子接口旁路
  19. python递归查找文件
  20. jsp中去掉超链接下划线吗,在JSP中,若要在JSP正确使用标签: ,在jsp中声称的taglib指令为: 下划线处应该是() 答案:x...

热门文章

  1. Linux(Ubuntu) 下自然码加辅助码双拼输入的解决方案
  2. Visual Studio 2010 - 推荐的扩展[关闭]
  3. 理解Rails真实性令牌
  4. 您如何合并两个Git存储库?
  5. php reader oleread,请问用phpExcelReader方式,excel文件名字可以是中文吗?
  6. win11升级不满足最低系统要求怎么办 windows11升级不满足最低系统要求的解决方法
  7. win11怎么快速返回桌面 windows11快捷键返回桌面的设置方法
  8. swagger openapi开放平台 pyhton3.7实现http发送请求,pyhon中代码中发送http请求控制4g物联网开关
  9. listctrl 的使用技巧
  10. node创建新html页面,node创建服务器之展示html页面