Angular性能優化實踐——巧用第三方組件和懶載入技術

 

應該有很多人都抱怨過 Angular 應用的性能問題。其實,在搭建Angular項目時,通過使用打包、懶載入、變化檢測策略和快取技術,再輔助第三方組件,便可有效提升項目性能。

 

為了幫助開發者深入理解和使用Angular,本文將以我司客戶中最為典型的業務場景——在線表格編輯為例,演示如何藉助懶載入技術,在基於 Angular的框架中實現在線導入導出Excel以及數據在線填報的功能。

 

環境準備

 

  1. 全局安裝Angular CLI:npm install -g @angular/cli
  2. 使用Angular CLI創建一個新項目:ng new spread-sheets-angular-cli
  3. 下載SpreadJS Npm包:npm install @grapecity/spread-sheets;npm install @grapecity/spread-sheets-angular
  4. 在angular.json中配置SpreadJS CS
  5. 在Angular應用程式中使用 SpreadJS
  6. 使用Angular CLI構建和運行項目

 

完成上述環境搭建,便可將表格編輯器組件集成到 Angular 項目中,實現在線導入導出Excel以及數據在線填報等功能。

在開始優化之前,我們先來分析一下是什麼因素影響了項目的性能。

 

影響項目性能的因素

在集成 SpreadJS 表格組件後,項目的公式數據處理速度符合預期,頁面在運行也較為流暢。但是發布後,用戶打開頁面在載入時間上要比開發環境有所延長,帶來的用戶體驗較差。經過調研,發現在Angular的默認中,NgModule都是急性載入的,也就是會在應用載入時儘快載入。無論是否要立即使用,所有模組都會一併載入。

 

因此,對於多路由的大型應用,建議採用懶載入——按需載入的NgModule的模式。通過懶載入可以減少初始包的尺寸,從而減少載入時間。

 

什麼是懶載入?

在Web應用程式中,系統的瓶頸常在於系統的響應速度。如果系統響應速度過慢,用戶就會出現埋怨情緒,系統的價值也因此會大打折扣。懶載入會在首次載入時,將必須的模組載入,而其餘暫時用不到的模組則不會載入。例如在商城系統中,用戶打開首頁時,只需展示商品,此時用不上支付模組,所以支付模組就可以使用懶載入技術。

 

項目優化

1. 劃分業務模組

要懶載入Angular模組,需要在AppRoutingModule routes中使用loadchildren替代component進行配置。

 

 

 

 

在懶載入模組的路由模組中,添加一個指向該組件的路由。本次的demo存在兩個懶載入的模組。

 

 

 

 

 

 

 

2. 建立導航UI

雖然可以直接在地址欄直接輸入URL,但是有導航UI會更好用。三個a標籤分別代表主頁以及兩個需要懶載入的模組。

 

 

 

 

3. 導入與路由配置

CLI會將每個特性模組自動添加到應用級的路由映射表中,最後通過添加默認路由來最終完成。

 

 

 

4. 特性模組內部

 

 

 

我們到lazy-webexcel.module.ts文件看下,導入了lazy-webexcel-routing.module.ts和lazy-webexcel.component.ts文件。@NgModule的imports數組列出了LazyWebExcelRoutingModule,讓LazyWebExcelModule可以訪問他自己的路由模組。另外,LazyWebExcelComponent屬於LazyWebExcelModule。

 

 

 

 

設置path為空,因為AppRoutingModule 中的路徑已經設置了,LazyWebExcelRoutingModule中的此路由已經位於lazywebexcel這個上下文中。另一個模組配置也類似,因此不再贅述。

 

5. 確認它正常工作

我們可以通過Chrome的開發者工具的網路頁標籤來確認這些模組是否懶載入。點擊Designer Component LazyLoad,可以看到下圖的文件出現,表示準備就緒,特性模組被惰性載入成功。

 

 

 

總結

經過優化,首屏載入時間能得到有效的降低。另外,再說一下forRoot和forChild。CLI會把RouterModule.forRoot(routes)添加到AppRoutingModule的imports 數組中。這會讓Angular知道AppRoutingModule是一個路由模組,而 forRoot() 表示這是根路由模組。它會配置傳入的所有路由、讓你能訪問路由器指令並註冊 Router。

 

CLI 還會把 RouterModule.forChild(routes) 添加到各個特性模組中。這種方式下 Angular 就會知道這個路由列表只負責提供額外的路由並且其設計意圖是作為特性模組使用。你可以在多個模組中使用 forChild()。

 

以上就是 SpreadJS結合Angular框架,並藉助懶載入技術優化在線Excel項目的主要過程。除了懶載入,Angular還提供了很多性能優化方式,如瀏覽器快取策略、RxJS、Tree Shaking、使用AoT編譯等,用好這些技術能讓你的項目性能有所提升,為用戶提供更良好的使用體驗。

Tags: