Angular 中的延迟加载功能模块

541 阅读7分钟
Knoldus博客音频

阅读时间: 6 分钟

在开始介绍angular的lazy-loading功能模块之前,首先,让我们了解一下什么是模块?所以,模块是一种将组件、管道和服务等都组合在一起的方式,它们之间是相互关联的。模块集被组合在一起,形成一个应用程序。一个组件可以使用其他模块的数据。

Angular模块。

在angular中,这个功能是由NgModule定义的。每个应用程序至少有一个NgModule类,它是一个应用程序的根模块。根模块是AppModule,我们在src/app/app.module.ts文件中定义它。

为了创建一个Angular Module,我们必须使用类装饰器@NgModule,这个装饰器使用一个带有定义模块的属性的元数据对象。主要的属性是。

  • **imports:**包含其他模块的数组,这些模块可以被该模块的组件使用。
  • declarations: 接收属于该模块的组件的数组。
  • 出口:定义一个可以被其他模块使用的组件、指令和管道的数组。
  • providers:声明服务,如果它是根模块,那么这些服务对整个应用程序都是可用的。

根模块的基本根结构看起来像这样。

import { BrowserModule } from '@angular/platform-browser';
import { NgModule } from '@angular/core';
import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';
@NgModule({
 declarations: [
   AppComponent
 ],
 imports: [
   BrowserModule,
   AppRoutingModule
 ],
 providers: [], 
 bootstrap: [AppComponent] 
})
export class AppModule { }

因此,这段代码表明,在@NgModule装饰器的帮助下,AppModule类变成了Angular Module。

现在我们来了解一下什么是Angular中的懒惰加载功能模块?

懒惰加载功能模块。

Angular创建了一个单页应用程序,也就是说,所有的组件都是一次性加载的。所以,有可能很多不需要的库或模块也会被加载。对于小项目来说,这没有问题,但随着项目功能的增加,如果所有的东西都一次性加载,那么加载的时间也会增加。懒惰加载有助于保持较小的初始包尺寸,这反过来又有助于减少加载时间。

让我们开始一步步的指导。

有以下步骤,我们可以通过这些步骤来设置懒惰加载的功能模块。

1)设置一个应用程序(如果你已经创建了应用程序,你可以跳过这一步

首先,我们必须在CLI的帮助下创建angular应用程序。我们必须写。

ng new angular-lazy-loading --routing

(i) 这个命令将创建名为angular-lazy-loading的angular应用程序。
(ii) -routing标志会生成一个名为app-routing.module.ts的文件,这是我们为功能模块设置懒惰加载所需要的文件之一。
(iii) 现在通过 "cd "移动到应用程序,即cd angular-lazy-loading

2)在路由的帮助下创建功能模块

接下来,我们需要一个名为lazy-loading的独立路由文件的功能模块。

要了解更多关于路由和导航的信息,你可以参考这里。

这里,lazy-loading是功能模块的名称。加载lazy-loading功能模块的路径也是lazy-loading,因为它是用-route选项指定的。因此,我们要把命令写成。

ng generate module lazy-loading --route lazy-loading --module app.module

这样就创建了一个懒惰加载文件夹,其中包括文件中定义的新的可懒惰加载功能模块LazyLoadingModulelazy-loading-routing.module.ts文件中定义的路由模块LazyLoadingRoutingModule。该命令自动声明了Lazy-loadingComponent,并在新功能模块内导入了LazyLoadingRoutingModule

在app.module.ts中定义了路由数组

const routes: Routes = [
  {
    path: 'lazy-loading',
    loadChildren: () => import('./lazy-loading/lazy-loading.module').then(m => m.LazyLoadingModule)
  }
];

这里,lazy-loading使用loadChildren后面的函数。导入路径是模块的相对路径。

3.添加另一个功能模块

与存根组件一起添加一个新的功能模块。为此,我们必须编写上述相同的命令来生成它。

ng generate module lazy-loading2 --route lazy-loading2 --module app.module

现在,src/app/app-routing.module.ts将变成这样。

const routes: Routes = [
  {
    path: 'lazy-loading',
    loadChildren: () => import('./lazy-loading/lazy-loading.module').then(m => m.LazyLoadingModule)
  },
  {
    path: 'lazy-loading2',
    loadChildren: () => import('./lazy-loading2/lazy-loading2.module').then(m => m.LazyLoading2Module)
  }
];
4.设置用户界面

现在我们必须设置我们的用户界面。在app.component.html中,我们必须用一个简单的自定义导航来替换默认的HTML,它可以帮助我们在浏览器中导航我们的模块。app.component.html将看起来像这样。

<h1>
  {{title}}
</h1>

