精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Axios 跨端架構是如何實現的?

開發 前端
本文我們講述了 axios 的跨端架構原理。axios 內部實際發出請求是通過 dispatchRequest() 方法處理的,再往里看則是通過適配器模式取得適應于當前環境的適配器函數。

我們都知道,axios 是是一個跨平臺請求方案,在瀏覽器端采用 XMLHttpRequest API 進行封裝,而在 Node.js 端則采用 http/https 模塊進行封裝。axios 內部采用適配器模式將二者合二為一,在隱藏了底層的實現的同時,又對外開放了一套統一的開放接口。

那么本文,我們將來探討這個話題:axios 的跨端架構是如何實現的?

從 axios 發送請求說起

我們先來看看 axios 是如何發送請求的。

// 發送一個 GET 請求
axios({ 
  method: 'get',
  url: 'https://jsonplaceholder.typicode.com/comments'
  params: { postId: 1 }
}) 

// 發送一個 POST 請求
axios({
  method: 'post'
  url: 'https://jsonplaceholder.typicode.com/posts',
  data: {
    title: 'foo',
    body: 'bar',
    userId: 1,
  }
})

dispatchRequest() 方法

當使用 axios 請求時,實際上內部是由 Axios[3] 實例的 .request() 方法處理的。

// /v1.6.8/lib/core/Axios.js#L38
async request(configOrUrl, config) {
    try {
      return await this._request(configOrUrl, config);
    } catch (err) {}
}

而 ._request() 方法內部會先將  configOrUrl, config 2 個參數處理成 config 參數。

// /v1.6.8/lib/core/Axios.js#L62
_request(configOrUrl, config) {
    if (typeof configOrUrl === 'string') {
      config = config || {};
      config.url = configOrUrl;
    } else {
      config = configOrUrl || {};
    }

    // ...
}

這里是為了同時兼容下面 2 種調用方法。

// 調用方式一
axios('https://jsonplaceholder.typicode.com/posts/1')
// 調用方式二
axios({
  method: 'get',
  url: 'https://jsonplaceholder.typicode.com/posts/1'
})

當然,這不是重點。在 ._request() 方法內部請求最終會交由 dispatchRequest() 處理。

// /v1.6.8/lib/core/Axios.js#L169-L173
try {
  promise = dispatchRequest.call(this, newConfig);
} catch (error) {
  return Promise.reject(error);
}

dispatchRequest() 是實際調用請求的地方,而實際調用是采用  XMLHttpRequest API(瀏覽器)還是http/https 模塊(Node.js),則需要進一步查看。

// /v1.6.8/lib/core/dispatchRequest.js#L34
export default function dispatchRequest(config) { /* ... */ }

dispatchRequest() 接收的是上一步合并之后的 config 參數,有了這個參數我們就可以發送請求了。

跨端適配實現

// /v1.6.8/lib/core/dispatchRequest.js#L49
const adapter = adapters.getAdapter(config.adapter || defaults.adapter);

這里就是我們所說的 axios 內部所使用的適配器模式了。

axios 支持從外出傳入 adapter 參數支持自定義請求能力的實現,不過很少使用。大部分請求下,我們都是使用內置的適配器實現。

defaults.adapter

defaults.adapter 的值如下:

// /v1.6.8/lib/defaults/index.js#L40
adapter: ['xhr', 'http'],

adapters.getAdapter(['xhr', 'http']) 又是在做什么事情呢?

適配器實現

首先,adapters 位于 lib/adapters/adapters.js[4]。

所屬的目錄結構如下:

圖片圖片

可以看到針對瀏覽器和 Node.js 2 個環境的適配支持:http.js、xhr.js。

adapters 的實現如下。

首先,將內置的 2 個適配文件引入。

// /v1.6.8/lib/adapters/adapters.js#L2-L9
import httpAdapter from './http.js';
import xhrAdapter from './xhr.js';

