成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Jquery ajax, Axios, Fetch區(qū)別之我見

YanceyOfficial / 2557人閱讀

摘要:我們都知道因為同源策略的問題,瀏覽器的請求是可能隨便跨域的一定要有跨域頭或者借助,但是,中可以設(shè)置為不跨域,如下所示這樣之后我們會得到一個為的返回。

免費(fèi)幫忙內(nèi)推阿里等各大IT公司的崗位,有興趣可以帶簡歷加微信angeltune
引言

前端技術(shù)真是一個發(fā)展飛快的領(lǐng)域,我三年前入職的時候只有原生XHR和Jquery ajax,我們還曾被JQuery 1.9版本版本以下不支持大文件請求這個問題卡了半天(最后自己寫了原生的XHR請求)。一晃眼,JQuery ajax早已不能專美于前,axios和fetch都已經(jīng)開始分別搶占“請求”這個前端高地。本文將會嘗試著闡述他們之間的區(qū)別,并給出自己的一些理解。

1 JQuery ajax
$.ajax({
   type: "POST",
   url: url,
   data: data,
   dataType: dataType,
   success: function () {},
   error: function () {}
});

這個我就不用多言了把,是對原生XHR的封裝,除此以外還增添了對JSONP的支持。有一說一的說一句,JQuery ajax經(jīng)過多年的更新維護(hù),真的已經(jīng)是非常的方便了,優(yōu)點(diǎn)無需多言;如果是硬要舉出幾個缺點(diǎn),那可能只有

本身是針對MVC的編程,不符合現(xiàn)在前端MVVM的浪潮

基于原生的XHR開發(fā),XHR本身的架構(gòu)不清晰,已經(jīng)有了fetch的替代方案

JQuery整個項目太大,單純使用ajax卻要引入整個JQuery非常的不合理(采取個性化打包的方案又不能享受CDN服務(wù))

盡管JQuery對我們前端的開發(fā)工作曾有著(現(xiàn)在也仍然有著)深遠(yuǎn)的影響,但是我們可以看到隨著VUE,REACT新一代框架的興起,以及ES規(guī)范的完善,更多API的更新,JQuery這種大而全的JS庫,未來的路會越走越窄。

總結(jié):廉頗老矣,尚能飯,但是總有飯不動的一天。
2 Axios
axios({
    method: "post",
    url: "/user/12345",
    data: {
        firstName: "Fred",
        lastName: "Flintstone"
    }
})
.then(function (response) {
    console.log(response);
})
.catch(function (error) {
    console.log(error);
});

Vue2.0之后,尤雨溪推薦大家用axios替換JQuery ajax,想必讓Axios進(jìn)入了很多人的目光中。Axios本質(zhì)上也是對原生XHR的封裝,只不過它是Promise的實現(xiàn)版本,符合最新的ES規(guī)范,從它的官網(wǎng)上可以看到它有以下幾條特性:

從 node.js 創(chuàng)建 http 請求

支持 Promise API

客戶端支持防止CSRF

提供了一些并發(fā)請求的接口(重要,方便了很多的操作)

這個支持防止CSRF其實挺好玩的,是怎么做到的呢,就是讓你的每個請求都帶一個從cookie中拿到的key, 根據(jù)瀏覽器同源策略,假冒的網(wǎng)站是拿不到你cookie中得key的,這樣,后臺就可以輕松辨別出這個請求是否是用戶在假冒網(wǎng)站上的誤導(dǎo)輸入,從而采取正確的策略。

Axios既提供了并發(fā)的封裝,也沒有下文會提到的fetch的各種問題,而且體積也較小,當(dāng)之無愧現(xiàn)在最應(yīng)該選用的請求的方式。

總結(jié):誰敢橫刀立馬,唯我Axios將軍!
3 Fetch

fetch號稱是AJAX的替代品,它的好處在《傳統(tǒng) Ajax 已死,F(xiàn)etch 永生》中提到有以下幾點(diǎn):

符合關(guān)注分離,沒有將輸入、輸出和用事件來跟蹤的狀態(tài)混雜在一個對象里

更好更方便的寫法,諸如:

try {
  let response = await fetch(url);
  let data = response.json();
  console.log(data);
} catch(e) {
  console.log("Oops, error", e);
}

坦白說,上面的理由對我來說完全沒有什么說服力,因為不管是Jquery還是Axios都已經(jīng)幫我們把xhr封裝的足夠好,使用起來也足夠方便,為什么我們還要花費(fèi)大力氣去學(xué)習(xí)fetch?

我認(rèn)為fetch的優(yōu)勢主要優(yōu)勢就是:

更加底層,提供的API豐富(request, response)

脫離了XHR,是ES規(guī)范里新的實現(xiàn)方式

大家都喜歡新的東西,坦白說,作為一個前端工程師,我在使用原生XHR的時候,盡管偶爾覺得寫的丑陋,但是在使用了JQuery和axios之后,已經(jīng)對這一塊完全無所謂了。當(dāng)然,如果新的fetch能做的同樣好,我為了不掉隊也會選擇使用fetch。這個道理其實很好理解:你有一架殲8,魔改了N次,性能達(dá)到了殲10的水準(zhǔn),但是要是有個人給你拿來一架新的殲10,你也會毫不猶豫的選擇新的殲10——不僅僅是新,也代表了還有新的魔改潛力。

但是我最近在使用fetch的時候,也遇到了不少的問題:

fetch是一個低層次的API,你可以把它考慮成原生的XHR,所以使用起來并不是那么舒服,需要進(jìn)行封裝

