日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Axios 跨端架構是如何實現(xiàn)的?

來源: 責編: 時間:2024-05-07 09:15:51 259觀看
導讀我們都知道,axios 是是一個跨平臺請求方案,在瀏覽器端采用 XMLHttpRequest API 進行封裝,而在 Node.js 端則采用 http/https 模塊進行封裝。axios 內部采用適配器模式將二者合二為一,在隱藏了底層的實現(xiàn)的同時,又對外開放

我們都知道,axios 是是一個跨平臺請求方案,在瀏覽器端采用 XMLHttpRequest API 進行封裝,而在 Node.js 端則采用 http/https 模塊進行封裝。axios 內部采用適配器模式將二者合二為一,在隱藏了底層的實現(xiàn)的同時,又對外開放了一套統(tǒng)一的開放接口。hqj28資訊網(wǎng)——每日最新資訊28at.com

那么本文,我們將來探討這個話題:axios 的跨端架構是如何實現(xiàn)的?hqj28資訊網(wǎng)——每日最新資訊28at.com

從 axios 發(fā)送請求說起

我們先來看看 axios 是如何發(fā)送請求的。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

dispatchRequest() 方法

當使用 axios 請求時,實際上內部是由 Axios[3] 實例的 .request() 方法處理的。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

而 ._request() 方法內部會先將  configOrUrl, config 2 個參數(shù)處理成 config 參數(shù)。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

這里是為了同時兼容下面 2 種調用方法。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

當然,這不是重點。在 ._request() 方法內部請求最終會交由 dispatchRequest() 處理。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

dispatchRequest() 是實際調用請求的地方,而實際調用是采用  XMLHttpRequest API(瀏覽器)還是http/https 模塊(Node.js),則需要進一步查看。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

dispatchRequest() 接收的是上一步合并之后的 config 參數(shù),有了這個參數(shù)我們就可以發(fā)送請求了。hqj28資訊網(wǎng)——每日最新資訊28at.com

跨端適配實現(xiàn)

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

這里就是我們所說的 axios 內部所使用的適配器模式了。hqj28資訊網(wǎng)——每日最新資訊28at.com

axios 支持從外出傳入 adapter 參數(shù)支持自定義請求能力的實現(xiàn),不過很少使用。大部分請求下,我們都是使用內置的適配器實現(xiàn)。hqj28資訊網(wǎng)——每日最新資訊28at.com

defaults.adapter

defaults.adapter 的值如下:hqj28資訊網(wǎng)——每日最新資訊28at.com

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

adapters.getAdapter(['xhr', 'http']) 又是在做什么事情呢?hqj28資訊網(wǎng)——每日最新資訊28at.com

適配器實現(xiàn)

首先,adapters 位于 lib/adapters/adapters.js[4]。hqj28資訊網(wǎng)——每日最新資訊28at.com

所屬的目錄結構如下:hqj28資訊網(wǎng)——每日最新資訊28at.com

圖片圖片hqj28資訊網(wǎng)——每日最新資訊28at.com

可以看到針對瀏覽器和 Node.js 2 個環(huán)境的適配支持:http.js、xhr.js。hqj28資訊網(wǎng)——每日最新資訊28at.com

adapters 的實現(xiàn)如下。hqj28資訊網(wǎng)——每日最新資訊28at.com

首先,將內置的 2 個適配文件引入。hqj28資訊網(wǎng)——每日最新資訊28at.com

// /v1.6.8/lib/adapters/adapters.js#L2-L9import httpAdapter from './http.js';import xhrAdapter from './xhr.js';const knownAdapters = {  http: httpAdapter,  xhr: xhrAdapter}

knownAdapters 的屬性名正好是和 defaults.adapter 的值 ['xhr', 'http'] 是一一對應的。hqj28資訊網(wǎng)——每日最新資訊28at.com

而 adapters.getAdapter(['xhr', 'http']) 的實現(xiàn)是這樣的:hqj28資訊網(wǎng)——每日最新資訊28at.com

// /v1.6.8/lib/adapters/adapters.js#L27-L75export 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 個部分來講。hqj28資訊網(wǎng)——每日最新資訊28at.com

1)這里是為了兼容調用 axios() 時傳入 adapter 參數(shù)的情況。hqj28資訊網(wǎng)——每日最新資訊28at.com

// `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 是作為數(shù)組處理,所以這種場景下,我們將 adapter 封裝成數(shù)組 [adapters]。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

2)接下來,就是遍歷 adapters 找到要用的那個適配器。hqj28資訊網(wǎng)——每日最新資訊28at.com

到目前為止,adapters[i](也就是下面的 nameOrAdapter)既可能是字符串('xhr'、'http'),也可能是函數(shù)(function (config) {})。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

3)那么,我們還要檢查 nameOrAdapter 的類型。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

isResolvedHandle() 是一個工具函數(shù),其目的是為了判斷是否要從 knownAdapters 獲取適配器。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

