简介
延迟加载 是一种限制加载用户当前需要的模块的方法。这可以提高应用程序的性能并减小初始捆绑包大小。
默认情况下,angular 使用 急切加载 来加载模块。这意味着在应用程序运行之前必须加载所有模块。虽然这对许多用例可能是足够的,但在某些情况下,这种加载时间开始影响性能。
在本文中,您将在 angular 应用程序中使用延迟加载路由。
先决条件
要完成本教程,您需要:
- 本地安装 node.js,您可以按照《如何安装 node.js 并创建本地开发环境》中的步骤进行操作。
- 一些设置 angular 项目的熟悉程度。
本教程已使用 node v16.4.0、npm
v7.19.0、@angular/core
v12.1.0 和 @angular/router
v12.1.0 进行验证。
步骤 1 – 设置项目
延迟加载的路由需要位于根应用程序模块之外。您将希望将延迟加载的功能放在功能模块中。
首先,让我们使用 angular cli 创建一个带有 angular router 的新项目:
ng new angular-lazy-loading-example --routing --style=css --skip-tests
然后导航到新项目目录:
cd angular-lazy-loading-example
让我们创建一个新的功能模块:
ng generate module shop --route shop --module app.module
现在让我们还在我们的 shop
功能模块中创建 3 个组件:
第一个将是 cart
组件:
ng generate component shop/cart
第二个将是 checkout
组件:
ng generate component shop/checkout
第三个将是 confirm
组件:
ng generate component shop/confirm
所有三个组件将位于 shop
目录中。
此时,您应该有一个带有 shop
模块和 3 个组件的新 angular 项目。
步骤 2 – 使用 loadchildren
在您的主路由配置中,您将希望执行类似以下操作:
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
期望一个使用动态导入语法来导入您的延迟加载模块的函数,只有在需要时才会导入。动态导入是基于 promise 的,并且可以让您访问模块,其中可以调用模块的类。
步骤 3 – 在功能模块中设置路由配置
现在,剩下要做的就是配置特定于功能模块的路由。
以下是一个示例:
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
来包含您的路由:
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 { }
现在,您可以使用 routerlink
指令导航到 /shop
、/shop/checkout
或 /shop/confirm
,并且在首次导航到这些路径时将加载模块。
在终端中,启动服务器:
ng serve
这将生成一个 main.js
文件和一个 src_app_shop_shop_module_ts.js
文件:
初始块文件 | 名称 | 大小 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 字节 | 初始总计 | 2.58 mb 延迟块文件 | 名称 | 大小 src_app_shop_shop_module_ts.js | - | 10.62 kb
接下来,使用浏览器访问 localhost:4200
。
通过打开浏览器的 devtools 并查看网络选项卡来验证延迟加载是否起作用。当应用程序最初在应用程序根路径加载时,您不应该观察到延迟块文件。当您导航到 /shop
等路径时,您应该观察到 src_app_shop_shop_module_ts.js
。
您的应用程序现在支持延迟加载。
结论
在本文中,您学习了如何在 angular 应用程序中使用惰性加载路由。
继续学习测试带有依赖项的组件、测试服务以及使用模拟、存根和间谍。
您也可以参考官方文档,获取更多关于惰性加载的信息。
发表评论