我try 使用SystemJsNgModuleLoader在没有路由的情况下加载模块,但无法正常工作:

this.loader.load(url).then(console.info);

无论我用什么字符串作为URL,我都能得到Cannot find module xxx(aboslute/相对URL/路径…try 了许多选项).我查看了路由的源代码,除了这个SystemJsNgModuleLoader之外,找不到其他任何东西.我甚至不确定我应该用这个...


就在昨天的ng-europe 2016人大会上,米什科公司提出了这个问题;马蒂亚斯回答说:

Miško Hevery:个 只需转到get hold of the module,您就可以获得组件工厂的控制权,并且可以在应用程序中的任何位置动态加载组件工厂.这正是路由在内部执行的操作.所以你这样做也是很直截了当的.

Matias Niemelä

...但在这个问题上,如果没有例子和糟糕的文件,也不是那么艰难;

有人知道如何在不使用Route.loadChildren的情况下手动加载模块吗?如何将get hold of the modulethe stuff放入entryComponents(我读了FAQ,但在没有实际加载模块的情况下无法try )?

推荐答案

任何人都知道如何手动加载模块,而无需使用

您可以使用SystemJsNgModuleLoader获得模块的工厂:

this.loader.load('./src/lazy.module#TestModule').then((factory: NgModuleFactory<any>) => {
  console.log(factory);
});

如需更多信息,请参阅

下面是它的样子:

lazy.module.ts

@Component({
  selector: 'test',
  template: `I'm lazy module`,
})
export class Test {}

@NgModule({
  imports: [CommonModule],
  declarations: [Test],
  entryComponents: [Test]
})
export class LazyModule {
  static entry = Test;
}

app.ts

import {
  Component, NgModule, ViewContainerRef,
  SystemJsNgModuleLoader, NgModuleFactory,
  Injector} from '@angular/core'
import {BrowserModule} from '@angular/platform-browser'

@Component({
  selector: 'my-app',
  template: `<h2>Test lazy loading module</h2>`,
})
export class AppComponent {
  constructor(
    private loader: SystemJsNgModuleLoader, 
    private inj: Injector, 
    private vcRef: ViewContainerRef) {}

  ngOnInit() {
     this.loader.load('./src/lazy.module#LazyModule')
       .then((moduleFactory: NgModuleFactory<any>) => {
         const moduleRef = moduleFactory.create(this.inj);
         const entryComponent = (<any>moduleFactory.moduleType).entry;
         const compFactory = 
               moduleRef.componentFactoryResolver.resolveComponentFactory(entryComponent);
         this.vcRef.createComponent(compFactory);
      });
  }
} 

@NgModule({
  imports: [ BrowserModule ],
  declarations: [ AppComponent ],
  providers: [SystemJsNgModuleLoader],
  bootstrap: [ AppComponent ]
})
export class AppModule {} 
this.loader.load('./src/test.module#TestModule').then((factory: NgModuleFactory<any>) => {
  console.log(factory);
});

100

AOTprecompile模块有两个选项:

1) Angular CLI lazyModules选项(自Angular 6起)

使用angular/cli内置功能:

{
  "projects": {
    "app": {
      "architect": {
        "build": {
          "options": {
            "lazyModules": [  <====== add here all your lazy modules
              "src/path-to.module"
            ]
          }
        }
      }
    }
  }
} 

看见

2) 使用RouterModule中的ProviderRoute

app.module.ts

providers: [
  SystemJsNgModuleLoader,
  provideRoutes([
     { loadChildren: 'app/lazy/lazy.module#LazyModule' }
  ])
],

app.component.ts

export class AppComponent implements  OnInit {
    title = 'Angular cli Example SystemJsNgModuleLoader.load';

    @ViewChild('container', { read: ViewContainerRef }) container: ViewContainerRef;

    constructor(private loader: SystemJsNgModuleLoader, private inj: Injector) {}

    ngOnInit() {
        this.loader.load('app/lazy/lazy.module#LazyModule').then((moduleFactory: NgModuleFactory<any>) => {
            const entryComponent = (<any>moduleFactory.moduleType).entry;
            const moduleRef = moduleFactory.create(this.inj);

            const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(entryComponent);
            this.container.createComponent(compFactory);
        });
    }
}

100


Lazy loading with webpack and AOT

使用ngc编译

使用以下工厂的初始化编译器

export function createJitCompiler () {
    return new JitCompilerFactory([{useDebug: false, useJit: true}]).createCompiler();
}

100

Angular相关问答推荐

如何从Angular TS文件传递$Events对象?

文件阅读器未正确给出某些CSV文件的结果

to Signal on Observables inside Signal

使Angular 效果只执行一次

自动完成搜索过滤器不适用于Angular 中动态添加的输入字段

间歇性不正确的SSR重定向(server. ts级别的请求和响应不匹配)

如何动态呈现组件并以Angular 访问它们的方法?

按Angular 从组件的 bootstrap 选项卡中删除活动类

如何在Angular功能路由保护中取消订阅RxJs主题

如何在 Angular 中每 x 秒从 REST api 加载数据并更新 UI 而不会闪烁?

Angular 为什么延迟加载返回空路径?

角 12 固态继电器 |页眉页脚在加载程序到来之前显示

如何使用 Angular 12 material 验证密码和确认密码?

在 angular2 中,如何获取在为 @Input 发送的对象上更改的属性的 onChanges

使用 rxjs 处理刷新令牌

Observable.forkJoin 和数组参数

Angular 2 组件不是任何 NgModule 的一部分

Lint 错误:实现生命周期挂钩接口

Angular 4 material表突出显示一行

如何在 Angular CLI 的构建时插入内部版本号或时间戳