ajax和axios、fetch的區別
1.jQuery ajax
$.ajax({
type: 'POST',
url: url,
data: data,
dataType: dataType,
success: function () {},
error: function () {}
});
傳統 Ajax 指的是 XMLHttpRequest(XHR), 最早出現的傳送後端請求技術,隸屬於原始js中,核心使用XMLHttpRequest物件,多個請求之間如果有先後關係的話,就會出現回撥地獄。
JQuery ajax 是對原生XHR的封裝,除此以外還增添了對JSONP的支援。經過多年的更新維護,真的已經是非常的方便了,優點無需多言;如果是硬要舉出幾個缺點,那可能只有:
1.本身是針對MVC的程式設計,不符合現在前端MVVM的浪潮
2.基於原生的XHR開發,XHR本身的架構不清晰。
3.JQuery整個專案太大,單純使用ajax卻要引入整個JQuery非常的不合理(採取個性化打包的方案又不能享受CDN服務)
4.不符合關注分離(Separation of Concerns)的原則
5.配置和呼叫方式非常混亂,而且基於事件的非同步模型不友好。
PS:MVVM(Model-View-ViewModel), 源自於經典的 Model–View–Controller(MVC)模式。MVVM 的出現促進了 GUI 前端開發與後端業務邏輯的分離,極大地提高了前端開發效率。MVVM 的核心是 ViewModel 層,它就像是一箇中轉站(value converter),負責轉換 Model 中的資料物件來讓資料變得更容易管理和使用,該層向上與檢視層進行雙向資料繫結,向下與 Model 層通過介面請求進行資料互動,起呈上啟下作用。View 層展現的不是 Model 層的資料,而是 ViewModel 的資料,由 ViewModel 負責與 Model 層互動,這就完全解耦了 View 層和 Model 層,這個解耦是至關重要的,它是前後端分離方案實施的最重要一環。
如下圖所示:
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進入了很多人的目光中。
axios 是一個基於Promise 用於瀏覽器和 nodejs 的 HTTP 客戶端,本質上也是對原生XHR的封裝,只不過它是Promise的實現版本,符合最新的ES規範,它本身具有以下特徵:
1.從瀏覽器中建立 XMLHttpRequest
2.支援 Promise API
3.客戶端支援防止CSRF
4.提供了一些併發請求的介面(重要,方便了很多的操作)
5.從 node.js 建立 http 請求
6.攔截請求和響應
7.轉換請求和響應資料
8.取消請求
9.自動轉換JSON資料
PS:防止CSRF:就是讓你的每個請求都帶一個從cookie中拿到的key, 根據瀏覽器同源策略,假冒的網站是拿不到你cookie中得key的,這樣,後臺就可以輕鬆辨別出這個請求是否是使用者在假冒網站上的誤導輸入,從而採取正確的策略。
3.fetch
try {
let response = await fetch(url);
let data = response.json();
console.log(data);
} catch(e) {
console.log("Oops, error", e);
}
fetch號稱是AJAX的替代品,是在ES6出現的,使用了ES6中的promise物件。Fetch是基於promise設計的。Fetch的程式碼結構比起ajax簡單多了,引數有點像jQuery ajax。但是,一定記住fetch不是ajax的進一步封裝,而是原生js,沒有使用XMLHttpRequest物件。
fetch的優點:
1.符合關注分離,沒有將輸入、輸出和用事件來跟蹤的狀態混雜在一個物件裡
2.更好更方便的寫法
坦白說,上面的理由對我來說完全沒有什麼說服力,因為不管是Jquery還是Axios都已經幫我們把xhr封裝的足夠好,使用起來也足夠方便,為什麼我們還要花費大力氣去學習fetch?
我認為fetch的優勢主要優勢就是:
1. 語法簡潔,更加語義化
2. 基於標準 Promise 實現,支援 async/await
3. 同構方便,使用 [isomorphic-fetch](https://github.com/matthew-andrews/isomorphic-fetch)
4.更加底層,提供的API豐富(request, response)
5.脫離了XHR,是ES規範裡新的實現方式
最近在使用fetch的時候,也遇到了不少的問題:
fetch是一個低層次的API,你可以把它考慮成原生的XHR,所以使用起來並不是那麼舒服,需要進行封裝。
例如:
1)fetch只對網路請求報錯,對400,500都當做成功的請求,伺服器返回 400,500 錯誤碼時並不會 reject,只有網路錯誤這些導致請求不能完成時,fetch 才會被 reject。
2)fetch預設不會帶cookie,需要新增配置項: fetch(url, {credentials: 'include'})
3)fetch不支援abort,不支援超時控制,使用setTimeout及Promise.reject的實現的超時控制並不能阻止請求過程繼續在後臺執行,造成了流量的浪費
4)fetch沒有辦法原生監測請求的進度,而XHR可以
總結:axios既提供了併發的封裝,也沒有fetch的各種問題,而且體積也較小,當之無愧現在最應該選用的請求的方式。
相關文章
- axios,Ajax,jQuery ajax,axios和fetch的區別iOSjQuery
- ajax和fetch、axios的區別以及axios原理iOS
- ajax,fetch,axios的區別及運用iOS
- Ajax、fetch、axios的區別與優缺點iOS
- Ajax,jQuery ajax,axios和fetch介紹、區別以及優缺點jQueryiOS
- ajax,axios,fetchiOS
- AJAX、$.ajax、axios、fetch、superagentiOS
- 非同步請求xhr、ajax、axios與fetch的區別比較非同步iOS
- ajax、axios、fetch之間的詳細區別以及優缺點iOS
- 從ajax到fetch、axiosiOS
- ajax、axios、fetch、jsonp、corsiOSJSONCORS
- 對ajax、axios、fetch的認識iOS
- AJAX API三駕馬車: Axios vs . jQuery和FetchAPIiOSjQuery
- 資料互動——Promise、Ajax、axios和fetch的優缺點PromiseiOS
- 有同學問我:Fetch 和 Ajax 有什麼區別?
- 六九、ajax,fetch,axios,wx.request封裝iOS封裝
- 前端知識總結之Ajax,axios,fetch篇前端iOS
- 向伺服器傳送請求的四種方法Ajax,Fetch,Axios,JQurey中的($.ajax)伺服器iOS
- Ajax與Fetch
- AJAX同步和非同步區別非同步
- axios(xhr) 和 fetch 兩種請求方式iOS
- Axios、axios攔截器、fetch-jsonp ——0807iOSJSON
- jQuery的AJAX請求中contentType和dataType的區別jQuery
- fetch和axios請求的原理都是基於XMLHttpRerequst嗎?iOSXMLHTTP
- 01-Ajax&AxiosiOS
- React 中用jQuery的ajax 和 axios請求資料ReactjQueryiOS
- Fetch 代替 Ajax 的瀏覽器 API瀏覽器API
- 關於Ajax和websocket的區別以及使用場景!Web
- ajax 請求的時候 get 和 post 方式的區別?
- [JavaScript] Promise 與 Ajax/AxiosJavaScriptPromiseiOS
- 1、ajax、axios總結iOS
- ajax與jsonp的區別及用法JSON
- JS 中的網路請求 AJAX, Fetch, WebSocketJSWeb
- 封裝ajax、axios請求封裝iOS
- 利用fetch方法實現Ajax請求
- 【axios】XHR的ajax封裝+axios攔截器呼叫+請求取消iOS封裝
- js基礎進階–從ajax到fetch的理解JS
- Ajax 之戰:XMLHttpRequest與Fetch API比較XMLHTTPAPI