在 Angular 中使用懶加載路由的方法
簡(jiǎn)介
延遲加載 是一種限制加載用戶(hù)當(dāng)前需要的模塊的方法。這可以提高應(yīng)用程序的性能并減小初始捆綁包大小。
默認(rèn)情況下,Angular 使用 急切加載 來(lái)加載模塊。這意味著在應(yīng)用程序運(yùn)行之前必須加載所有模塊。雖然這對(duì)許多用例可能是足夠的,但在某些情況下,這種加載時(shí)間開(kāi)始影響性能。
在本文中,您將在 Angular 應(yīng)用程序中使用延遲加載路由。
先決條件
要完成本教程,您需要:
- 本地安裝 Node.js,您可以按照《如何安裝 Node.js 并創(chuàng)建本地開(kāi)發(fā)環(huán)境》中的步驟進(jìn)行操作。
- 一些設(shè)置 Angular 項(xiàng)目的熟悉程度。
本教程已使用 Node v16.4.0、npm
v7.19.0、@angular/core
v12.1.0 和 @angular/router
v12.1.0 進(jìn)行驗(yàn)證。
步驟 1 – 設(shè)置項(xiàng)目
延遲加載的路由需要位于根應(yīng)用程序模塊之外。您將希望將延遲加載的功能放在功能模塊中。
首先,讓我們使用 Angular CLI 創(chuàng)建一個(gè)帶有 Angular Router 的新項(xiàng)目:
ng new angular-lazy-loading-example --routing --style=css --skip-tests
然后導(dǎo)航到新項(xiàng)目目錄:
cd angular-lazy-loading-example
讓我們創(chuàng)建一個(gè)新的功能模塊:
ng generate module shop --route shop --module app.module
現(xiàn)在讓我們還在我們的 shop
功能模塊中創(chuàng)建 3 個(gè)組件:
第一個(gè)將是 cart
組件:
ng generate component shop/cart
第二個(gè)將是 checkout
組件:
ng generate component shop/checkout
第三個(gè)將是 confirm
組件:
ng generate component shop/confirm
所有三個(gè)組件將位于 shop
目錄中。
此時(shí),您應(yīng)該有一個(gè)帶有 shop
模塊和 3 個(gè)組件的新 Angular 項(xiàng)目。
步驟 2 – 使用 loadChildren
在您的主路由配置中,您將希望執(zhí)行類(lèi)似以下操作:
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; const routes: Routes = [ { path: 'shop', loadChildren: () => import('./shop/shop.module').then(m => m.ShopModule) }, ]; @NgModule({ imports: [RouterModule.forRoot(routes)], exports: [RouterModule] }) export class AppRoutingModule { }
新的 Angular 8 中,loadChildren
期望一個(gè)使用動(dòng)態(tài)導(dǎo)入語(yǔ)法來(lái)導(dǎo)入您的延遲加載模塊的函數(shù),只有在需要時(shí)才會(huì)導(dǎo)入。動(dòng)態(tài)導(dǎo)入是基于 Promise 的,并且可以讓您訪(fǎng)問(wèn)模塊,其中可以調(diào)用模塊的類(lèi)。
步驟 3 – 在功能模塊中設(shè)置路由配置
現(xiàn)在,剩下要做的就是配置特定于功能模塊的路由。
以下是一個(gè)示例:
import { NgModule } from '@angular/core'; import { RouterModule, Routes } from '@angular/router'; import { CartComponent } from './cart/cart.component'; import { CheckoutComponent } from './checkout/checkout.component'; import { ConfirmComponent } from './confirm/confirm.component'; const routes: Routes = [ { path: '', component: CartComponent }, { path: 'checkout', component: CheckoutComponent }, { path: 'confirm', component: ConfirmComponent }, ]; @NgModule({ imports: [RouterModule.forChild(routes)], exports: [RouterModule] }) export class ShopRoutingModule { }
最后,在功能模塊本身中,您將使用 RouterModule
的 forChild
方法而不是 forRoot
來(lái)包含您的路由:
import { NgModule } from '@angular/core'; import { CommonModule } from '@angular/common'; import { ShopRoutingModule } from './shop-routing.module'; import { ShopComponent } from './shop.component'; import { CartComponent } from './cart/cart.component'; import { CheckoutComponent } from './checkout/checkout.component'; import { ConfirmComponent } from './confirm/confirm.component'; @NgModule({ declarations: [ ShopComponent, CartComponent, CheckoutComponent, ConfirmComponent, ], imports: [ CommonModule, ShopRoutingModule ] }) export class ShopModule { }
現(xiàn)在,您可以使用 routerLink
指令導(dǎo)航到 /shop
、/shop/checkout
或 /shop/confirm
,并且在首次導(dǎo)航到這些路徑時(shí)將加載模塊。
在終端中,啟動(dòng)服務(wù)器:
ng serve
這將生成一個(gè) main.js
文件和一個(gè) src_app_shop_shop_module_ts.js
文件:
初始?jí)K文件 | 名稱(chēng) | 大小 vendor.js | vendor | 2.38 MB polyfills.js | polyfills | 128.58 kB main.js | main | 57.18 kB runtime.js | runtime | 12.55 kB styles.css | styles | 119 字節(jié) | 初始總計(jì) | 2.58 MB 延遲塊文件 | 名稱(chēng) | 大小 src_app_shop_shop_module_ts.js | - | 10.62 kB
接下來(lái),使用瀏覽器訪(fǎng)問(wèn) localhost:4200
。
通過(guò)打開(kāi)瀏覽器的 DevTools 并查看網(wǎng)絡(luò)選項(xiàng)卡來(lái)驗(yàn)證延遲加載是否起作用。當(dāng)應(yīng)用程序最初在應(yīng)用程序根路徑加載時(shí),您不應(yīng)該觀(guān)察到延遲塊文件。當(dāng)您導(dǎo)航到 /shop
等路徑時(shí),您應(yīng)該觀(guān)察到 src_app_shop_shop_module_ts.js
。
您的應(yīng)用程序現(xiàn)在支持延遲加載。
結(jié)論
在本文中,您學(xué)習(xí)了如何在 Angular 應(yīng)用程序中使用惰性加載路由。
繼續(xù)學(xué)習(xí)測(cè)試帶有依賴(lài)項(xiàng)的組件、測(cè)試服務(wù)以及使用模擬、存根和間諜。
您也可以參考官方文檔,獲取更多關(guān)于惰性加載的信息。
相關(guān)文章
angular動(dòng)態(tài)刪除ng-repaeat添加的dom節(jié)點(diǎn)的方法
本篇文章主要介紹了angular動(dòng)態(tài)刪除ng-repaeat添加的dom節(jié)點(diǎn)的方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下2017-07-07Angular2中constructor和ngOninit的使用講解
這篇文章主要介紹了Angular2中constructor和ngOninit的使用講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05使用Raygun來(lái)自動(dòng)追蹤AngularJS中的異常
這篇文章主要介紹了使用Raygun來(lái)自動(dòng)追蹤AngularJS中的異常,AngularJS是一款高人氣的JavaScript庫(kù),需要的朋友可以參考下2015-06-06淺談angular4實(shí)際項(xiàng)目搭建總結(jié)
本篇文章主要介紹了淺談angular4實(shí)際項(xiàng)目搭建總結(jié),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Angular2利用組件與指令實(shí)現(xiàn)圖片輪播組件
這篇文章主要給大家介紹了Angular2中組件與指令的一個(gè)小實(shí)踐,利用組件和指令實(shí)現(xiàn)一個(gè)圖片輪播組件的相關(guān)資料,文中給出了詳細(xì)的介紹和示例代碼,需要的朋友可以參考學(xué)習(xí),下面來(lái)一起看看吧。2017-03-03AngularJS打開(kāi)頁(yè)面隱藏顯示表達(dá)式用法示例
這篇文章主要介紹了AngularJS打開(kāi)頁(yè)面隱藏顯示表達(dá)式用法,結(jié)合實(shí)例形式分析了AngularJS中打開(kāi)頁(yè)面隱藏顯示表達(dá)式相關(guān)命令使用技巧,需要的朋友可以參考下2016-12-12