Angular 8 CLI:如何使用提供程序延迟加载不可路由的功能模块

曼努埃尔·格拉夫

所以嘿,

我试图遵循这些指南:https : //angular.io/guide/lazy-loading-ngmodules

但是官方文档只涵盖了路由器(哇。Qngular 文档是次优的)

https://netbasal.com/the-need-for-speed-lazy-load-non-routable-modules-in-angular-30c8f1c33093

所以这篇中等文章正是我正在寻找的。我唯一的问题是它不起作用。

角度.JSON

"architect": {
        "build": {
          "builder": "@angular-devkit/build-angular:browser",
          "options": {
            "lazyModules": [
              "path/to/components#MyModule"
            ],

应用模块

 providers: [
    SystemJsNgModuleLoader, // without this I get NullInjectorError
    CookieService,
    { provide: NgModuleFactoryLoader, useClass: SystemJsNgModuleLoader }, // this doesnt seem to do anything
    {
      provide: HTTP_INTERCEPTORS, useClass: AuthHeaderInterceptor, multi: true,
    }
  ],
  bootstrap: [AppComponent]

模块

@NgModule({
  imports: [
    CommonModule,
    MatButtonModule,
    MatIconModule,
  ],
  declarations: [
    MyModule.rootComponent
  ],
  providers: [MyService],
  entryComponents: [MyModule.rootComponent]
})
export class MyModule{
  static rootComponent = MyComponent;
  static forRoot(): ModuleWithProviders {
    return {
      ngModule: MyModule,
      providers: [MyService]
    };
  }
}

服务

@Injectable()
export default class MyService {}
...

懒惰的负载提供者

export interface LAZY_MODULES {
  'MyModule': string;
}

export const lazyMap: LAZY_MODULES = {
  'MyModule': 'path/to/components#MyModule'
};

export const LAZY_MODULES_MAP = new InjectionToken('LAZY_MODULES_MAP', {
  factory: () => lazyMap
})

延迟加载指令

@Directive({
  selector: '[lazyLoadModule]'
})
export class LazyLoadModuleDirective implements OnInit, OnDestroy {

  @Input('lazyLoadModule') moduleName: keyof LAZY_MODULES;
  private moduleRef: NgModuleRef<any>;

  constructor(
    private vcr: ViewContainerRef,
    private injector: Injector,
    private loader: NgModuleFactoryLoader,
    @Inject(LAZY_MODULES_MAP) private modulesMap
  ) { }

  ngOnInit() {
    this.loader
      .load(this.modulesMap[this.moduleName])
      .then((moduleFactory: NgModuleFactory<any>) => {
        this.moduleRef = moduleFactory.create(this.injector);
        const rootComponent = (moduleFactory.moduleType as ModuleWithRoot)
          .rootComponent;

        const factory = this.moduleRef.componentFactoryResolver.resolveComponentFactory(
          rootComponent
        );

        this.vcr.createComponent(factory);
      });
  }

  ngOnDestroy() {
    this.moduleRef && this.moduleRef.destroy();
  }
}

在应用程序组件 HTML

<ng-container *ngIf="showModule"
              lazyLoadModule="MyModule">
</ng-container>

所以结果是:

  1. 如果我使用没有包装器对象的 SystemJsNgModuleLoader,Chunking 工作(webpack 报告说它构建了一个path-to-components-my-module.ts)在开发工具中,我得到 SystemJsNgModuleLoader 的 NullinjectorError

  2. 如果我直接在提供程序中使用 SystemJsNgModuleLoader,我不会在开发控制台中收到错误消息。分块也有效。但是在网络控制台中,模块永远不会被加载,即使我直接在应用程序控制器中设置 showModule=true ...

曼努埃尔·格拉夫

上面的例子有效。该指南简单地假设每个人都记得将加载器组件添加到根模块中。

有趣的是没有抛出错误(因为它是一个指令,而不是一个元素)并且系统只是假设 lazyLoadModule 是一个允许的 HTML 属性?无论如何修复:

@NgModule({
  declarations: [
    ...,
    LazyLoadModuleDirective
  ]
  ...

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用延迟加载仅加载angular 8中的模块

来自分类Dev

延迟加载不加载模块-Angular 8

来自分类Dev

Angular 8法线加载模块

来自分类Dev

功能模块中的 Angular 2 路由

来自分类Dev

我可以仅将Angular 8功能模块从一个Angular应用程序/工作区复制到另一个吗?

来自分类Dev

在Angular 8中使用共享组件进行延迟加载

来自分类Dev

功能模块中的 Angular 5 路由问题(强制路由器在路径相同但参数更改时重新加载路由)

来自分类Dev

Angular 8:没有MultilevelMenuService的提供程序

来自分类Dev

顺利加载消息Angular 8

来自分类Dev

无法使用 Angular 8 升级 Angular Material

来自分类Dev

Angular 8和使用代理

来自分类Dev

如何在另一个模块中使用一个模块并在 angular 8 中路由它?

来自分类Dev

导入功能模块时未加载Angular 2主要组件,但在未导出的功能模块中加载组件

来自分类Dev

如何使用angular8中的tileLoaded?

来自分类Dev

Angular 8中的路由器防护

来自分类Dev

Angular 8 - 架构/路由最佳实践(建议)

来自分类Dev

如何使Angular 8应用程序使用整个视口?

来自分类Dev

在Angular 8中动态加载json

来自分类Dev

如何使用Angular 8设置Angular Flex布局断点

来自分类Dev

功能模块作为 Angular 中的库?

来自分类Dev

如何为Angular 8或9启用Ivy?

来自分类Dev

如何在Angular 8中循环iframe

来自分类Dev

如何删除空格-Angular 8数据绑定

来自分类Dev

Angular 8分页:如何翻译“ of”?

来自分类Dev

Angular 8 - 如何解决“ExpressionChangedAfterItHasBeenCheckedError”

来自分类Dev

Angular 8:使用HttpClient.get.toPromise

来自分类Dev

在Angular 8中使用@Input的问题

来自分类Dev

Angular 8延迟加载。有关以下方面的问题:进口,进口组件和提供者

来自分类Dev

Angular 5 - 组件在延迟加载模块中不可用

Related 相关文章

  1. 1

    如何使用延迟加载仅加载angular 8中的模块

  2. 2

    延迟加载不加载模块-Angular 8

  3. 3

    Angular 8法线加载模块

  4. 4

    功能模块中的 Angular 2 路由

  5. 5

    我可以仅将Angular 8功能模块从一个Angular应用程序/工作区复制到另一个吗?

  6. 6

    在Angular 8中使用共享组件进行延迟加载

  7. 7

    功能模块中的 Angular 5 路由问题(强制路由器在路径相同但参数更改时重新加载路由)

  8. 8

    Angular 8:没有MultilevelMenuService的提供程序

  9. 9

    顺利加载消息Angular 8

  10. 10

    无法使用 Angular 8 升级 Angular Material

  11. 11

    Angular 8和使用代理

  12. 12

    如何在另一个模块中使用一个模块并在 angular 8 中路由它?

  13. 13

    导入功能模块时未加载Angular 2主要组件,但在未导出的功能模块中加载组件

  14. 14

    如何使用angular8中的tileLoaded?

  15. 15

    Angular 8中的路由器防护

  16. 16

    Angular 8 - 架构/路由最佳实践(建议)

  17. 17

    如何使Angular 8应用程序使用整个视口?

  18. 18

    在Angular 8中动态加载json

  19. 19

    如何使用Angular 8设置Angular Flex布局断点

  20. 20

    功能模块作为 Angular 中的库?

  21. 21

    如何为Angular 8或9启用Ivy?

  22. 22

    如何在Angular 8中循环iframe

  23. 23

    如何删除空格-Angular 8数据绑定

  24. 24

    Angular 8分页:如何翻译“ of”?

  25. 25

    Angular 8 - 如何解决“ExpressionChangedAfterItHasBeenCheckedError”

  26. 26

    Angular 8:使用HttpClient.get.toPromise

  27. 27

    在Angular 8中使用@Input的问题

  28. 28

    Angular 8延迟加载。有关以下方面的问题:进口,进口组件和提供者

  29. 29

    Angular 5 - 组件在延迟加载模块中不可用

热门标签

归档