一、优化 Angular 环境搭建
- 项目初始化
- 使用
@angular - cli
初始化项目,利用 ng new
命令快速生成基础项目结构。为了更好的一致性,建议在团队内使用统一的 @angular - cli
版本。
- 在
.angular - cli.json
(Angular v6+为 angular.json
)文件中,对项目的基本配置如样式、脚本、环境变量等进行标准化设置。例如,统一设置样式文件的格式为 scss
,并配置好相应的加载器。
- 模块拆分
- 按照业务功能将每个微前端拆分成独立的 Angular 模块。每个模块应具有清晰的边界,只负责特定的业务功能,减少模块之间的耦合。
- 在模块设计时,遵循 Angular 的模块设计原则,如将共享的组件、指令、管道等提取到共享模块中,以便在不同微前端中复用。
二、高效通信
- 事件总线
- 技术选型:使用 RxJS 的
Subject
或 BehaviorSubject
来构建事件总线。
- 实现方式:在一个共享模块中创建一个
EventBusService
,该服务持有一个 Subject
实例。各个微前端通过注入该服务,调用 next
方法来发布事件,通过 subscribe
方法来监听事件。例如:
import { Injectable } from '@angular/core';
import { Subject } from 'rxjs';
@Injectable({
providedIn: 'root'
})
export class EventBusService {
private eventSubject = new Subject<any>();
public event$ = this.eventSubject.asObservable();
publish(event: any) {
this.eventSubject.next(event);
}
}
- Shared State Management
- 技术选型:可以选用 NgRx 或 Akita 等状态管理库。
- 实现方式:以 NgRx 为例,在共享模块中创建公共的
reducer
、action
和 selector
。每个微前端通过 Store
服务来获取和更新共享状态。例如,定义一个简单的计数器共享状态:
// counter.actions.ts
import { createAction, props } from '@ngrx/store';
export const increment = createAction('[Counter] Increment');
export const decrement = createAction('[Counter] Decrement');
// counter.reducer.ts
import { createReducer, on } from '@ngrx/store';
import { increment, decrement } from './counter.actions';
export const initialState = 0;
export const counterReducer = createReducer(
initialState,
on(increment, state => state + 1),
on(decrement, state => state - 1)
);
// counter.selectors.ts
import { createSelector } from '@ngrx/store';
export const selectCounter = createSelector(
(state: any) => state.counter,
(counter) => counter
);
三、资源共享与隔离
- 共享资源
- 组件、指令、管道共享:将通用的组件、指令、管道等封装到一个共享库中。可以使用
ng generate library
命令生成 Angular 库项目。例如,创建一个包含通用按钮组件的库,在其他微前端项目中通过 npm 安装该库并导入使用。
- 样式共享:使用 Sass 的
@import
规则,将公共样式文件如变量、混合宏等导入到各个微前端项目的主样式文件中。同时,为了避免样式冲突,建议使用 BEM 或 ITCSS 等命名规范。
- 资源隔离
- 模块作用域:利用 Angular 的模块系统,每个微前端作为独立模块,其内部的组件、服务等具有自己的作用域,不会与其他微前端的同名资源冲突。
- Webpack 配置:通过 Webpack 的
externals
配置,将一些外部依赖(如第三方库)声明为外部资源,避免重复打包。例如,对于 lodash
库,可以在 Webpack 配置中添加:
externals: {
'lodash': '_'
}
四、开发、测试与部署流程自动化与协同性
- 开发流程自动化
- 代码规范:使用 ESLint 和 Prettier 来统一代码风格。在项目根目录下配置
.eslintrc.json
和 .prettierrc.json
文件,设置团队统一的代码规范。同时,在 package.json
中添加脚本,如 lint
: "eslint src" 和 format
: "prettier --write src",方便开发者在开发过程中随时检查和格式化代码。
- 自动化构建:利用
@angular - cli
的构建命令,如 ng build
。可以通过在 package.json
中配置脚本,如 "build:micro - front - end1": "ng build micro - front - end1"
,方便快速构建各个微前端项目。
- 测试流程自动化
- 单元测试:Angular 自带 Karma 和 Jasmine 进行单元测试。通过
ng test
命令可以自动运行单元测试用例。可以在 package.json
中配置脚本 "test:micro - front - end1": "ng test micro - front - end1"
,方便对单个微前端进行测试。
- 集成测试:使用 Cypress 或 Protractor 进行集成测试。以 Cypress 为例,在项目中安装 Cypress 后,配置
cypress.json
文件,编写集成测试用例。可以在 package.json
中添加脚本 "cy:run": "cypress run"
来运行集成测试。
- 部署流程自动化
- CI/CD 工具:选用 Jenkins、GitLab CI/CD 或 GitHub Actions 等工具实现自动化部署。以 GitHub Actions 为例,在项目根目录下创建
.github/workflows
目录,编写 YAML 配置文件,如 deploy.yml
。
- 部署步骤:在部署脚本中,首先拉取代码,然后安装依赖,执行构建命令,最后将构建产物部署到相应的服务器或云平台。例如,对于部署到 AWS S3 存储桶,可以使用 AWS CLI 工具结合 GitHub Actions 实现自动化部署。
- 协同性
- 版本控制:使用 Git 进行版本控制,建议采用 GitFlow 或 GitHub Flow 等工作流程。团队成员通过分支进行开发,定期将代码合并到主分支或开发分支。
- 项目管理工具:使用 Jira、Trello 或 Asana 等项目管理工具来分配任务、跟踪进度、管理需求等,提高团队协同效率。