angular 手动编译_angular-如何手动延迟加载模块?

本文介绍了如何在Angular应用中不使用Route.loadChildren手动加载模块,特别是Angular 8版本。通过SystemJsNgModuleLoader,可以在需要时动态加载模块,并创建组件实例。文章还提到了AOT预编译模块的两种方法,包括Angular CLI的lazyModules选项和使用RouterModule的ProvideRoutes。
摘要由CSDN通过智能技术生成

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

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

this.loader.load('./src/lazy.module#TestModule').then((factory: NgModuleFactory) => {

console.log(factory);

});

对于Angular 8,请参见 角度8中的延迟加载模块

它看起来像这样:

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;

}

应用程序

import {

Component, NgModule, ViewContainerRef,

SystemJsNgModuleLoader, NgModuleFactory,

Injector} from '@angular/core'

import {BrowserModule} from '@angular/platform-browser'

@Component({

selector: 'my-app',

template: `

Test lazy loading module

`,

})

export class AppComponent {

constructor(

private loader: SystemJsNgModuleLoader,

private inj: Injector,

private vcRef: ViewContainerRef) {}

ngOnInit() {

this.loader.load('./src/lazy.module#LazyModule')

.then((moduleFactory: NgModuleFactory) => {

const moduleRef = moduleFactory.create(this.inj);

const entryComponent = (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) => {

console.log(factory);

});

柱塞示例

有两种方法可以为AOT预编译模块:

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

使用angular / cli内置功能:

{

"projects": {

"app": {

"architect": {

"build": {

"options": {

"lazyModules": [ <====== add here all your lazy modules

"src/path-to.module"

]

}

}

}

}

}

}

看到

@RomainLT答案

速度需求:Angular文章中的延迟加载非路由模块,了解更多详细信息

2)从RouterModule使用ProvideRoutes

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) => {

const entryComponent = (moduleFactory.moduleType).entry;

const moduleRef = moduleFactory.create(this.inj);

const compFactory = moduleRef.componentFactoryResolver.resolveComponentFactory(entryComponent);

this.container.createComponent(compFactory);

});

}

}

Github回购angular-cli-lazy

使用webpack和AOT延迟加载

使用ngc进行编译

通过使用以下工厂进行初始化编译器

export function createJitCompiler () {

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

}

Github回购

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值