Модуль ленивой загрузки — важная функция, которая помогает повысить производительность приложения Angular. Эта функция удивительна и решает большинство случаев использования.
Недавно я столкнулся с пользовательским сценарием, в котором мне нужно условно загрузить модуль для пути маршрута. Сценарий заключается в том, что если пользователю назначено какое-то разрешение, то он загружает модуль или загружает другой модуль.
Вариант использования кажется законным, но мне не удалось добиться этого с помощью текущей функции модуля отложенной загрузки.
В текущей функции ленивой загрузки мы будем использовать свойство loadChildren
для загрузки необходимого модуля. Предупреждение здесь заключается в том, что loadChildren
не предоставляет никаких аргументов или внедряемых сервисов, которые ограничивают нас от условной загрузки модулей.
const routes: Routes = [{ path:'view', loadChildren: () => import('./modules/view/view.module') .then(x => x.ViewModule) }]; @NgModule({ imports: [RouterModule.forRoot(routes, { useHash: true })], exports: [RouterModule] }) export class AppRoutingModule { }
Чтобы решить эту проблему, я использую события маршрутизатора для изменения определения метода loadChildren. Мы можем прослушивать событие RouteConfigLoadStart, которое будет запущено перед загрузкой ленивых модулей.
Поскольку мы настраиваем метод loadChildren внутри обработчика событий маршрутизатора, теперь у нас есть внедряемые службы и другие параметры, которые обеспечат больший контроль над загрузкой модуля.
import { Component } from '@angular/core'; import { RouteConfigLoadStart, Router } from '@angular/router'; @Component({ selector: 'my-app', templateUrl: './app.component.html', styleUrls: ['./app.component.css'], }) export class AppComponent { name = 'Conditionally lazy load modules'; enableEdit = false; constructor(private router: Router) { this.router.events.subscribe((x) => { console.log(x); if (x instanceof RouteConfigLoadStart && x.route.path === 'viewedit') { x.route.loadChildren = () => { if (!this.enableEdit) { return import('./modules/view/view.module').then((mod) => mod.ViewModule); } else { return import('./modules/edit/edit.module').then((mod) => mod.EditModule); } }; } }); } . . . }
Полный рабочий пример можно найти в StackBlitz ниже.
Не стесняйтесь обратиться ко мне. Удачного кодирования!!