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

Axios 功能擴展之Axios-Retry 源碼閱讀筆記

開發 前端
通過對 axios-retry 這一周下載量 100w+ 的三方庫來學習下其功能設計,工具庫項目的發包策略,并借此拋磚引玉,以提升我們的編碼設計能力!

[[436191]]

前兩天分析了 Axios 的源碼設計🔗,其中的攔截器(interceptor)為擴展 Axios 留下了入口,在工作中我們也時常會擴展 Axios,例如:取消重復請求、權限驗證、失敗重試等。

那么如何設計實現一個好的攔截器來擴展 Axios?

通過對 axios-retry 這一周下載量 100w+ 的三方庫來學習下其功能設計,工具庫項目的發包策略,并借此拋磚引玉,以提升我們的編碼設計能力!

  • Github: https://github.com/softonic/axios-retry
  • NPM: https://www.npmjs.com/package/axios-retry

一、工具庫的 package.json 寫法

看一個模塊的源碼,首先先看 README.md 和 package.json 文件。

參考如上,未來我們也應該在開發工具庫的時候需要關注以下字段:

  • files:在發包的時候發布將 es、lib 兩文件夾,以及 index.js 和 index.d.ts 文件。
  • typings:TypeScript 類型定義文件,用于在 TypeScript 編碼環境下智能類型提示,該字段亦可寫作 types。
  • main:主要入口文件,表明在項目中引入當前庫時候,默認指向的文件是 index.js
  • module:并非官方字段,打包工具約定的如果有該字段,則在例如 Rollup 和 Webpack 打包時,處理指定導入我們庫的 ESM 版本的文件路徑。
  • exports:提供了一種方法來為不同的環境和 JavaScript 風格顯示聲明如何引入模塊,同時限制對其內部部分的訪問,該字段提案來自:Bare Module Specifier Resolution in node.js[1]

通過依賴字段以及 scripts 字段:

開發依賴和使用依賴

可以得知,當前項目直接使用 Babel 作為打包編譯工具,通過執行 npm run release 發包,并結合 npm scripts 的 pre 和 post 執行生命周期依次執行完成如下任務:

npm run release 執行的任務流程(原文鏈接可查看大圖)

更多關于 package.json 字段的功能/作用描述,可參考 package.json - NPM[2]

二、源碼分析

根據 package.json 文件中關于“發包”命令相關解讀之后,可以得知 ./es/ 文件夾下的 index.mjs 為功能實現文件。

2.1 為什么是 .mjs 文件名后綴

Node.js 原本的模塊系統是 CommonJs (使用 require 和 module.exports 語法)。

自 Node.js 創建后, ECMAScript 模塊系統 (使用 import 和 export 語法) 已經變成一種標準,并且 Node.js 已經加入并實現支持 ES 模塊系統。

Node.js 將 *.cjs 文件當作 CommonJS 模塊, *.mjs 文件當作 ECMAScript 模塊。它會將 .js 文件視為項目的默認模塊系統,除非 package.json 聲明 "type": "module",否則就是 CommonJS。

2.2 axios-retry 的用法

axios-retry 對外導出 axiosRetry() 方法:

注入攔截器

通過對 axios 單例添加“攔截器”,來擴展實現自動重試網絡請求功能。