例如:

1)fetch只對網(wǎng)絡(luò)請求報錯,對400,500都當(dāng)做成功的請求,需要封裝去處理
2)fetch默認(rèn)不會帶cookie,需要添加配置項
3)fetch不支持abort,不支持超時控制,使用setTimeout及Promise.reject的實現(xiàn)的超時控制并不能阻止請求過程繼續(xù)在后臺運(yùn)行,造成了流量的浪費(fèi)
4)fetch沒有辦法原生監(jiān)測請求的進(jìn)度,而XHR可以

PS: fetch的具體問題大家可以參考:《fetch沒有你想象的那么美》《fetch使用的常見問題及解決方法》

看到這里,你心里一定有個疑問,這鬼東西就是個半拉子工程嘛,我還是回去用Jquery或者Axios算了——其實我就是這么打算的。但是,必須要提出的是,我發(fā)現(xiàn)fetch在前端的應(yīng)用上有一項xhr怎么也比不上的能力:跨域的處理。

我們都知道因為同源策略的問題,瀏覽器的請求是可能隨便跨域的——一定要有跨域頭或者借助JSONP,但是,fetch中可以設(shè)置mode為"no-cors"(不跨域),如下所示:

fetch("/users.json", {
    method: "post", 
    mode: "no-cors",
    data: {}
}).then(function() { /* handle response */ });

這樣之后我們會得到一個type為“opaque”的返回。需要指出的是,這個請求是真正抵達(dá)過后臺的,所以我們可以使用這種方法來進(jìn)行信息上報,在我們之前的image.src方法中多出了一種選擇,另外,我們在network中可以看到這個請求后臺設(shè)置跨域頭之后的實際返回,有助于我們提前調(diào)試接口(當(dāng)然,通過chrome插件我們也可以做的到)??傊?,fetch現(xiàn)在還不是很好用,我嘗試過幾個fetch封裝的包,都還不盡如人意。

總結(jié):酋長的孩子,還需成長
總結(jié)

如果你是直接拉到文章底部的,只需要知道現(xiàn)在無腦使用axios即可,Jquery老邁笨拙,fetch年輕稚嫩,只有Axios正當(dāng)其年!

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://systransis.cn/yun/92488.html

相關(guān)文章

  • 如何構(gòu)建通用 api 中間層

    摘要:是在收到響應(yīng)后執(zhí)行的函數(shù),可以不用返回。一步步介紹了如何構(gòu)建以及使用中間層,來統(tǒng)一管理接口地址,最后還介紹了下中間件等高級功能。 零、問題的由來 開門見山地說,這篇文章是一篇安利軟文~,安利的對象就是最近搞的 tua-api。 顧名思義,這就是一款輔助獲取接口數(shù)據(jù)的工具。 發(fā)請求相關(guān)的工具辣么多,那我為啥要用你呢? 理想狀態(tài)下,項目中應(yīng)該有一個 api 中間層。各種接口在這里定義,業(yè)務(wù)...

    BingqiChen 評論0 收藏0
  • HTTPS的頁面發(fā)送不了HTTP請求?——關(guān)于混合內(nèi)容

    摘要:因為頁面通過加載的初始請求是安全的,但是又加載了不安全的內(nèi)容,因此稱之為混合內(nèi)容。但是即使顯示警告,頁面也已經(jīng)加載,用戶的安全仍然受到了威脅。這就是頁面為什么發(fā)送不了的原因。 我們都知道HTTPS的頁面是發(fā)送不了HTTP請求的,那么是什么原因?qū)е翲TTPS頁面不能發(fā)送HTTP請求呢?如果有發(fā)送的需求,怎么樣才能發(fā)送?最近剛好遇到了這個問題,而且搜了半天沒搜到靠譜的答案,所以有了本文。 ...

    phodal 評論0 收藏0
  • Spring框架我見(一)——工廠模式

    摘要:相對于工廠模式,抽象工廠模式生產(chǎn)的對象更加具體,也更加豐富,但相對編碼也更加復(fù)雜。具體的抽象工廠模式的實現(xiàn)大家可以參考菜鳥教程。知道了工廠模式和抽象工廠模式的區(qū)別,請大家使用的時候應(yīng)該根據(jù)具體的情況進(jìn)行選擇。 大家好,今天給大家分享一些Spring的學(xué)習(xí)心得,在講Spring之前,先和大家分享Spring中核心的設(shè)計模式。 工廠模式 在聊概念之前我先問問大家:什么是工廠? 這個很簡單,...

    venmos 評論0 收藏0
  • 只知道ajax?你已經(jīng)out了

    摘要:所以本文將介紹兩個目前常用的獲取服務(wù)器數(shù)據(jù)的庫和。隨著作者尤雨溪發(fā)布消息,不再繼續(xù)維護(hù)并推薦大家使用開始,進(jìn)入了很多人的目光。脫離了,是基于設(shè)計。如果要詳細(xì)了解的應(yīng)用,推薦閱讀教程和規(guī)范。歡迎大家前往騰訊云+社區(qū),獲取更多騰訊海量技術(shù)實踐干貨哦~ 本文由前端林子發(fā)表于云+社區(qū)專欄 隨著前端技術(shù)的發(fā)展,請求服務(wù)器數(shù)據(jù)的方法早已不局限于ajax、jQuery的ajax方法。各種js庫已如雨后...

    Steven 評論0 收藏0

發(fā)表評論

0條評論

YanceyOfficial

|高級講師

TA的文章

閱讀更多
最新活動
閱讀需要支付1元查看
<