天天看點

SAP Commerce Cloud (電商雲) UI 的懶加載功能

訂閱專欄

最近工作中處理了 SAP Commerce Cloud (電商雲) UI 的一個懶加載 (Lazy Load) 功能的問題,這裡把自己學到的東西做個記錄。

UI 懶加載,有時又稱惰性加載,延遲加載,是和貪婪加載 (Eager Load) 截然相反的一種 UI 元件加載政策。

假設一個應用的 UI 由 A,B,C 若幹視圖組成,采用貪婪加載,則所有視圖的實作代碼,在 build 階段會被合并到一個代碼塊中,在 UI 加載領域裡,這種代碼塊的術語為 chunk. 在貪婪加載模式下,所有視圖實作代碼合并成的單一代碼塊,通常稱為 main chunk. 在使用者浏覽器通路應用的任何一個視圖,比如視圖 A 時,包含了該應用所有視圖實作代碼的 main chunk 會被浏覽器加載。當應用的規模趨于複雜時,采用貪婪加載模式 build 而成的 main chunk 尺寸也随之變大,會影響應用的首屏加載時間。

假設一個應用的部分視圖和首屏加載無關,而是使用者打開應用首頁後,需要點選某些連結,跳轉之後才能打開。為了減少應用的首屏加載時間,我們可以考慮将這部分視圖采用懶加載的方式,分别進行 build,進而生成多個 chunk, 并按需被浏覽器加載。

下面用 SAP Commerce Cloud (電商雲) 為例來具體說明。

Jerry 之前的文章 從一個實際的例子出發,談談 SAP Commerce Cloud (電商雲) 的 UI 自定義開發 曾經提到了購物車頁面的自開發場景。

這個購物車頁面,需要使用者成功加載 Commerce Cloud 首頁後,點選右上角的購物車圖示才能夠顯示:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

然而預設情況下,該購物車的自開發元件,MyCartComponent,還是被預設打包到 main chunk 内。我們可以用文本編輯器,打開名為 main-es2015.js 的main chunk 檢視其内容。

下圖是自開發 MyCartComponent 的 TypeScript 實作:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

被 Angular 編譯器編譯成 JavaScript 代碼後,其對應代碼能夠在 main-es2015.js 裡找到:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

運作時,盡管客戶僅僅通路了 SAP Commerce Cloud 首頁,沒有點選購物車,然而因為購物車自開發元件遵循的預設貪婪加載模式,是以其實作代碼仍然被包含在了 main chunk 裡,随首屏一并加載。

SAP Commerce Cloud (電商雲) UI 的懶加載功能

下面我們就來試試,用懶加載模式,來加載SAP Commerce Cloud (電商雲) 的自開發元件。

因為前一篇文章,我們已經使用了自開發購物車作為例子,本文就換一個例子來闡述。

SAP Commerce Cloud (電商雲) 頁面上這種能夠通過點選,跳轉到産品明細頁面的圖檔控件,稱之為 Banner,當然也是能夠定制開發的:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

比如我建立了一個 Lazy Banner Component,裡面啥邏輯都沒有,就列印一行寫死的 I am lazy 的字元串:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

在app.module.ts 裡啟用我自開發的 LazyBanner 元件之後:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

SAP Commerce Cloud 的 UI 渲染如下:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

現在更改代碼,以懶加載的方式,啟用自開發元件 LazyBanner 的加載:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

通過比較兩種加載模式的代碼能發現,利用 Angular 動态 import 語句,阻止了 builder 将 LazyBanner 元件的實作打包到 main chunk 的行為。

執行 ng build, 這次就能發現,LazyBanner 元件的實作已經和 main chunk 分開進行打包了,生成了一個單獨的 chunk:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

該 LazyBanner 元件生成的 chunk 的 JavaScript 源代碼如下:

SAP Commerce Cloud (電商雲) UI 的懶加載功能

而在運作時,通過 Chrome 開發者工具,我們也能觀察到,LazyBanner 元件對應的 chunk,是和 main chunk 分開進行加載的。

在實際項目實施過程中,如果一個自開發元件的規模過于龐大,并且和首屏加載邏輯無關,則可考慮通過懶加載的方式,将其同 main chunk 剝離開,進而減少首屏加載時間。

SAP Commerce Cloud (電商雲) UI 的懶加載功能

另外,SAP UI5 也同樣支援懶加載機制,SAP UI5 的從業者,可以移步這篇文章進行學習。感謝大家的閱讀。

SAP Commerce Cloud (電商雲) UI 的懶加載功能

繼續閱讀