【问题标题】:Angular Lazy Loading Submodule角度延迟加载子模块
【发布时间】:2019-08-25 03:20:40
【问题描述】:

我有一个在多个级别使用延迟加载的应用程序。 '/' 的初始路径在主 app.routes 中被捕获并重定向到延迟加载的模块。该模块也有自己的 submodule-1.routes 并且只是其他功能模块的容器。在 submodule-1.routes 中,我懒加载功能模块。据我所知,模块似乎没有被延迟加载。

我尝试在 submodule-1 本身中创建路由,并从那里延迟加载功能模块,但这没有帮助。

下面是文件夹结构

app
app.module.ts
app.routing-module.ts
-modules
--login
---login.module.ts
---login-routing.module.ts
---pages
----login-user
-----login-user.module.ts(LoginUserPageModule)
-----login-user-page.ts(LoginUserPage)
--signup
---signup.module.ts
---signup-routing.module.ts
----pages
-----signup-email
------signup-email.module.ts(SignUpEmailPageModule)
------signup-email-page.ts(SignUpEmailPage)

以下是我在 app.routes.ts 中的主要路线:

import { NgModule } from '@angular/core';
import { PreloadAllModules, RouterModule, Routes } from '@angular/router';

const routes: Routes = [
  { path: '', redirectTo: 'login', pathMatch: 'full' },
  { path: 'signup-email', loadChildren: './modules/signup/signup.module#SignupModule' },
  { path: 'login', loadChildren: './modules/login/login.module#LoginModule' },

];

@NgModule({
  imports: [
    RouterModule.forRoot(routes, { preloadingStrategy: PreloadAllModules })
  ],
  exports: [RouterModule]
})
export class AppRoutingModule { }

注册模块

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { RouterModule } from '@angular/router';
import { SignupRoutingModule } from './signup-routing.module';


@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    SignupRoutingModule
  ],
  exports:[]
})
export class SignupModule { }

SignupRoutes.ts

import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { Routes, RouterModule } from '@angular/router';

export const SIGNUP_ROUTES: Routes = [
    {
        path: '',
        loadChildren: './pages/signup-email/signup-email.module#SignupEmailPageModule'
    }
];


@NgModule({
  declarations: [],
  imports: [
    CommonModule,
    RouterModule.forChild(SIGNUP_ROUTES)
  ],
  exports: [RouterModule]
})
export class SignupRoutingModule { }

注册电子邮件页面模块

import { SignupEmailPage } from './signup-email.page';

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

@NgModule({
  imports: [
    CommonModule,
    FormsModule,
    IonicModule
    ,RouterModule.forChild(routes)
  ],
  declarations: [SignupEmailPage]
})
export class SignupEmailPageModule {}

登录模块

@NgModule({
  declarations: [],
  imports: [
    LoginRoutingModule
  ],
  providers:[
  ]
})
export class LoginModule { }

登录路由

export const LOGIN_ROUTES: Routes = [
    {
        path: '',
        loadChildren: './pages/login-user/login-user.module#LoginUserPageModule'
    }
];


@NgModule({
  declarations: [],
  imports: [
    RouterModule.forChild(LOGIN_ROUTES)
  ],
  exports: [RouterModule]
})
export class LoginRoutingModule { }

登录用户页面模块

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

@NgModule({
  imports: [
    IonicModule,
    RouterModule.forChild(routes),
    SharedModule
  ],
  declarations: [LoginUserPage]
})
export class LoginUserPageModule {}

由于“/”的默认路径被定向到正在工作的登录,我希望注册模块是延迟加载的,并且只可见一次。然而,下面是我在应用程序初始加载时从 Augury 看到的图像,这使得 LoginModule 和 SignupEmailModule 似乎都被多次加载,并且根本没有延迟加载。结果,我看到 LoginUserPage 和 SignupEmailPage 已经从 Augury 加载,如下图所示。

从 app.routing.ts 中删除 { preloadingStrategy: PreloadAllModules } 之后。我确实看到模块现在是延迟加载的,但是,当我访问每个延迟加载的模块时,我会在下面的 Augury 图中看到一个额外的“延迟”节点。我不知道为什么会这样,如果它应该在那里?

此外,每当加载延迟加载的路由时,另一条路由会返回显示为延迟,它不应该只是从那时起保持加载吗?为什么它在图表中回到显示为“惰性”,几乎就像它没有加载一样。

访问默认路径后的八卦图也是延迟加载的

访问“注册”页面的延迟加载路由后的八卦图

【问题讨论】:

  • 你有 { preloadingStrategy: PreloadAllModules },因此没有延迟加载
  • 哇,我不敢相信我错过了。谢谢它现在正在工作,但有一件事很奇怪,我不确定我是否可以上传另一张图片。现在,我看到登录模块已加载,注册时显示为(惰性),如上图所示。但是,登录模块图仍然如上。我不确定为什么“懒惰”的中间节点在那里?当我加载注册页面时,它看起来也像上面的图片,中间节点只显示“懒惰”,我不确定这是从哪里来的。

标签: angular


【解决方案1】:

在您的app.routes.ts 中设置preloadingStrategy: PreloadAllModules,这意味着您的模块正在被预加载。因此,不是在第一次请求(延迟)时加载模块,而是在后台异步加载模块。这是一种介于渴望加载和延迟加载之间的策略,但这意味着您的所有模块最终都会被加载。来自documentation:

每次成功导航后,路由器都会在其配置中查找可以预加载的未加载模块。它是否预加载一个模块,以及它预加载哪些模块,取决于预加载策略。

路由器提供了两种开箱即用的预加载策略:

  • 默认不预加载。延迟加载的特征区域仍然按需加载。
  • 预加载所有延迟加载的功能区域。

【讨论】:

  • 我现在已经让它工作了,但你能解释一下为什么在实际访问模块后,我的图表中仍然显示中间的“惰性”节点吗?
  • 你在一个延迟加载的模块中延迟加载一个模块。这就是为什么那里有两个节点。我不太确定,但我认为它没有名字的事实来自于您指向具有空路由的页面 ('')。 Augury 将路由名称附加到每个节点上,两种情况下都只有一个空字符串。
  • 好吧,这是有道理的,但你知道为什么一旦我加载了上图所示的延迟加载登录模块,注册模块显示为“延迟”,而加载的模块显示为已加载。但是,当我从当前延迟加载的模块的登录模块切换到注册时,注册现在显示为已加载,这是正确的,但现在登录模块显示为“延迟”。登录模块是否应该显示为已加载,因为它已经加载过一次,或者延迟加载的模块是否总是被卸载并且仅在使用时才显示为已加载?
  • 我目前使用 Angular 8.2.0,但我没有遇到这种行为。延迟加载的模块保持加载状态(如果不加载,效率会很低)。根据augury.rangle.io/pages/guides/routes.html,延迟加载的组件应在加载后显示。您确定从一条路线切换到另一条路线时不重新加载页面吗?如果发生这种情况,所有延迟加载的模块都会再次“卸载”。例如。如果您在浏览器 url 字段中输入注册路线的路线,则应用程序将重新加载。您使用的是哪个版本的 Augury?
  • 这正是我为测试目的所做的,因为我还没有实现任何路由返回,通过应用程序但只是向前,我直接在 url 字段中输入它。当我使用实际路由在应用程序中前进时,一切看起来都很好。谢谢你的建议。
猜你喜欢
  • 2018-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多