我有一个单体Angular 15应用程序,不使用路由器。 它内部的组件数量正在增加,我想将大多数组件分离成一个单独的模块并单独加载它们。
我的应用程序已经有了一个闪屏界面和一个“加载”进度条,随着从服务器获取数据的进行而前进。 我希望主要的AppModule包含一组最小的组件来启动事情,然后我将加载其余的组件作为启动任务之一,并由进度条监视。
目前的状态...
app.module.ts:
import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {BrowserAnimationsModule} from '@angular/platform-browser/animations';
import {BrowserModule} from '@angular/platform-browser';
import {FormsModule} from "@angular/forms";
import {MatProgressBarModule} from '@angular/material/progress-bar';
import {MatSidenavModule} from "@angular/material/sidenav";
import {SharedModule} from "./shared.module";
import {AppComponent} from './app.component';
import {ResizeableSidenavDirective} from "../components/resizeable-sidenav.directive";
import {SplashScreenComponent} from "../components/splash-screen/splash-screen.component";
@NgModule({
declarations: [
AppComponent,
SplashScreenComponent,
ResizeableSidenavDirective,
],
imports: [
BrowserModule,
BrowserAnimationsModule,
FormsModule,
MatProgressBarModule,
MatSidenavModule,
SharedModule
],
providers: [],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class AppModule { }
shared.module.ts:
import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {BrowserAnimationsModule} from "@angular/platform-browser/animations";
import {CommonModule} from "@angular/common";
import {LeafletModule} from "@asymmetrik/ngx-leaflet";
import {AppComponent} from './app.component';
import {MapViewComponent} from "../components/map-view/map-view.component";
import {Toaster} from "../components/toaster";
@NgModule({
declarations: [
MapViewComponent,
Toaster,
],
imports: [
BrowserAnimationsModule,
CommonModule,
LeafletModule,
],
exports: [
MapViewComponent,
Toaster,
],
providers: [],
bootstrap: [AppComponent],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class SharedModule { }
lazy.modules.ts:
import {NgModule, CUSTOM_ELEMENTS_SCHEMA} from '@angular/core';
import {CommonModule} from "@angular/common";
import {FormsModule} from "@angular/forms";
import {MatDialogModule} from "@angular/material/dialog";
import {MatSliderModule} from "@angular/material/slider";
import {SharedModule} from "./shared.module";
... big list of component imports ...
@NgModule({
declarations: [
MyFirstComponent,
MySecondComponent,
MyThirdComponent,
...
],
imports: [
CommonModule,
FormsModule,
MatDialogModule,
MatSliderModule,
SharedModule
],
exports: [
MyFirstComponent,
MySecondComponent,
MyThirdComponent,
...
],
providers: [],
bootstrap: [],
schemas: [CUSTOM_ELEMENTS_SCHEMA]
})
export class LazyModule { }
虽然我想问的问题是如何从启动屏幕内部做延迟加载,但我甚至无法构建以上代码。在LazyModule
组件中有许多构建错误,例如:
'mat-slider'不是已知元素
(尽管MatSliderModule是LazyModule的一个包含导入)
找不到名称为'number'的管道。
(尽管CommonModule也是一个包含的导入)
无法绑定到'ngModel',因为它不是'input'的已知属性。
(尽管FormsModule也是一个包含的导入)
'my-second'不是一个已知元素:
(延迟组件MyFirstComponent的HTML引用MySecondComponent)
如果我在“AppModule”的引入中添加“LazyModule”,那么所有以上问题都会消失。奇怪的是,即使没有将“LazyModule”添加到“imports”列表中,只有导入“./lazy.module”,它也会构建成功。但是这会使我回到试图分解的单个、庞大的“main.js”文件。所以有两个问题:如何将“LazyModule”从“AppModule”中分离并使其构建成功? 在我的初始化中要进行什么调用来加载“LazyModule”,以及如何得到通知表示加载已完成?更新1:我成功修复了第一个错误(mat-slider
未知),方法是将MatSliderModule
的导入从lazy.module
移动到shared.module
。这对我来说毫无意义,因为mat-slider
只被一个懒加载组件使用。但这种技巧并没有解决“找不到number pipe”(CommonModule
)或“无法绑定ngModel”(FormsModule
)的问题。
NgModuleFactoryLoader
),尽管该文章是2019年的,但对于Angular 13来说已经过时了,因为显示的angular.json
更改完全破坏了构建。可能足以回答第二个问题;现在我只需要找出第一个问题的答案。 - Brian White