Angular 开发人员,
需要帮助来完成 Angular 应用程序的重组。
让我从我们当前的设置开始:
We have angular 8.1.1
"dependencies": {
"@angular/animations": "^8.1.1",
"@angular/cdk": "^8.0.2",
"@angular/common": "^8.1.1",
"@angular/compiler": "^8.1.1",
"@angular/core": "^8.1.1",
"@angular/flex-layout": "^8.0.0-beta.26",
"@angular/forms": "^8.1.1",
"@angular/material": "^8.0.2",
"@angular/platform-browser": "^8.1.1",
"@angular/platform-browser-dynamic": "^8.1.1",
"@angular/platform-server": "^4.4.6",
"@angular/router": "^8.1.1"
...
}
And Webpack "webpack": "^4.29.6"
And no angular.json file as we are still building using external webpack way as it started as angular2 (3-4 years old project).
由于遗留原因,我们仍在使用 JIT。目前我们有 1 个启用了延迟加载的应用程序。有许多子应用程序,但目前,一切都在一个项目中。
我们的基础设施正在实现一个可插拔/可扩展的架构。因此,我们需要将 UI 也分离到单独的应用程序/lib/bundle 中(无论哪个有效),因此我们只能将所需的子应用程序打包到包中。但是需要直接附加和删除子应用程序,而无需重新构建或刷新 angular app。所以基本上当构建 Angular 应用程序时,一些“NewAppModule”不是它的一部分,但我们想在运行时添加它。重申一下,这个 NewAppModule 将是一个大型应用程序,其中包含多个路由和众多组件(约 100 个)。
我们尝试将 NewAppModule 打包成一个单独的块并加载并将其放入 route.config:
Feature Module:
const routes: Routes = [
{ path: 'other1', component: FeatureComponent1 },
{ path: 'other2', component: FeatureComponent2 },
{ path: 'other3', component: FeatureComponent3 },
...
];
@NgModule({
imports: [RouterModule.forChild(routes),...],
exports: [RouterModule],
})
export class FeatureModule { }
Webpack:
module.exports = {
entry: {
'polyfills': './src/polyfills.ts',
'vendor': './src/vendor.ts',
'app': './src/main.ts',
'feature': './src/feature/feature.module'
},
...
主要应用
Login Routes:
export const loginRoutes: Route[] = [
{
path: 'logincontroller',
component: LoginComponent
},
{ path: '**', redirectTo: '/' }
];
App Module:
@NgModule({
imports: [
HttpClientModule,
BrowserAnimationsModule,
LoginModule,
CoreModule.forRoot(),
RouterModule.forRoot(loginRoutes, { useHash: true, preloadingStrategy: CustomPreloader })
],
declarations: [
AppComponent
],
bootstrap: [AppComponent],
exports: [RouterModule]
})
export class AppModule {
public static config: ConfigService;
}
export const homeRoutes: Route[] = [
{
path: 'home',
component: HomeComponent,
canActivate: [AuthGuard]
},
{
path: 'feature',
loadChildren: () => fetch('feature.js')
.then(response => response.text())
.then(source => {
const obj = eval(source);
return obj.FeatureModule;
}),
,canActivate: [AuthGuard]
}
];
];
最后我们可以看到模块,添加到 this.router.config但路由不正确,路由指向 loginRoutes。此外,即使这项工作我们需要帮助来超越目前的范围,我假设我知道模块名称。我们需要的是运行时模块补丁,甚至不知道模块的名称。
{
path: 'feature',
loadChildren: () => fetch('feature.js')
.then(response => response.text())
.then(source => {
const obj = eval(source);
return obj; // This is directly the module that we need as we do not know the name
}),
,canActivate: [AuthGuard]
}
我们还尝试更新 router.config 和 router.resetConfig:
let newRoute = {
path: 'feature',
loadChildren: () => fetch('feature.js')
.then(response => response.text())
.then(source => {
const obj = eval(source);
return obj.FeatureModule;
}),
,canActivate: [AuthGuard]
};
this._router.resetConfig([...this._router.config, route]);
This fails completely, no module loading, nothing.
我们看到的所有 IVY 教程都是动态导入组件,而不是在运行时导入和附加完整的模块(带路由)。
这样的事情在角度上是否可行,如果可以,可以做什么以及我们哪里出错了(我们是否错误地构建了 feature.js)?
任何帮助是极大的赞赏。非常感谢。