<button routerLink="/lazy-loading">Lazy-loading-1</button>
<button routerLink="/lazy-loading-2">Lazy-loading-2</button>
<button routerLink="">Home</button>

<router-outlet></router-outlet>

现在要在浏览器中运行该应用程序,请在终端中写下以下命令。

ng serve

之后,到浏览器中写,localhost:4200,在这里我们看到我们的懒人应用程序有三个按钮。

UI看起来像这样。

所有的三个按钮将自动工作,因为它们是通过CLI添加的。

5.输入和路由配置

在CLI的帮助下,它自动添加了功能模块的路由。我们已经在app-routing.module.ts文件中定义了rote数组,另外,现在我们只需要添加默认路径就可以完成了。我们可以像下面的代码那样更新它。

const routes: Routes = [
  {
    path: 'lazy-loading',
    loadChildren: () => import('./lazy-loading/lazy-loading.module').then(m => m.LazyLoadingModule)
  },
  {
    path: 'lazy-loading2',
    loadChildren: () => import('./lazy-loading2/lazy-loading2.module').then(m => m.LazyLoading2Module)
  },
{
    path: '',
    redirectTo: '',
    pathMatch: 'full'
  }
];

前两条路径是通往LazyLoadingModule和LazyLoading2Module的路由。最后一条定义了一个默认路径。

6.在功能模块内部

现在移到第一个功能模块,即LazyLoadingModule。如果你使用CLI,那么按照上面提到的步骤,你不必做任何事情,但如果不使用CLI,那么在LazyLoadingModule内包含以下代码。

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';

import { LazyLoadingRoutingModule } from './lazy-loading-routing.module';
import { LazyLoadingComponent } from './lazy-loading.component';


@NgModule({
  declarations: [
    LazyLoadingComponent
  ],
  imports: [
    CommonModule,
    LazyLoadingRoutingModule
  ]
})
export class LazyLoadingModule { }

与此同时,路由特定的功能模块文件,即lazy-loading-routing.module文件看起来像这样。

import { NgModule } from '@angular/core';
import { RouterModule, Routes } from '@angular/router';
import { LazyLoadingComponent } from './lazy-loading.component';

const routes: Routes = [{ path: '', component: LazyLoadingComponent }];

@NgModule({
  imports: [RouterModule.forChild(routes)],
  exports: [RouterModule]
})
export class LazyLoadingRoutingModule { }

这里的路径被设置为空字符串,因为AppRoutingModule中的路径已经被设置为lazy-loading。

第二个功能模块即LazyLoading2Module也将以类似方式配置。

7.验证懒惰加载

我们有几种方法可以验证。

(i)现在,所有代码 完成 ,我们必须验证does模块是否被懒惰地加载**。我们可以通过使用chrome开发工具来验证。**

在chrome中,通过使用Ctrl+Shift+i打开开发者工具,然后移动到网络标签。

之后,现在点击Lazy-loading-1或Lazy-loading-2按钮。你会看到,路线也是根据点击的按钮来确定的。为了清楚地了解情况,首先点击清楚的选项,然后再继续前进。

例如,如果你第一次点击Lazy-loading-1按钮,你就会发现。

而当你第一次点击Lazy-loading-2按钮时,你就会发现。

结果是,如果你能看到文件一切都被正确地连接起来,功能模块正在被懒惰地加载。

要再次测试,请点击清除选项,并通过使用Ctrl+Shift+R重新加载页面,这取决于你的平台。

(ii) 第二个验证方法是。

运行下面的命令来生成构建。

npm run build

之后,当你运行该命令时,你会发现像这样。

上面的图片验证了为懒人加载模块生成了一个单独的块。

(iii)另一种验证方法是打开你的项目的dist文件夹。在那里你会注意到有一个单独的文件用于使用懒加载的模块。

所以,这就是我们可以在我们的应用程序中实现懒惰加载的完整方法。

它包括几个缺点,具体如下。

缺点
  • 首先,为了实现懒惰加载,需要在现有的基础上增加额外的代码行,这使得代码变得有点复杂。
  • 用户体验可能会受到影响。例如,如果页面结构不理想,可能无法进行回溯操作。
  • 用javascript加载一个大的图片并把它放到DOM中,会占用主线程。这可能会使用户界面(UI)在解码过程中没有反应。
关于源代码,你可以参考这个github。

github.com/alkavats1/a…

总结。

在这篇博客中,我们已经了解了angular中的懒惰加载功能模块。我们已经看到了到底什么是懒惰加载,为什么我们需要它,以及如何在我们的项目中实现它的分步指南。总结一下,它有助于最大限度地减少应用程序的启动时间。它避免了对服务器的不必要的请求,并且消耗较少的内存,因为它提供了我们可以按需加载模块的功能。

分享一下Knol。

相关信息