axios-retry 主要接受兩個參數,第一個是 axios 實例,第二個是 axios-retry 的配置 defaultOptions:

  1. defaultOptions: { 
  2.     retries?: number; // 自動重試次數 
  3.     shouldResetTimeout?: boolean; // 是否重置“超時時間” 
  4.     retryCondition?: Function; // 重試的條件,可傳入自定義判斷函數 
  5.     retryDelay?: Function;  // 重試請求的間隔時間的函數 

功能配置看起來挺完善的,難怪那么受歡迎。

2.3 請求攔截器設計&實現

在請求攔截器中會做狀態初始化,更新請求次數:

  1. axios.interceptors.request.use((config) => { 
  2.   const currentState = getCurrentState(config); 
  3.   // 設置上次請求的時間 
  4.   // 思考🤔:為什么不放到 getCurrentState() 函數內一起設置? 
  5.   currentState.lastRequestTime = Date.now(); 
  6.   return config; 
  7. }); 
  1. /** 
  2.  * 初始化并返回給定“請求”和“配置”的重試狀態 
  3.  * @param  {AxiosRequestConfig} config 
  4.  * @return {Object} 
  5.  */ 
  6. function getCurrentState(config) { 
  7.   // 從 config 獲取狀態 
  8.   const currentState = config[namespace] || {}; 
  9.   // 記錄當前請求的次數 
  10.   currentState.retryCount = currentState.retryCount || 0; 
  11.   // 更新/寫入 config 中當前請求狀態 
  12.   config[namespace] = currentState; 
  13.   return currentState; 

通過對 axios config 注入 axios-retry 字段作為存儲請求狀態的字段,在 axios 的請求執行鏈中,可隨時從 axios config 中拿到當前請求狀態。

另外,我們看到請求攔截器中并沒有設置 reject 的函數,或許這里可以添加針對 reject 響應函數,用于在發生請求異常后,可直接不需要重試請求,因為錯誤的請求配置必然是無意義的網絡請求,重試請求也是無意義的,直接中斷退出請求執行鏈。

關于退出 Promise 執行鏈,提供幾個參考的討論:

  • 從如何停掉 Promise 鏈說起[3]
  • Promise 的鏈式調用與中止[4]

2.4 響應攔截器設計&實現

在攔截器中,只響應 reject 函數,也就是只在 axios 響應階段發生錯誤(拋出異常)的時候,才會執行當前攔截器。

  1. axios.interceptors.response.use(null, async (error) => { 
  2.   const { config } = error; 
  3.  
  4.   // 讀取不到 config,則退出,可能是一些其他異常情況 
  5.   // 例如:主動取消請求,是直接拋出的錯誤 
  6.   if (!config) { 
  7.     return Promise.reject(error); 
  8.   } 
  9.  
  10.   // 從 defaultOptions 讀取并設置默認值 
  11.   const { 
  12.     retries = 3, // 默認自動重試 3 次 
  13.     retryCondition = isNetworkOrIdempotentRequestError, 
  14.     retryDelay = noDelay, 
  15.     shouldResetTimeout = false 
  16.   } = getRequestOptions(config, defaultOptions); 
  17.  
  18.   const currentState = getCurrentState(config); 
  19.  
  20.   // 判斷是否需要重試 
  21.   if (await shouldRetry(retries, retryCondition, currentState, error)) { 
  22.     // 需要的話,則 currentState 需要更新重試次數 
  23.     currentState.retryCount += 1; 
  24.     const delay = retryDelay(currentState.retryCount, error); 
  25.  
  26.     // Axios 合并默認配置失敗,因為循環結構 
  27.     // 參考 issue: https://github.com/mzabriskie/axios/issues/370 
  28.     fixConfig(axios, config); 
  29.  
  30.     // shouldResetTimeout 默認為 false 
  31.     // 根據實際請求的時間,并比較 config.timeout,選最大值來設置的超時時間 
  32.     if (!shouldResetTimeout && config.timeout && currentState.lastRequestTime) { 
  33.       const lastRequestDuration = Date.now() - currentState.lastRequestTime; 
  34.       // Minimum 1ms timeout (passing 0 or less to XHR means no timeout) 
  35.       // 設置超時時間最小 1ms(認為 <= 0 的 XHR 請求不算超時) 
  36.       config.timeout = Math.max(config.timeout - lastRequestDuration - delay, 1); 
  37.     } 
  38.  
  39.     config.transformRequest = [(data) => data]; 
  40.      
  41.     // 常見的 Promise 延時的寫法(sleep) 
  42.     // 重新發起請求,調用 axios(config) 
  43.     // 因為無論何種類型請求,都會被標準化為 axios(config) 
  44.     // 在應用層 axios.prototye.request 做了兼容轉換 
  45.     return new Promise((resolve) => setTimeout(() => resolve(axios(config)), delay)); 
  46.   } 
  47.  
  48.   return Promise.reject(error); 
  49. }); 

總結

這是針對 axios 源碼分析文章的一個補充,作為常見對于 axios 的功能擴展,失敗重試 axios-retry 算是一個比較好的例子,可以作為之后擴展 axios 功能的一個模板。

另外,axios-retry 中通過 Babel 直接打包,以及其借助 NPM scripts 的生命周期,將測試、更新版本,打包構建、發布、Git push串聯起來,也是值得借鑒之處。

在文中有提到,在請求攔截器中可以,添加針對“發起網絡請求”前的錯誤處理,如果發生錯誤,直接中斷重試過程,避免錯誤的請求多次發起,節省計算資源,可以動手嘗試實現一下。

當然,是否需要重試請求,在響應攔截器中通過 shouldRetry() 函數來保證了,但在 axios 請求執行鏈上,響應攔截器始終是需要通過發起網絡請求(dispachRequest() 事件)后才會執行,所以這個嘗試還是可以研究研究🧐,對于搞懂 Promise 執行鏈大有裨益。

參考資料

[1]Bare Module Specifier Resolution in node.js:

https://github.com/jkrems/proposal-pkg-exports/

[2]package.json - NPM:

https://docs.npmjs.com/cli/v8/configuring-npm/package-json

[3]從如何停掉 Promise 鏈說起:

https://github.com/xieranmaya/blog/issues/5

[4]Promise 的鏈式調用與中止:

https://cnodejs.org/topic/58385d4927d001d606ac197d

 

責任編輯:姜華 來源: DYBOY
相關推薦

2021-11-19 07:54:59

Axios網絡源碼

2013-12-24 10:05:04

memcached

2014-07-03 15:40:09

Apache Spar

2018-07-30 16:31:00

javascriptaxioshttp

2022-02-14 10:16:22

Axios接口HTTP

2021-09-04 23:27:58

Axios源碼流程

2025-03-25 08:40:00

前端開發Axios

2020-12-03 08:14:45

Axios核心Promise

2021-11-17 08:24:47

Vue3 插件Vue應用

2021-09-09 10:23:08

GinNetHttp

2021-07-27 14:50:15

axiosHTTP前端

2021-06-02 05:41:48

項目實踐Axiosaxios二次封裝

2023-05-05 00:08:37

AxiosAlova開發

2021-04-22 05:37:14

Axios 開源項目HTTP 攔截器

2020-10-20 09:12:57

axios核心原理

2016-09-20 10:15:49

LaravelPHPContainer

2016-09-20 10:26:25

LaravelPHPMiddleware

2012-03-01 09:38:43

GoogleChrome

2013-12-31 10:32:57

移動閱讀多看閱讀PDF

2022-07-05 16:03:29

電源管理子系統鴻蒙
點贊
收藏

51CTO技術棧公眾號

成人免费在线观看视频| 天天操天天干天天摸| 99热播精品免费| 国产欧美日本一区二区三区| 国产精品直播网红| 成人免费视频网站入口::| 日韩在线成人| 欧美日韩免费网站| 亚洲日本精品| 殴美一级特黄aaaaaa| 丝袜美腿一区二区三区| 精品国模在线视频| 天堂www中文在线资源| 电影在线观看一区二区| 亚洲成人中文在线| 亚洲v欧美v另类v综合v日韩v| 国内精品久久久久久久久久 | 在线视频不卡一区二区| 欧美一级在线免费观看| 日韩电影一区二区三区| 欧美激情网友自拍| 精品一区二区三孕妇视频| 91亚洲无吗| 欧美剧在线免费观看网站 | 精品福利一区二区三区| 美女少妇一区二区| 理论不卡电影大全神| 亚洲天堂免费在线观看视频| 欧美成人在线免费观看| 精品人妻无码一区二区色欲产成人| 欧美亚洲一区| 欧美精品成人在线| 麻豆明星ai换脸视频| av在线不卡顿| 精品亚洲国产成av人片传媒| 成人在线观看一区二区| 中文成人在线| 欧美系列一区二区| 日本xxxxxxx免费视频| 国产www视频在线观看| 国产精品国产a级| 日韩欧美99| 毛片在线免费| 99re这里只有精品首页| 鬼打鬼之黄金道士1992林正英| 这里只有精品9| 日本美女视频一区二区| 青青久久av北条麻妃黑人| 免费人成在线观看| 亚洲欧美文学| 久久躁狠狠躁夜夜爽| 免费黄色激情视频| 久久精品不卡| 自拍偷拍免费精品| 四虎国产成人精品免费一女五男| 视频国产一区| 国产一区二区三区在线观看视频| 欧美激情aaa| 欧美日韩精品一区二区三区在线观看| 欧美变态口味重另类| 亚洲性图第一页| 国产精品巨作av| 日韩国产在线看| 亚洲成人日韩在线| 国内成人自拍| 中文字幕亚洲无线码a| 影音先锋男人看片资源| 婷婷久久一区| 欧美激情图片区| 亚洲黄色三级视频| 丝袜国产日韩另类美女| 国产精品视频yy9099| 一卡二卡三卡在线| 精品一区中文字幕| 成人av播放| 手机在线观看免费av| 91麻豆精品秘密| 日韩欧美三级一区二区| 婷婷视频在线| 一区二区三区在线免费观看| 免费的一级黄色片| 日本乱码一区二区三区不卡| 色婷婷综合中文久久一本| 精品久久久久av| 亚洲精品伊人| 精品国产乱码久久久久久闺蜜| 亚洲中文字幕无码av| 女人丝袜激情亚洲| 久久综合电影一区| 日韩毛片在线播放| 日本特黄久久久高潮| 成人免费自拍视频| 天天干视频在线| 中文一区一区三区高中清不卡| 男人的天堂成人| 天堂在线中文网官网| 欧美午夜精品久久久久久孕妇| 在线观看av免费观看| 日韩精品社区| 久久精品国产清自在天天线| 日韩精品――中文字幕| 人人狠狠综合久久亚洲| 粉嫩高清一区二区三区精品视频 | 大奶一区二区三区| 亚洲午夜国产成人av电影男同| 日韩成人毛片视频| 久久精品一区二区三区中文字幕| 亚洲va欧美va在线观看| 你懂的在线观看| 亚洲综合一二三区| 邪恶网站在线观看| 天堂成人娱乐在线视频免费播放网站| 日韩一区二区福利| 黄色在线免费观看| 国产河南妇女毛片精品久久久| 欧美日韩亚洲在线| 后进极品白嫩翘臀在线播放| 777久久久精品| www.狠狠爱| 亚洲精品麻豆| 亚洲已满18点击进入在线看片| 免费在线国产| 亚洲国产精品视频| 精产国品一二三区| 日韩久久综合| 国产极品jizzhd欧美| 人妻无码一区二区三区久久99| 亚洲欧洲日韩在线| 久久精品午夜福利| 欧美日韩夜夜| 久久久日本电影| 国产成人精品一区二三区四区五区| 久久精品在线观看| av之家在线观看| 超碰97久久| 欧美激情一区二区三区久久久| 一级黄色大片免费| 国产日本一区二区| 日韩精品一区二区三区不卡| 欧美顶级毛片在线播放| 久久久视频精品| 日本高清视频在线| 亚洲一级二级三级| 成人免费看片载| 国产精品sm| 97超级碰碰| 日本动漫理论片在线观看网站| 56国语精品自产拍在线观看| 婷婷综合在线视频| 蜜桃一区二区三区在线观看| 视频一区不卡| 日本国产亚洲| 久久综合电影一区| 亚洲精品无码专区| 亚洲一二三级电影| 少妇精品无码一区二区三区| 在线观看亚洲| 久久精品日产第一区二区三区乱码 | 免费精品一区二区三区在线观看| 久久久999精品| www.国产欧美| 天天操天天综合网| 国产精品久久久久无码av色戒| 奶水喷射视频一区| 亚洲精品9999| 国产美女亚洲精品7777| 久久在线免费视频| 高清国产mv在线观看| 亚洲香蕉伊在人在线观| 亚洲黄色在线网站| 日本不卡在线视频| 欧洲精品视频在线| 久久悠悠精品综合网| 欧美在线视频一区| 99re热久久这里只有精品34| 91精品国产综合久久香蕉的特点| 九九精品在线观看视频 | 男生草女生视频| 久久国产精品第一页| 久久久久久久久久久综合| 欧美中文一区| 成人国产精品免费视频| 波多野在线观看| 一区二区欧美亚洲| 午夜精品在线播放| 日本韩国欧美一区二区三区| 欧美手机在线观看| av一本久道久久综合久久鬼色| 日本老熟妇毛茸茸| 亚洲人成免费网站| 老司机精品福利在线观看| 欧美日韩在线精品一区二区三区激情综合 | 国产在线精品一区免费香蕉 | 国产精品99精品无码视亚| 亚洲欧美日韩一区在线观看| 中文字幕一区二区三区乱码 | 99中文字幕在线观看| 色愁久久久久久| 成人国产在线激情| 美女高潮视频在线看| 日韩亚洲一区二区| 日韩午夜影院| 日韩视频不卡中文| 欧美男人天堂网| 亚洲国产毛片aaaaa无费看| 性欧美13一14内谢| 国产成人精品免费网站| 成人免费在线观看视频网站| 极品裸体白嫩激情啪啪国产精品| 亚洲欧洲精品一区二区三区波多野1战4| 一区二区日韩| 国产情人节一区| 欧美成人h版| 久久免费少妇高潮久久精品99| 91精彩在线视频| 日韩理论片久久| 国模无码一区二区三区| 欧美日韩视频在线一区二区| 国产欧美一区二区三区在线看蜜臂| 亚洲日本一区二区三区| 91资源在线播放| 久久综合精品国产一区二区三区 | 欧美激情99| 91香蕉电影院| 精品久久毛片| 国产成人+综合亚洲+天堂| 超黄网站在线观看| 欧美黑人巨大精品一区二区| 久草中文在线观看| 日韩网站在线观看| 搞黄视频在线观看| 亚洲区免费影片| 午夜激情小视频| 亚洲第一福利网站| www.国产欧美| 欧美电影免费提供在线观看| 999免费视频| 911精品产国品一二三产区| 在线免费看av的网站| 欧美日韩视频在线第一区 | 精品日韩欧美在线| 精品久久无码中文字幕| 欧美一区在线视频| 99热这里精品| 日韩女同互慰一区二区| 亚洲爆乳无码一区二区三区| 日韩欧美国产精品一区| 亚洲av综合色区无码一二三区| 日韩一区二区三| 国产suv精品一区二区69| 欧美一区二区三级| 成人高潮片免费视频| 精品精品国产高清a毛片牛牛 | japanese色系久久精品| 98国产高清一区| 成人三级av在线| 久久国产精品一区二区三区四区 | 玖玖精品在线视频| 伊人久久大香线| 国产一区二区三区在线免费| 影音先锋亚洲精品| 日日鲁鲁鲁夜夜爽爽狠狠视频97| 国产精品久久久久9999高清| 97视频在线免费播放| 日韩电影免费在线看| www.色欧美| 粉嫩一区二区三区性色av| 好男人香蕉影院| 久久久久久毛片| 天天操天天摸天天舔| 亚洲黄色片在线观看| 日本熟妇毛耸耸xxxxxx| 日韩欧美在线视频免费观看| 成人免费一区二区三区| 91精品国产综合久久香蕉的特点| 乱精品一区字幕二区| 亚洲美女黄色片| 思思99re6国产在线播放| 欧美激情一区二区久久久| 成年美女黄网站色大片不卡| 国产综合久久久久久| 高清欧美性猛交xxxx黑人猛| 日本午夜精品一区二区三区| 亚洲视频电影在线| 日本韩国欧美在线观看| 蜜臀va亚洲va欧美va天堂| 在线播放国产视频| 久久精品一区二区三区不卡牛牛| 国产高清视频免费在线观看| 午夜精品成人在线| 中文字幕人妻一区二区在线视频| 日韩欧美国产三级电影视频| 国产在线视频福利| 色综合五月天导航| 91在线成人| 国产久一道中文一区| 久久精品国产亚洲夜色av网站| 日韩五码在线观看| 久久精品二区亚洲w码| 亚洲天堂美女视频| 亚洲色图在线视频| 精品人妻一区二区三区免费看 | 天堂网成人在线| 久久久久久久综合狠狠综合| 久久这里只有精品国产| 欧美日韩一区视频| 色婷婷在线视频| 久久在精品线影院精品国产| 亚洲精品国产嫩草在线观看| 国产欧美日韩综合精品二区| 久久综合电影| 欧美私人情侣网站| 成人黄色一级视频| 日本青青草视频| 欧美日韩国产综合草草| 欧美美女搞黄| 国内揄拍国内精品| 日韩一级淫片| 天天做天天爱天天高潮| 日本成人中文字幕在线视频| 国产特黄级aaaaa片免| 亚洲第一福利一区| 国产夫妻性生活视频| www.日韩不卡电影av| 国产成人精品亚洲日本在线观看| 国产精品手机视频| 影音先锋日韩精品| 日本国产一级片| 欧美国产精品一区| 无码人妻精品一区二区50| 亚洲精品suv精品一区二区| 婷婷在线播放| 91在线看网站| 欧美精品观看| 亚洲午夜精品在线观看| 亚洲欧美日本在线| 国产绿帽一区二区三区| 中文字幕亚洲欧美日韩高清| 四虎成人在线| 色之综合天天综合色天天棕色| 麻豆91精品| 亚洲AV无码国产成人久久| 日韩欧美国产一区二区| 男女污污视频在线观看| 热门国产精品亚洲第一区在线| 亚洲成人一品| 可以免费在线看黄的网站| 国产偷国产偷亚洲高清人白洁| 久久精品视频7| 在线精品高清中文字幕| 国产福利亚洲| 亚洲美女自拍偷拍| 国产综合久久久久影院| 亚洲国产成人精品综合99| 欧美成人vps| 超碰在线公开| 欧美一区二区三区精美影视 | 欧美69视频| 精品人妻无码中文字幕18禁| 亚洲1区2区3区视频| 五月天久久久久久| 日本亚洲欧洲色| 久久美女视频| 国产吃瓜黑料一区二区| 精品国产1区2区| 黄色av网址在线免费观看| 国产精品亚洲网站| 欧美成人嫩草网站| 丰满少妇xbxb毛片日本| 黑人巨大精品欧美一区二区三区 | 亚洲自拍与偷拍| 亚洲人妻一区二区| 国产精品成人播放| 91精品国产91久久综合| 大尺度在线观看| 在线观看国产精品网站| 岛国中文字幕在线| 久久riav| 国产一区视频网站| 久久久久久91亚洲精品中文字幕| 中文字幕av一区二区| 在线日韩成人| 激情网站五月天| 亚洲精品一二三| 青青青免费视频在线2| 91精品久久久久久久久久入口 | 91国产中文字幕| 日韩高清欧美| 欧美一级片黄色| 欧美性xxxxxx少妇| 888av在线视频| 中文字幕中文字幕99| 99久久精品国产毛片| 伊人22222| 韩国精品久久久999| 日韩一区二区中文| 少妇户外露出[11p]| 91.com视频| 日韩精品麻豆| 精品少妇在线视频|