我应该如何将应用程序拆分为角度模块?

时间:2018-02-16 12:23:07

标签: angular angular-routing angular-module

情景: 我重写了4个较旧的独立SPA应用程序,它代表了使用Angular 5的典型业务流程中的4个步骤。通常,每个应用程序都应由不同的actor(具有特定角色的用户)使用,但用户可以拥有多个角色

虽然从用户的角度看这些应用程序是独立的,但它们共享许多常见的逻辑,例如:后端服务,授权,枚举,常量甚至一些共享的UI组件。

在新的Angular版本中,我打算为所有应用程序提供通用框架,初始化,身份验证和欢迎页面以及指向4个子应用程序的链接。

技术细节是,访问其中一个应用的用户不需要为其他应用下载代码。但是,在某些应用程序中也需要某种延迟加载。

我决定制作单个git存储库和一个角度项目。

问题:我应该将应用分成Angular模块吗?怎么样?为什么以及后果是什么?

我最初的想法是使用欢迎页面创建默认的AppModule。然后为每个应用程序提供4个模块,然后为共享逻辑提供CommonModule。但是,由于我是棱角分明的新人,所以它更多地基于我的感受而不是专业知识:)

1 个答案:

答案 0 :(得分:2)

我的建议是每个路由有一个模块(例如/ 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 { }