const knownAdapters = {
  http: httpAdapter,
  xhr: xhrAdapter
}

knownAdapters 的屬性名正好是和 defaults.adapter 的值 ['xhr', 'http'] 是一一對應的。

而 adapters.getAdapter(['xhr', 'http']) 的實現是這樣的:

// /v1.6.8/lib/adapters/adapters.js#L27-L75
export default {
  getAdapter: (adapters) => {
    // 1)
    adapters = Array.isArray(adapters) ? adapters : [adapters];

    let nameOrAdapter;
    let adapter;
    
    // 2)
    for (let i = 0; i < adapters.length; i++) {
      nameOrAdapter = adapters[i];
      adapter = nameOrAdapter;
      
      // 3)
      if (!isResolvedHandle(nameOrAdapter)) {
        adapter = knownAdapters[String(nameOrAdapter).toLowerCase()];
      }

      if (adapter) {
        break;
      }
    }

    // 4)
    if (!adapter) {
      throw new AxiosError(
        `There is no suitable adapter to dispatch the request `,
        'ERR_NOT_SUPPORT'
      );
    }

    return adapter;
  }
}

內容比較長,我們會按照代碼標準的序號分 4 個部分來講。

1)這里是為了兼容調用 axios() 時傳入 adapter 參數的情況。

// `adapter` allows custom handling of requests which makes testing easier.
// Return a promise and supply a valid response (see lib/adapters/README.md).
adapter: function (config) {
  /* ... */
},

因為接下來 adapters 是作為數組處理,所以這種場景下,我們將 adapter 封裝成數組 [adapters]。

// /v1.6.8/lib/adapters/adapters.js#L28
adapters = Array.isArray(adapters) ? adapters : [adapters];

2)接下來,就是遍歷 adapters 找到要用的那個適配器。

到目前為止,adapters[i](也就是下面的 nameOrAdapter)既可能是字符串('xhr'、'http'),也可能是函數(function (config) {})。

// /v1.6.8/lib/adapters/adapters.js#L37
let nameOrAdapter = adapters[i];
adapter = nameOrAdapter;

3)那么,我們還要檢查 nameOrAdapter 的類型。

// /v1.6.8/lib/adapters/adapters.js#L42-L48
if (!isResolvedHandle(nameOrAdapter)) {
  adapter = knownAdapters[(id = String(nameOrAdapter)).toLowerCase()];
}

isResolvedHandle() 是一個工具函數,其目的是為了判斷是否要從 knownAdapters 獲取適配器。

// /v1.6.8/lib/adapters/adapters.js#L24
const isResolvedHandle = (adapter) => typeof adapter === 'function' || adapter === null || adapter === false;

簡單理解,只有 adapter 是字符串的情況('xhr' 或 'http'),isResolvedHandle(nameOrAdapter) 才返回 false,才從 knownAdapters 獲得適配器。

typeof adapter === 'function' || adapter === null 這個判斷條件我們容易理解,這是為了排除自定義 adapter 參數(傳入函數或 null)的情況。

而 adapter === false 又是對應什么情況呢?

那是因為我們的代碼只可能是在瀏覽器或 Node.js 環境下運行。這個時候 httpAdapter 和 xhrAdapter 具體返回是有差異的。

// /v1.6.8/lib/adapters/xhr.js#L48
const isXHRAdapterSupported = typeof XMLHttpRequest !== 'undefined';
export default isXHRAdapterSupported && function (config) {/* ...*/}

// /v1.6.8/lib/adapters/http.js#L160
const isHttpAdapterSupported = typeof process !== 'undefined' && utils.kindOf(process) === 'process';
export default isHttpAdapterSupported && function httpAdapter(config) {/* ... */}

也就是說:在瀏覽器環境 httpAdapter 返回 false,xhrAdapter 返回函數;在 Node.js 環境 xhrAdapter 返回 false,httpAdapter 返回函數。

因此,一旦 isResolvedHandle() 邏輯執行完成后。