簡單理解,只有 adapter 是字符串的情況('xhr' 或 'http'),isResolvedHandle(nameOrAdapter) 才返回 false,才從 knownAdapters 獲得適配器。hqj28資訊網(wǎng)——每日最新資訊28at.com

typeof adapter === 'function' || adapter === null 這個判斷條件我們容易理解,這是為了排除自定義 adapter 參數(shù)(傳入函數(shù)或 null)的情況。hqj28資訊網(wǎng)——每日最新資訊28at.com

而 adapter === false 又是對應什么情況呢?hqj28資訊網(wǎng)——每日最新資訊28at.com

那是因為我們的代碼只可能是在瀏覽器或 Node.js 環(huán)境下運行。這個時候 httpAdapter 和 xhrAdapter 具體返回是有差異的。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

也就是說:在瀏覽器環(huán)境 httpAdapter 返回 false,xhrAdapter 返回函數(shù);在 Node.js 環(huán)境 xhrAdapter 返回 false,httpAdapter 返回函數(shù)。hqj28資訊網(wǎng)——每日最新資訊28at.com

因此,一旦 isResolvedHandle() 邏輯執(zhí)行完成后。hqj28資訊網(wǎng)——每日最新資訊28at.com

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

會檢查 adapter 變量的值,一旦有值(非 false)就說明找到適配器了,結束遍歷。hqj28資訊網(wǎng)——每日最新資訊28at.com

if (adapter) {  break;}

4)最終在返回適配器前做空檢查hqj28資訊網(wǎng)——每日最新資訊28at.com

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

如此,就完成了跨端架構的實現(xiàn)。hqj28資訊網(wǎng)——每日最新資訊28at.com

總結

本文我們講述了 axios 的跨端架構原理。axios 內部實際發(fā)出請求是通過 dispatchRequest() 方法處理的,再往里看則是通過適配器模式取得適應于當前環(huán)境的適配器函數(shù)。hqj28資訊網(wǎng)——每日最新資訊28at.com

axios 內置了 2 個適配器支持:httpAdapter 和 xhrAdapter。httpAdapter 是 Node.js 環(huán)境實現(xiàn),通過 http/https 模塊;xhrAdapter 這是瀏覽器環(huán)境實現(xiàn),通過 XMLHttpRequest API 實現(xiàn)。Node.js 環(huán)境 xhrAdapter 返回 false,瀏覽器環(huán)境 httpAdapter 返回 false——這樣總是能返回正確的適配器。hqj28資訊網(wǎng)——每日最新資訊28at.com

參考資料

[1]axios 是如何實現(xiàn)取消請求的?: https://juejin.cn/post/7359444013894811689hqj28資訊網(wǎng)——每日最新資訊28at.com

[2]你知道嗎?axios 請求是 JSON 響應優(yōu)先的: https://juejin.cn/post/7359580605320036415hqj28資訊網(wǎng)——每日最新資訊28at.com

[3]Axios: https://github.com/axios/axios/blob/v1.6.8/lib/core/Axios.jshqj28資訊網(wǎng)——每日最新資訊28at.com

[4]lib/adapters/adapters.js: https://github.com/axios/axios/blob/v1.6.8/lib/adapters/adapters.jshqj28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://m.www897cc.com/showinfo-26-87048-0.htmlAxios 跨端架構是如何實現(xiàn)的?

聲明:本網(wǎng)頁內容旨在傳播知識,若有侵權等問題請及時與本網(wǎng)聯(lián)系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: 盤點Lombok的幾個操作,你記住了嗎?

下一篇: Python 網(wǎng)絡爬蟲利器:執(zhí)行 JavaScript 實現(xiàn)數(shù)據(jù)抓取

標簽:
  • 熱門焦點
