两个月前,已存在录题系统,须要构建出题系统,且两套系统存在公用的实体、组件以及服务,如何在构建新系统的同时复用原系统的代码成为了项目难点。css
当时的解决方案是将两个系统放在一个应用里,并为该应用配置两套构建方案,当进行ng serve
或ng build
时,加载相应配置,动态构建出两套系统,从而解决了共享代码的问题。html
如今再去看Angular
,理解又不一样了。typescript
新的思想与理解都源于后端的思考,在构建后端项目时,为了实现代码复用,会构建多模块。npm
就像下图所示同样,通用的代码放在Core
与Common
模块中,各业务模块依赖这两个模块,经过模块间依赖实现代码复用。bootstrap
那么问题就来了,在Angular
里,咱们可不能够像后台同样去构建多模块项目,以达到复用的目的呢?后端
以前一直使用Angular Multi Module
做为关键字进行搜索,结果查询出来的都是多模块惰性加载的文章,参考意义不大。bash
直到最近才发现以前搜索的关键字错误,应该是Angular Multi Library And Application
。app
具体学习请参考如下两篇文章:ide
ANGULAR WORKSPACES: MULTI-APPLICATION PROJECTS学习
建立一个Angular
项目,其名为angular-project
,不建立Application
,不进行交互,跳过依赖的安装。
ng new angular-project --createApplication=false --interactive=false --skipInstall=true
生成库common
,生成应用sso
,跳过依赖的安装。
ng g library common --skipInstall=true ng g application sso --style=scss --routing=true --skipInstall=true
安装依赖:
npm install --registry=https://registry.npm.taobao.org
最终的项目结构长这样,全部模块位于projects
目录下。
Angular Library
的结构以下,就像日常用的同样,也有Module
,Module
中包含组件、服务等等。
同时咱们开始反思以前用过的ShareModule
,其实咱们应该将其作成一个Angular Library
,并将其发布到npm
仓库,这样在多个项目之间快速移植公共模块也更高效快捷。
可是在开发过程当中,共享模块可能有所改动,频繁发布就有些麻烦,如何直接引用本地的模块呢?
构建common
库:
ng build common
若是该库频繁改动的话,能够添加监听参数,文件修改后自动构建:
ng build common --watch
命令执行后会在dist
目录生成构建成功的common
库。
使用起来就像咱们使用的其余Angular
库同样,直接import
,WebStorm
会自动提示。
import { CommonModule } from 'common';
在业务模块中引入CommonModule
。
import { BrowserModule } from '@angular/platform-browser'; import { NgModule } from '@angular/core'; import { AppRoutingModule } from './app-routing.module'; import { AppComponent } from './app.component'; import { CommonModule } from 'common'; @NgModule({ declarations: [ AppComponent ], imports: [ BrowserModule, AppRoutingModule, CommonModule ], providers: [], bootstrap: [AppComponent] }) export class AppModule { }
在AppComponent
组件中使用CommonModule
中的CommonComponent
。
<h1>App Component HTML</h1> <lib-common></lib-common>
注:库组件生成的默认前缀是lib
。
进入业务组件进行ng serve
,成功。
志士惜日短,愁人知夜长。 ——魏晋·傅玄《杂诗》