if (!isResolvedHandle(nameOrAdapter)) {/* ... */}

會檢查 adapter 變量的值,一旦有值(非 false)就說明找到適配器了,結束遍歷。

if (adapter) {
  break;
}

4)最終在返回適配器前做空檢查

// 4)
if (!adapter) {
  throw new AxiosError(
    `There is no suitable adapter to dispatch the request `,
    'ERR_NOT_SUPPORT'
  );
}

return adapter;

如此,就完成了跨端架構的實現。

總結

本文我們講述了 axios 的跨端架構原理。axios 內部實際發出請求是通過 dispatchRequest() 方法處理的,再往里看則是通過適配器模式取得適應于當前環境的適配器函數。

axios 內置了 2 個適配器支持:httpAdapter 和 xhrAdapter。httpAdapter 是 Node.js 環境實現,通過 http/https 模塊;xhrAdapter 這是瀏覽器環境實現,通過 XMLHttpRequest API 實現。Node.js 環境 xhrAdapter 返回 false,瀏覽器環境 httpAdapter 返回 false——這樣總是能返回正確的適配器。

參考資料

[1]axios 是如何實現取消請求的?: https://juejin.cn/post/7359444013894811689

[2]你知道嗎?axios 請求是 JSON 響應優先的: https://juejin.cn/post/7359580605320036415

[3]Axios: https://github.com/axios/axios/blob/v1.6.8/lib/core/Axios.js

[4]lib/adapters/adapters.js: https://github.com/axios/axios/blob/v1.6.8/lib/adapters/adapters.js

責任編輯:武曉燕 來源: 寫代碼的寶哥
相關推薦

2024-06-05 08:42:24

2021-07-27 14:50:15

axiosHTTP前端

2022-03-18 21:51:10

Nest.jsAOP 架構后端

2024-03-14 11:06:37

JavaScript引擎探索

2021-04-22 05:37:14

Axios 開源項目HTTP 攔截器

2022-10-19 09:27:39

2019-08-13 10:34:26

鴻蒙OS跨平臺Linux內核

2016-04-25 20:48:06

IBM

2022-09-02 10:20:44

網絡切片網絡5G

2021-05-27 05:22:28

前端引擎平臺

2021-01-28 05:11:26

HDFS架構Hadoop

2021-08-23 06:59:22

Nacos負載均衡客戶端

2024-11-05 15:02:41

2025-09-04 01:25:00

樓層定位技術

2018-01-18 14:50:56

Nginx實現CDSW

2020-12-31 08:14:39

VueAxiosJavaScript

2021-09-17 12:50:10

MySQL數據庫ACID

2016-08-27 22:02:11

前端跨端全棧

2023-04-07 10:51:39

2024-11-14 08:08:14

點贊
收藏

51CTO技術棧公眾號

