我应该如何将应用程序拆分为 angular 个模块?
How should I split app into angular modules?
场景:
我正在重写 4 个较旧的独立 SPA 应用程序,它们代表使用 Angular 5 的典型业务流程中的 4 个步骤。通常,每个应用程序都旨在由不同的参与者(具有特定角色的用户)使用,但用户可以拥有多个角色。
虽然从用户的角度来看,这些应用程序似乎是独立的,但它们共享许多共同的逻辑,例如后端服务、授权、枚举、常量甚至一些共享 UI 组件。
在新的 Angular 版本中,我打算为所有应用程序提供通用框架,包括初始化、身份验证和带有 4 个子应用程序链接的欢迎页面。
技术细节是,访问其中一个应用程序的用户不需要为其他应用程序下载代码。但是,在某些应用程序中也需要某种延迟加载。
我决定创建一个 git 存储库和一个 angular 项目。
问题: 我应该将应用拆分为 Angular 个模块吗?如何?为什么以及后果是什么?
我最初的想法是创建带有欢迎页面的默认 AppModule。然后是每个应用程序的 4 个模块,然后是共享逻辑的 CommonModule。但是,由于我是 angular 的新手,所以更多的是基于我的感受而不是专业知识:)
我的建议是每条路线有一个模块(例如 /step-1 => Module1,/step-2 => Module2,...)和公共模块。这样做你可以延迟加载它们并避免页面加载缓慢等问题 (Angular lazy loading docs)。你关于拥有一个公共模块的想法是正确的,这样你就可以将它注入到需要它的不同模块上。
更新: 路由结构
app.routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
const routes = [
{
path: 'admin',
loadChildren: 'app/admin/admin.module#AdminModule'
},
{
path: 'players',
loadChildren: 'app/players/players.module#PlayersModule'
},
{
path: 'teams',
loadChildren: 'app/teams/teams.module#TeamsModule'
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
players.routing.module
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { PlayersComponent } from './players.component';
import { PlayersResolver } from './players.resolver';
const routes = [
{ path: '',
component: PlayersComponent,
resolve: {
standings: PlayersResolver
}
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: [PlayersResolver]
})
export class PlayersRoutingModule { }
players.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PlayersComponent } from './players.component';
import { PlayersRoutingModule } from './players.routing.module';
import { PlayersService } from './players.service';
@NgModule({
imports: [
CommonModule,
PlayersRoutingModule
],
declarations: [PlayersComponent],
providers: [PlayersService]
})
export class PlayersModule { }
场景: 我正在重写 4 个较旧的独立 SPA 应用程序,它们代表使用 Angular 5 的典型业务流程中的 4 个步骤。通常,每个应用程序都旨在由不同的参与者(具有特定角色的用户)使用,但用户可以拥有多个角色。
虽然从用户的角度来看,这些应用程序似乎是独立的,但它们共享许多共同的逻辑,例如后端服务、授权、枚举、常量甚至一些共享 UI 组件。
在新的 Angular 版本中,我打算为所有应用程序提供通用框架,包括初始化、身份验证和带有 4 个子应用程序链接的欢迎页面。
技术细节是,访问其中一个应用程序的用户不需要为其他应用程序下载代码。但是,在某些应用程序中也需要某种延迟加载。
我决定创建一个 git 存储库和一个 angular 项目。
问题: 我应该将应用拆分为 Angular 个模块吗?如何?为什么以及后果是什么?
我最初的想法是创建带有欢迎页面的默认 AppModule。然后是每个应用程序的 4 个模块,然后是共享逻辑的 CommonModule。但是,由于我是 angular 的新手,所以更多的是基于我的感受而不是专业知识:)
我的建议是每条路线有一个模块(例如 /step-1 => Module1,/step-2 => Module2,...)和公共模块。这样做你可以延迟加载它们并避免页面加载缓慢等问题 (Angular lazy loading docs)。你关于拥有一个公共模块的想法是正确的,这样你就可以将它注入到需要它的不同模块上。
更新: 路由结构
app.routing.module.ts
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
const routes = [
{
path: 'admin',
loadChildren: 'app/admin/admin.module#AdminModule'
},
{
path: 'players',
loadChildren: 'app/players/players.module#PlayersModule'
},
{
path: 'teams',
loadChildren: 'app/teams/teams.module#TeamsModule'
}
];
@NgModule({
imports: [RouterModule.forRoot(routes)],
exports: [RouterModule]
})
export class AppRoutingModule { }
players.routing.module
import { NgModule } from '@angular/core';
import { RouterModule } from '@angular/router';
import { PlayersComponent } from './players.component';
import { PlayersResolver } from './players.resolver';
const routes = [
{ path: '',
component: PlayersComponent,
resolve: {
standings: PlayersResolver
}
}
];
@NgModule({
imports: [RouterModule.forChild(routes)],
exports: [RouterModule],
providers: [PlayersResolver]
})
export class PlayersRoutingModule { }
players.module.ts
import { NgModule } from '@angular/core';
import { CommonModule } from '@angular/common';
import { PlayersComponent } from './players.component';
import { PlayersRoutingModule } from './players.routing.module';
import { PlayersService } from './players.service';
@NgModule({
imports: [
CommonModule,
PlayersRoutingModule
],
declarations: [PlayersComponent],
providers: [PlayersService]
})
export class PlayersModule { }