Top 日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不
一本色道久久综合亚洲精品小说| 国产亚洲a∨片在线观看| 麻豆成人小视频| 欧美精品久久一区二区| 欧美三级视频在线| 国产麻豆91精品| 在线视频成人| 中日韩美女免费视频网站在线观看| 亚洲欧美资源在线| 美女精品一区| 国产精品久久波多野结衣| 国内一区二区三区| 日韩亚洲成人av在线| 亚洲欧美日本国产专区一区| 久久精品亚洲国产奇米99| 欧美丰满高潮xxxx喷水动漫| 国产精品大片| 一区二区三区在线免费播放| 99成人在线| 久久精品国产一区二区电影| 欧美国产精品专区| 国产精品系列在线播放| 亚洲成色www久久网站| 亚洲一区在线免费| 欧美v国产在线一区二区三区| 国产精品伦理| 亚洲国产欧美久久| 午夜精品久久久久久久久久久久| 欧美v日韩v国产v| 国产麻豆日韩欧美久久| 亚洲区一区二| 久久精品论坛| 欧美午夜寂寞影院| 亚洲电影在线免费观看| 亚洲欧美99| 欧美日本精品在线| 影音先锋一区| 欧美亚洲免费在线| 欧美日韩中字| 亚洲欧洲在线一区| 久久久久国产精品厨房| 国产精品极品美女粉嫩高清在线 | 亚洲国产视频一区| 欧美一区二区三区四区视频| 欧美日韩国产综合视频在线观看| 黄色精品一二区| 亚洲欧美激情在线视频| 欧美日韩国产二区| 最新亚洲电影| 久久中文在线| 国产在线欧美| 午夜在线精品偷拍| 国产精品成人一区二区艾草| 亚洲区一区二| 男人的天堂亚洲在线| 国产农村妇女精品一二区| 一本色道久久综合精品竹菊| 欧美成人官网二区| 尤物视频一区二区| 久久精品欧洲| 国产偷国产偷亚洲高清97cao| 亚洲性图久久| 欧美视频一区二区三区四区| 亚洲青色在线| 欧美激情精品久久久六区热门 | 欧美三级网址| 99精品视频一区| 欧美精品久久久久久久| 91久久精品一区| 欧美69视频| 亚洲成色www久久网站| 久久一区二区三区超碰国产精品| 国产在线麻豆精品观看| 久久成人资源| 国产专区精品视频| 久久久国产一区二区| 国产综合一区二区| 久久久精品动漫| 激情综合色丁香一区二区| 久久精品国产一区二区三区| 国产亚洲亚洲| 久久成年人视频| 国产自产在线视频一区| 久久精品视频网| 精品成人一区| 美日韩在线观看| 亚洲黄色性网站| 欧美精品aa| 制服诱惑一区二区| 国产精品亚洲精品| 久久精品91久久香蕉加勒比| 国产自产精品| 免费欧美电影| 99re热精品| 国产精品美女久久久久久免费 | 久久手机精品视频| 亚洲国产精品久久久久秋霞影院| 欧美成年人网站| aa级大片欧美三级| 国产精品欧美日韩一区| 欧美专区在线| 在线色欧美三级视频| 欧美日韩大陆在线| 亚洲免费在线视频一区 二区| 国产欧美日韩不卡免费| 欧美在线一区二区| 亚洲国产日韩在线| 欧美视频网址| 久久精彩视频| 亚洲另类视频| 国产精品丝袜91| 久久精品人人爽| 亚洲精品一区二区在线观看| 欧美性猛片xxxx免费看久爱| 欧美在线视频免费播放| 亚洲激情成人网| 国产精品成人久久久久| 久久精品国产第一区二区三区最新章节| 狠狠综合久久av一区二区老牛| 裸体一区二区三区| 中日韩男男gay无套| 国产小视频国产精品| 欧美99久久| 欧美视频在线播放| 久久成人18免费网站| 91久久精品www人人做人人爽| 国产精品福利在线| 久久午夜国产精品| 一本一本久久a久久精品综合妖精| 国产精品网站在线| 免费看亚洲片| 亚洲欧美激情一区| 亚洲欧洲在线看| 国产日韩av一区二区| 欧美黄色小视频| 欧美一区二粉嫩精品国产一线天| 亚洲国产你懂的| 国产毛片精品视频| 欧美成人精品三级在线观看| 亚洲一区二区三区欧美| 在线国产欧美| 国产精品欧美风情| 欧美成人精品在线播放| 性8sex亚洲区入口| 亚洲精品美女| 国产一区二区精品久久99| 欧美理论片在线观看| 久久国产日韩| 亚洲一区免费视频| 亚洲精品日产精品乱码不卡| 国产一区二区三区四区| 欧美日韩在线看| 免费视频久久| 久久成人免费网| 亚洲视频一区二区| 91久久精品国产91性色tv| 国产一区美女| 国产精品欧美日韩| 欧美精品日韩综合在线| 久久久www成人免费无遮挡大片| 一区二区三区日韩欧美精品| 在线观看日韩专区| 国产日韩欧美在线观看| 欧美午夜一区二区| 欧美激情一区二区三区在线| 久久久久欧美| 欧美在线观看网站| 亚洲淫性视频| 99爱精品视频| 亚洲黄页一区| 一区视频在线播放| 国产一区二区三区日韩欧美| 国产精品男女猛烈高潮激情 | 女人天堂亚洲aⅴ在线观看| 欧美在线一二三区| 亚洲欧美日韩中文播放| 亚洲手机在线| 一区二区欧美国产| 亚洲精品一区二区在线| 亚洲第一色在线| 伊人久久久大香线蕉综合直播 | 欧美视频在线观看一区| 欧美激情视频给我| 免费观看久久久4p| 久久亚洲二区| 久色成人在线| 两个人的视频www国产精品| 久久久久久亚洲精品中文字幕| 欧美亚洲一区二区三区| 午夜欧美大片免费观看| 亚洲欧美电影院| 亚洲天天影视| 亚洲欧美不卡| 国产欧美一区二区精品忘忧草 | 国产精品丝袜久久久久久app| 欧美午夜一区二区| 欧美性理论片在线观看片免费| 欧美日韩视频在线第一区| 欧美乱大交xxxxx| 欧美伦理91| 欧美日韩一区二区三区视频| 欧美日韩一区二区三区| 欧美三级在线视频| 国产精品五月天|