如何在 Angular 中使用懒加载路由

简介: 如何在 Angular 中使用懒加载路由

本文详细介绍了如何在Angular应用中使用`loadChildren`和动态导入来实现路由的延迟加载,以提升性能和减小初始加载包。通过设置功能模块和路由配置,确保只有在用户访问时才加载相关组件。

简介

延迟加载 是一种限制加载用户当前需要的模块的方法。这可以提高应用程序的性能并减小初始捆绑包大小。

默认情况下,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 { }

最后,在功能模块本身中,您将使用 RouterModuleforChild 方法而不是 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 应用程序中使用惰性加载路由。

继续学习测试带有依赖项的组件、测试服务以及使用模拟、存根和间谍。

您也可以参考官方文档,获取更多关于惰性加载的信息。


目录
相关文章
|
6月前
|
JavaScript 前端开发 应用服务中间件
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
angular引入包、路由权限配置、打包问题与nginx配置问题(简单部署)
153 0
|
3月前
|
SEO 搜索推荐 数据采集
让 JSF 应用秒变搜索引擎宠儿!揭秘 SEO 优化的神奇魔法,让你的网站脱颖而出!
【8月更文挑战第31天】随着互联网的发展,搜索引擎已成为用户获取信息的主要途径,SEO 对 Web 应用至关重要。本文介绍如何提升 JavaServer Faces(JSF)应用的 SEO 友好性,包括关键词优化、网页结构优化和外部链接建设等基础知识,并提出了使用语义化 HTML 标签、优化页面标题和描述、生成静态 HTML 页面及 URL 重写等具体策略,帮助您的网站在搜索引擎中获得更高排名。
32 0
|
3月前
|
安全 开发者
精通Angular路由管理:从基础设置到高级配置,打造复杂SPA导航系统的全方位指南
【8月更文挑战第31天】在单页应用(SPA)中,路由管理至关重要。Angular通过其强大的路由模块提供灵活高效的解决方案。本文通过代码示例详细介绍如何在Angular中设置和管理路由,包括基础路由配置、懒加载、路由保护及高级配置,帮助开发者构建高效安全的导航系统,满足复杂SPA需求。随着Angular的发展,路由管理将更加完善,值得持续关注。
33 0
|
3月前
|
JavaScript 前端开发 API
如何在 Angular 路由中使用路由解析器
如何在 Angular 路由中使用路由解析器
37 0
|
3月前
如何在 Angular 路由中使用路由守卫
如何在 Angular 路由中使用路由守卫
46 0
|
3月前
如何在 Angular 路由中使用查询参数
如何在 Angular 路由中使用查询参数
27 0
|
6月前
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
【超实用】Angular如何修改当前页面网页浏览器url后面?param1=xxx&param2=xxx参数(多用于通过浏览器地址参数保存用户当前操作状态的需求),实现监听url路由切换、状态变化。
|
6月前
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
几个经常用到的angular路由Router、ActivatedRoute 知识点:嵌套路由、路由跳转、路由传参、路由参数获取
|
6月前
|
JavaScript
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX
解决vue项目build之后部署到服务器访问的时候出现报错:Uncaught SyntaxError: Unexpected token ‘<‘ chunk-vendors:XXXXXX