關注分離(Separation of Concerns)在前端開發中的實踐演進:從 XMLHttpRequest 到 Fetch API

關注分離(Separation of Concerns)在前端開發中的實踐演進:從 XMLHttpRequest 到 Fetch API

一、關注分離的核心價值

關注分離(SoC)是軟件工程領域的重要設計原則,強調將系統分解為不同維度的功能模塊,每個模塊只負責單一職責。這一思想在前端領域的演進歷程中,最典型的案例莫過于網絡請求方式的迭代:從 XMLHttpRequest 到 Fetch API 的演變,清晰地展現了 SoC 原則如何推動技術架構的優化。

二、XMLHttpRequest 時代的關注耦合

const xhr = new XMLHttpRequest();
xhr.open('GET', '/api/data');xhr.onreadystatechange = function() {if (xhr.readyState === 4) {if (xhr.status === 200) {try {const data = JSON.parse(xhr.responseText);// 業務邏輯處理} catch (e) {console.error('解析失敗', e);}} else {console.error('請求失敗:', xhr.status);}}
};xhr.onerror = function() {console.error('網絡錯誤');
};xhr.send();

這段經典代碼暴露了 XHR 架構的三大問題:

  1. 生命周期耦合:readyState 管理貫穿整個請求周期
  2. 異常處理分散:狀態碼校驗、解析錯誤、網絡錯誤分散在不同位置
  3. 數據處理侵入:響應解析與業務邏輯深度耦合

三、Fetch API 的架構解耦

fetch('/api/data').then(response => {if (!response.ok) throw new Error(response.statusText);return response.json();}).then(data => {// 業務邏輯處理}).catch(error => {console.error('請求異常:', error);});

Fetch 通過分層設計實現了三個關鍵解耦:

3.1 協議層解耦
  • 使用 Promise 鏈式調用分離請求發起、響應接收、數據處理階段
  • 每個 then 方法對應一個獨立處理階段
3.2 數據處理解耦
  • 通過 body mixin 提供多種解析方法(json(), text(), blob())
  • 業務層按需選擇解析方式,不侵入網絡層
3.3 錯誤處理統一
  • 網絡故障自動觸發 reject
  • HTTP 錯誤狀態通過 response.ok 顯式判斷
  • 統一 catch 塊處理所有異常場景

四、關注分離的進階實踐

4.1 攔截器封裝
const createFetchWithInterceptor = () => {const interceptors = [];return (url, options) => {let chain = Promise.resolve({ url, options });interceptors.forEach(({ request, response }) => {if (request) chain = chain.then(args => request(args));if (response) chain = chain.then(res => response(res));});return chain.then(args => fetch(args.url, args.options));};
};
4.2 業務層抽象
class ApiClient {constructor(baseURL) {this.baseURL = baseURL;}async get(endpoint) {const response = await fetch(`${this.baseURL}${endpoint}`);return this._handleResponse(response);}async _handleResponse(response) {if (!response.ok) throw new ApiError(response.status);const contentType = response.headers.get('content-type');return contentType.includes('json') ? response.json() : response.text();}
}

五、設計原則的延伸思考

  1. 可測試性增強:分離網絡模塊后,可單獨 mock 請求進行單元測試
  2. 可維護性提升:修改響應解析邏輯不會影響請求發送過程
  3. 擴展性優化:通過中間件機制可靈活添加緩存、日志等功能
  4. 生態統一:基于 Promise 的設計天然支持 async/await 語法

六、總結

從 XHR 到 Fetch 的演進證明,優秀的架構設計應遵循以下原則:

  • 網絡協議處理與業務邏輯分離
  • 數據處理流程分層明確
  • 異常處理路徑集中統一
  • 擴展機制開放靈活

在現代前端開發中,無論是 React 的 Hooks 設計還是 Vue 的 Composition API,都延續了關注分離的設計哲學。開發者應深入理解這一原則,在構建復雜應用時設計出更清晰、更健壯的代碼架構。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/75061.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/75061.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/75061.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C之(16)scan-build與clang-tidy使用

C之(16)scan-build與clang-tidy使用 Author: Once Day Date: 2025年3月29日 一位熱衷于Linux學習和開發的菜鳥,試圖譜寫一場冒險之旅,也許終點只是一場白日夢… 漫漫長路,有人對你微笑過嘛… 全系列文章可參考專欄: Linux實踐記錄_Once_da…

在 Vue 項目中快速集成 Vant 組件庫

目錄 引言一、找到 src 下的App.js 寫入代碼。二、安裝Vant三、解決 polyfill 問題四、查看依賴五、配置webpack六、引入 Vant七、在組件中使用 Vant八、在瀏覽器中查看樣式總結 引言 在開發移動端 Vue 項目時,選擇一個高效、輕量且功能豐富的組件庫是提升開發效率…

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理

“GPU 擠不動了?”——聊聊基于 GPU 的計算資源管理 作者:Echo_Wish “老板:為什么 GPU 服務器卡得跟 PPT 一樣?” “運維:我們任務隊列爆炸了,得優化資源管理!” 在 AI 訓練、深度學習、科學計算的場景下,GPU 計算資源已經成為香餑餑。但 GPU 服務器貴得離譜,一臺 A…

AI滲透測試:網絡安全的“黑魔法”還是“白魔法”?

引言:AI滲透測試,安全圈的“新魔法師” 想象一下,你是個網絡安全新手,手里攥著一堆工具,正準備硬著頭皮上陣。這時,AI蹦出來,拍著胸脯說:“別慌,我3秒掃完漏洞&#xff0…

(二)GEE基礎學習初探及案例詳解【20250330】

Google Earth Engine(GEE)是由谷歌公司開發的眾多應用之一。借助谷歌公司超強的服務器運算能力以及與NASA的合作關系,GEE平臺將Landsat、MODIS、Sentinel等可以公開獲取的遙感圖像數據存儲在谷歌的磁盤陣列中,使得GEE用戶可以方便的提取、調用和分析海量…

redhat認證是永久的嗎

?認證有效期 ?紅帽認證一般有效期為3年?(如RHCSA、RHCE、RHCA等),從通過考試之日起計算。 ?例外:部分基礎或工程師認證(如Red Hat Certified Engineer)有效期為三年時間,以官方最新政策為準…

git --- cherry pick

git --- cherry pick cherry pick cherry pick Cherry Pick 是 Git 中的一個操作,它允許你選擇某個分支的某次(或多次)提交,并將其應用到當前分支,而不會合并整個分支的所有更改。 cherry pick 的作用 只提取某個特定的…

妙用《甄嬛傳》中的選妃來記憶概率論中的乘法公式

強烈推薦最近在看的不錯的B站概率論課程 《概率統計》正課,零廢話,超精講!【孔祥仁】 《概率統計》正課,零廢話,超精講!【孔祥仁】_嗶哩嗶哩_bilibili 其中概率論中的乘法公式,老師用了《甄嬛傳…

AI 的出現是否能替代 IT 從業者?

AI 的出現是否能替代 IT 從業者? AI 的快速發展正在深刻改變各行各業,IT 行業也不例外。然而,AI 并非完全替代 IT 從業者,而是與其形成互補關系。本文將從 AI 的優勢、IT 從業者的不可替代性、未來趨勢等方面,探討 AI…

【leetcode100】有效的括號

1、題目描述 給定一個只包括 (,),{,},[,] 的字符串 s ,判斷字符串是否有效。 有效字符串需滿足: 左括號必須用相同類型的右括號閉合。左括號必須以正確的順序閉合。每個右括號都有一個對應的…

為什么使用Flask + uWSGI + Nginx 部署服務?

概述 在Python開發的web應用中,我們通常能夠看到flask、uWSGI、Nginx出現在一起,他們之間的關系是什么?為什么總是被應用在一起?  三者共同使用為了實現一個目的:客戶端向服務端發送數據請求,服…

接口等冪處理

介紹 ? 什么是等冪(Idempotency)? 等冪 無論這個操作被執行多少次,結果都是一樣的,不會因為多次執行而產生副作用。 通俗一點說:“點一次和點一百次,效果是一樣的。” ? 在接口中&#xff0…

P1090合并果子(優先隊列)

洛谷題目 這里使用的是優先隊列&#xff0c;非常簡單 首先讓我們一起來學習一下優先隊列&#xff08;默認是從大到小來排列&#xff09; 首先要使用頭文件 #include<queue> using namespace std; 然后聲明有限隊列 priority_queue<int> a; priority_queue&…

藍橋杯備考---->并查集之 Lake Counting

這道題就統計有多少個連通塊就行了 這時候我們又需要把二維轉成一維了&#xff0c;也就是把每一個格子都給一個編號 當我們合并連通塊的時候&#xff0c;其實是只需要四個方向的 因為我們是從上往下遍歷的&#xff0c;我們遍歷到某個位置的時候&#xff0c;它已經和上面部分…

React受控表單綁定

受控表單綁定 在 React 中&#xff0c;受控組件&#xff08;Controlled Component&#xff09;是指表單元素的值由 React 組件的 state 管理&#xff0c;React 通過 onChange 事件監聽輸入變化&#xff0c;并實時更新 state&#xff0c;從而控制表單輸入值。 為什么要使用受控…

8、linux c 信號機制

一、信號概述 1. 信號概念 信號是一種在軟件層次上對中斷機制的模擬&#xff0c;是一種異步通信方式。信號的產生和處理都由操作系統內核完成&#xff0c;用于在進程之間傳遞信息或通知某些事件的發生。 2. 信號的產生 信號可以通過以下方式產生&#xff1a; 按鍵產生&…

CSP-J 2019 入門級 第一輪(初賽) 完善程序(2)

【題目】 CSP-J 2019 入門級 第一輪&#xff08;初賽&#xff09; 完善程序&#xff08;2&#xff09; &#xff08;計數排序&#xff09;計數排序是一個廣泛使用的排序方法。下面的程序使用雙關鍵字計數排序&#xff0c;將n對10000 以內的整數&#xff0c;從小到大排序。 例如…

Vue3 項目通過 docxtemplater 插件動態渲染 .docx 文檔(帶圖片)預覽,并導出

Vue3 項目通過 docxtemplater 插件動態渲染 .docx 文檔&#xff08;帶圖片&#xff09;預覽&#xff0c;并導出 預覽安裝插件示例代碼項目目錄結構截圖實際效果截圖 動態渲染 .docx 文檔&#xff08;帶圖片&#xff09;&#xff0c;預覽、導出安裝插件docx 模板文件內容完整代碼…

養老更安心!智紳科技“智慧”養老系統,智在何處?

在老齡化趨勢不斷加劇的當下&#xff0c;養老問題成為全社會關注的焦點。 人們對于養老服務的需求日益增長&#xff0c;不僅期望能夠得到基本的生活照料&#xff0c;更渴望在安全、舒適、便捷的環境中安享晚年。 智紳科技的“智慧”養老系統應運而生&#xff0c;憑借其獨特的…

MySQL 當中的鎖

MySQL 當中的鎖 文章目錄 MySQL 當中的鎖MySQL 中有哪些主要類型的鎖&#xff1f;請簡要說明MySQL 的全局鎖有什么用&#xff1f;MySQL 的表級鎖有哪些&#xff1f;作用是什么&#xff1f;元數據鎖&#xff08;MetaData Lock&#xff0c;MDL&#xff09;意向鎖&#xff08;Inte…