React請求機制優化思路

来源:https://www.cnblogs.com/Jcloud/archive/2023/08/18/17639566.html
-Advertisement-
Play Games

說起數據載入的機制,有一個繞不開的話題就是前端性能,很多電商門戶的首頁其實都會做一些垂直的定製優化,比如讓請求在頁面最早載入,或者在前一個頁面就進行預載入等等。 ...


說起數據載入的機制,有一個繞不開的話題就是前端性能,很多電商門戶的首頁其實都會做一些垂直的定製優化,比如讓請求在頁面最早載入,或者在前一個頁面就進行預載入等等。隨著react18的發佈,請求機制這一塊也是被不斷談起,並且在後續其實也給出了明確的方向。

假如我們頁面中有三個組件C1、C2、C3依次嵌套,每個組件中有對應的請求F1、F2、F3,通常大多數人會使用useeffect和state變數來實現數據流的獲取,這樣就意味著必須在組件載入時才能發起請求,所有數據獲取都發生在組件的生命周期中,如下圖所示,我們可以將這種獲取數據的方式稱作瀑布流渲染,但是這種方式有一個問題是,在這種方法中,組件之間的數據獲取是按順序進行的,這實際上意味著它們彼此阻塞,如果組件的層級嵌套很深的話,就會導致頁面的載入時間特別長。

render then fetch.png

為了阻止組件間數據獲取的這種順序阻塞,另一種方法就是在組件載入前可以使用Promise.all獲取所有的請求數據,這樣在組件載入時就已經獲取到所有的數據了。這種方式解決了組件載入順序阻塞彼此數據流獲取的問題,但是也產生了一個新的問題,在請求完成之前頁面都會是空白的。

先請求再渲染.png

基於第二種先請求後渲染的方式,還可以使用Suspense將請求和渲染並行化,Suspense 可以使得組件可以“等待”某些操作結束後,再進行渲染。而這種方式如果要用到實際項目中,還需要考慮C1、C2、C3對應的請求寫在哪裡,如果寫在組件中,那麼載入還是慢的。如果拆分出來,就需要考慮文件拆分、code splitting等工程化問題。

邊請求邊渲染.png

在認真的分析了以上三種方式以後,發現各有優劣,同時基於上述方案,我也提供一個請求優化的思路,首先將請求的JS單獨拆分出來打一個文件request.js,在html頭部引入request.js並使用async屬性讓腳本並行執行(如下代碼所示),這樣既可以保證我們的請求在最開始就能發出,也能不阻塞後續React代碼打包的js文件的執行,相當請求和渲染的代碼在並行執行。

// html頭部引入request.js
<script async src="/js/request.js"></script>

在發送完請求之後,需要將返回的數據註入到React組件中,這部分怎麼註入呢?簡單的代碼示例如下:

// request.js 中請求部分 evt是發佈訂閱模式的一個實例
window.InitData = {
    data: null,
    on: (msg, fn) => evt.on(msg, e => fn(e)),
    emit: (msg, data) => evt.emit(msg, data),
};

fetch().then(rs => {
    InitData.data = rs;
    InitData.emit("init_data", rs);
    return rs;
});

// index.js react代碼邏輯

…….

useEffect(() => {
	if (InitData.data !== null) {
	    // 這裡已經獲取到了請求的返回值
		doSomething();
	} else {
		InitData.on("init_data", (data) => {			
		    // 利用發佈訂閱模式獲取到數據
			doSomething();
		});
	}
}, []);

…….

總體思路就是在html中最先載入單獨打包出來的請求文件並加入async屬性使腳本並行執行,將返回的數據掛載到window下或者利用發佈訂閱模式將數據註入到react組件中。這樣其實類似於邊請求邊渲染的模式,利用提前請求來減少載入的時間。後續也是希望能用工程化的方式去解決數據的請求機制。

未來的話在開發時肯定是更傾向於邊請求邊渲染的這種模式,在React的官網中也有說到未來計劃讓Suspense 處理更多的場景,包括獲取數據等等,在新發佈的React18中Suspense也是支持了服務端渲染,包括近期開源的remix也都在優化請求機制能夠讓應用更快的載入。也歡迎有興趣的小伙伴一起來討論和實踐。

作者:京東零售 梁峰峰

來源:京東雲開發者社區


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 把你彈窗的id配置下即可,如圖: 參考 https://select2.org/dropdown ...
  • ##### 4 數組和對象 在JS中創建數組非常簡單. 直接[ ]即可. 也可以用正規軍的new Array(). 不過效果都是一樣的. ``` var as = [11,22,33,44,55]; var bs = new Array(11,22,33,44,55); ``` 數組的常用操作: ` ...
  • ##### 1 CSS的引入方式 CSS樣式有三種不同的使用方式,分別是行內樣式,嵌入樣式以及鏈接式。我們需要根據不同的場合不同的需求來使用不同的樣式。 - 行內樣式 行內樣式,就是寫在元素的style屬性中的樣式,這種樣式僅限於元素內部起作用。當個別元素需要應用特殊樣式時就可以使用內聯樣式。但不推 ...
  • ##### 3 字元串操作 常用的字元串操作相關的方法: ``` s.split() 字元串切割 s.substr(start, len) 字元串切割, 從start開始切, 切len個字元 s.substring(start, end) 字元串切割, 從start切割到end s.length 字 ...
  • ##### 7 錨點應用 錨點( anchor )是超鏈接的一種應用,也叫命名錨記,錨點可以像一個定位器一樣,可以實現頁面內的鏈接跳轉,運用相當普遍。例如,我們有一個網頁,由於內容太多,導致頁面很長,而且裡面的內容,可以分為N個部分。這樣的話,我們就可以在網頁的頂部設置一些錨點,這樣便可以方便瀏覽者 ...
  • ##### 2 JavaScript的基礎類型 JS雖然是一個腳本語言. 麻雀雖小, 五臟俱全. 在js中也是可以像其他編程語言一樣. 聲明變數, 條件判斷, 流程式控制制等等. 我們先看一下JS中的數據類型 在js中主要有這麼幾種數據類型(基本) ```javascrpit number 數字, 不論 ...
  • ##### 6 圖片標簽 在HTML中,圖像由標簽定義的,它可以用來載入圖片到html網頁中顯示。網頁開發過程中,有三種圖片格式被廣泛應用到web里,分別是 jpg、png、gif。 img標簽的屬性: ``` /* src屬性: 指定圖像的URL地址,是英文source的簡寫,表示引入資源。 sr ...
  • ##### 5 表單標簽 表單主要是用來收集客戶端提供的相關信息,提供了用戶數據錄入的方式,有多選、單選、單行文本、下拉列表等輸入框,便於網站管理員收集用戶的數據,是Web瀏覽器和Web伺服器之間實現信息交流和數據傳遞的橋梁. 表單被form標簽包含,內部使用不同的表單元素來呈現不同的方式來供用戶輸 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...