少妇精品一区二区三区| www.亚洲天堂网| 风流老熟女一区二区三区| 亚洲国产影院| 夜夜嗨av色一区二区不卡| 日韩成人av免费| av资源新版天堂在线| 国产校园另类小说区| 亚洲精品日产aⅴ| 日韩免费不卡视频| 91精品综合久久久久久久久久久 | 国产欧美va欧美va香蕉在| 欧美片一区二区| 激情综合网五月| 精品三级在线看| 中文字幕网av| 中文字幕在线免费观看视频| 亚洲欧美欧美一区二区三区| 欧美精品一区在线| 国内老熟妇对白xxxxhd| 日韩在线一区二区三区| 欧美极品在线视频| 亚洲精品色午夜无码专区日韩| 亚洲国产aⅴ精品一区二区| 色视频成人在线观看免| 男女激情免费视频| 欧美性猛交xxx乱大交3蜜桃| 91丨porny丨蝌蚪视频| 91网免费观看| 国产毛片毛片毛片毛片| 青青草成人在线观看| 55夜色66夜色国产精品视频| 青娱乐在线视频免费观看| 色欧美自拍视频| 国产一区二区三区在线播放免费观看 | 欧美日韩在线观看成人| 日韩在线看片| 亚洲小视频在线| 在线免费观看a级片| 一区二区日韩| 日韩欧美一区二区在线视频| 做a视频在线观看| h1515四虎成人| 在线观看91视频| 日韩视频第二页| 亚洲天堂av在线| 欧美日韩一区二区在线| 青青青国产在线观看| xxxx在线视频| 亚洲国产婷婷综合在线精品| 日韩精品一区二区三区四| 69成人在线| 亚洲综合av网| 日韩精品视频在线观看视频| 黄色美女视频在线观看| 亚洲最快最全在线视频| 国产一区二区四区| 91高清视频在线观看| 亚洲超碰精品一区二区| 欧美啪啪免费视频| 在线亚洲人成| 在线观看www91| 九色porny自拍| 色综合一区二区日本韩国亚洲| 欧美日本在线播放| 亚洲免费在线播放视频| 在线综合色站| 日韩精品中文字幕在线播放| 少妇久久久久久久久久| 清纯唯美日韩| 久久国产精品电影| 免看一级a毛片一片成人不卡| 亚洲夜间福利| 日韩av不卡在线| 中文字幕在线观看第二页| 精品写真视频在线观看 | 亚洲国产欧美另类| 成人毛片老司机大片| 蜜桃av久久久亚洲精品| 懂色av中文在线| 亚洲精选在线视频| 人妻少妇精品无码专区二区| 婷婷六月国产精品久久不卡| 欧美日韩精品三区| 美女又黄又免费的视频| 国产 日韩 欧美 综合 一区| 亚洲色图国产精品| 波多野结衣家庭教师| 99国产精品| 国产精品精品国产| a在线观看视频| 久久精品视频免费观看| 一区二区三区四区久久| 国产盗摄——sm在线视频| 欧美午夜一区二区三区| 韩国三级hd中文字幕有哪些| 少妇精品久久久| 欧美黑人巨大精品一区二区| 日韩精品一区二区亚洲av观看| 精品一区免费av| 久久青青草原| 黄色网在线免费观看| 黑人巨大精品欧美一区二区免费| 怡红院亚洲色图| 亚洲精品亚洲人成在线观看| 久久精品影视伊人网| 国产区一区二区三| 国产乱码字幕精品高清av| 蜜桃999成人看片在线观看| 26uuu亚洲电影在线观看| 色综合中文字幕国产| 日批视频免费看| 欧美大人香蕉在线| 欧美一性一乱一交一视频| 国内精品偷拍视频| 中文字幕一区av| 免费在线观看毛片网站| 久久久国产精品免费| 日韩av男人天堂| 精品午夜久久福利影院| 蜜桃视频成人| av在线小说| 91精品在线一区二区| 亚洲AV无码成人精品区明星换面| 在线欧美亚洲| 97久久人人超碰caoprom欧美| 成人77777| 黑人与娇小精品av专区| 国产一卡二卡三卡四卡| 欧美精品一卡| 91在线免费视频| 69视频在线| 欧美亚州韩日在线看免费版国语版| 中文字幕第3页| 欧美三区视频| 99免费在线视频观看| 免费av网站在线观看| 欧美色综合久久| 久久久久无码精品国产sm果冻 | 极品一区美女高清| 欧美第一黄网免费网站| www.国产精品视频| 一区二区三区国产精品| 日本女人黄色片| 欧美 日韩 国产一区二区在线视频 | 国产亚洲精品av| 国产99精品视频| www污在线观看| 久久悠悠精品综合网| 欧美一级电影免费在线观看| 视频一区 中文字幕| 午夜成人免费视频| 黄色短视频在线观看| 国产毛片久久| 欧美精品亚洲精品| 欧美日韩精品一区二区三区视频| 亚洲一品av免费观看| 亚洲精品一区二三区| 欧美国产日产图区| 亚洲精品自拍网| 亚洲高清影视| 99国产精品久久久久老师| 激情网站在线| 日韩成人在线免费观看| 99re国产在线| 国产精品福利一区| 亚洲男人天堂av在线| 欧美一区免费| 成人激情直播| 欧美天堂视频| 日韩视频免费大全中文字幕| 国产aⅴ爽av久久久久成人| 亚洲在线视频免费观看| 野外性满足hd| 久久97超碰国产精品超碰| 日本一区二区免费高清视频| 亚洲一区二区三区中文字幕在线观看| 97视频在线看| yw在线观看| 欧美成人在线直播| 欧产日产国产69| 最新国产成人在线观看| 亚洲视频在线播放免费| 日韩激情在线观看| 欧美 国产 精品| 欧洲精品一区| 国产专区欧美专区| 2021天堂中文幕一二区在线观| 亚洲国产欧美在线成人app| 亚洲大尺度在线观看| 亚洲靠逼com| 午夜时刻免费入口| 国产激情一区二区三区| 男人亚洲天堂网| 欧美日韩精品免费观看视频完整| 蜜桃欧美视频| 秋霞影院一区| 国产精品9999| missav|免费高清av在线看| 这里只有精品在线播放| 蜜桃91麻豆精品一二三区| 欧美又粗又大又爽| 91精品国产乱码在线观看| 国产精品久久毛片av大全日韩| 国产免费a级片| 麻豆精品久久久| 国产亚洲天堂网| 欧美日韩综合| 六月婷婷激情网| 精品视频亚洲| 久久精品magnetxturnbtih| 国产95亚洲| 国产成人精品一区二区| 19禁羞羞电影院在线观看| 久久综合伊人77777| 国产粉嫩一区二区三区在线观看 | 成人午夜在线影院| 欧美momandson| 亚州欧美日韩中文视频| 超碰超碰在线| 久久在线视频在线| av在线免费一区| 亚洲视频在线播放| 色吊丝在线永久观看最新版本| 日韩精品一区二区三区中文不卡| 中日韩在线观看视频| 欧美视频裸体精品| 五月婷婷激情网| 亚洲国产美国国产综合一区二区| 久久久久亚洲av片无码| 国产精品女同一区二区三区| 一道本在线观看| 久久亚洲综合色一区二区三区 | 亚洲一卡二卡在线| 色婷婷久久久久swag精品| 日韩不卡视频在线| 欧美日韩中文在线| 国产污污视频在线观看| 亚洲国产视频直播| 国产一级二级三级| 一区二区日韩电影| 久久亚洲国产成人精品性色| 一区二区三区四区激情| 免费人成视频在线| 亚洲精品免费在线观看| 欧美成人精品欧美一级| 亚洲免费观看视频| 欧美精品成人久久| 亚洲一区二区三区四区五区黄 | 玖玖视频精品| 日本久久精品一区二区| 免播放器亚洲一区| 网站一区二区三区| 久久草av在线| 久久精品亚洲天堂| 国产成+人+日韩+欧美+亚洲| 国产精品99久久久精品无码| 国产成人av影院| 香港三日本8a三级少妇三级99| 不卡一区二区中文字幕| 国产精品无码网站| 国产蜜臀97一区二区三区| 四虎影视一区二区| 亚洲精品免费视频| 国产精品suv一区二区69| 狠狠做深爱婷婷久久综合一区| 青青草免费观看视频| 欧美特级限制片免费在线观看| 中文字幕+乱码+中文字幕明步| 欧美日韩不卡一区二区| 国产不卡精品视频| 亚洲激情中文字幕| 成人午夜电影在线观看| 麻豆一区二区在线观看| 91在线三级| 国产精品欧美日韩一区二区| 成人在线视频区| 精品1区2区| 欧美亚洲在线日韩| 黄色a级在线观看| 伊人久久久大香线蕉综合直播| 亚洲熟妇av一区二区三区漫画| 日本欧美加勒比视频| 色欲欲www成人网站| 久久婷婷成人综合色| 午夜爽爽爽男女免费观看| 午夜欧美2019年伦理| 在线播放精品视频| 精品国产sm最大网站| 在线免费观看的av网站| 久久久久久18| 欧洲亚洲精品久久久久| 国产伦精品一区二区三区| 欧美丝袜激情| 青青草视频在线免费播放 | 91理论片午午论夜理片久久| 欧美成人一区在线观看| 制服国产精品| 亚洲影院免费| 免费在线观看日韩av| 亚洲国产高清不卡| 久久久午夜影院| 日韩一区二区在线看片| 狠狠v欧美ⅴ日韩v亚洲v大胸| 欧美日韩国产成人在线观看| 日本中文字幕一区二区| 精品亚洲第一| 欧美片第1页综合| 国产精品无码一本二本三本色| 国产不卡视频一区| 国产乱子轮xxx农村| 色哟哟在线观看一区二区三区| 国产wwwxxx| 少妇高潮久久77777| 小视频免费在线观看| 不卡视频一区二区| 97精品97| 日本一二区免费| 国产三区在线成人av| 欧美特黄aaaaaa| 亚洲精品一区二区三区影院| 久做在线视频免费观看| 国产精品v片在线观看不卡| 日韩高清影视在线观看| 成人免费a级片| 国产高清在线精品| 国产第一页精品| 色偷偷久久人人79超碰人人澡| 国产 日韩 欧美 精品| 久99九色视频在线观看| 99久热在线精品视频观看| 日韩午夜视频在线观看| 麻豆精品网站| 一卡二卡三卡四卡| 欧美日韩国产综合视频在线观看中文 | 青青草97国产精品免费观看无弹窗版 | 久久久999成人| 欧美xxxx网站| 亚洲精品国产一区| 日本sm残虐另类| 69精品无码成人久久久久久| 日韩欧美亚洲综合| 欧美一区二区少妇| 日本国产高清不卡| 国内精品久久久久久久久电影网 | 国产精品综合网| 欧美成人手机视频| 日韩精品一区二区三区中文不卡| 欧美寡妇性猛交xxx免费| 99视频免费观看| 亚洲精品社区| 国产熟妇搡bbbb搡bbbb| 色哟哟日韩精品| 浮生影视网在线观看免费| 国产精品美女久久久久久免费 | 久久精品国产亚洲7777| 96视频在线观看欧美| 欧美交换配乱吟粗大25p| 国产91精品久久久久久久网曝门 | 制服丝袜在线播放| 国产精品传媒毛片三区| 西西人体一区二区| 免费观看a级片| 91精品欧美一区二区三区综合在| 91亚洲天堂| 国产精品午夜av在线| 免费亚洲视频| 中国美女黄色一级片| 日韩欧美一二三| 一区二区三区四区日本视频| 色噜噜狠狠色综合网| 国产在线视视频有精品| 久久精品这里有| 一夜七次郎国产精品亚洲| 国产精品久久久久久久久久久久久久久| 狠狠干视频网站| 91一区一区三区| 91精东传媒理伦片在线观看| 精品中文字幕在线| 午夜先锋成人动漫在线| 国产精品久久a| 亚洲福利国产精品| www.91在线| 国产精品久久亚洲| 男女性色大片免费观看一区二区 | av在线播放国产| 久久精品中文字幕一区二区三区| 免费一级欧美片在线观看| 免费在线视频一区二区| 国产一区二区三区欧美| 亚洲精品一区二区三区中文字幕| 日本成人中文字幕在线| 一区二区三区国产豹纹内裤在线| 巨骚激情综合| 成人区精品一区二区| 免费亚洲电影在线| 中文字幕亚洲精品一区| 欧美成年人视频网站| 加勒比久久综合| 男男做爰猛烈叫床爽爽小说|