如何在Angular模块联邦中实现服务单例?多实例问题排查
问题原因与修复方案
出现多实例的核心原因是模块联邦共享配置与Angular服务注入机制的配合问题,结合你的代码,需要调整以下几点:
1. 统一共享模块的导入路径
你的shell和profile中导入共享服务的路径不一致:
- shell中用
import { MdmfSharedService } from 'projects/mdmf-shared/src/public-api'; - profile中用
import { MdmfSharedService } from 'projects/mdmf-shared/src/lib/services/mdmf-shared.service';
模块联邦的共享匹配是基于模块解析路径的,不同路径会被识别为不同模块,导致分别打包实例。修复:
所有微应用统一从public-api导入共享服务:
// profile.component.ts 中修改导入 import { MdmfSharedService } from 'projects/mdmf-shared/src/public-api';
2. 调整共享服务的提供方式
将服务的providedIn改为'root',确保Angular根注入器提供单例,同时避免模块重复注册服务:
// mdmf-shared.service.ts @Injectable({ providedIn: 'root', // 改为root,确保单例注入 }) export class MdmfSharedService { // ... 原有代码 }
3. 优化模块联邦的共享配置
确保mdmf-shared的共享配置在shell和profile中完全一致,添加requiredVersion: false避免本地开发时的版本校验冲突:
// shell和profile的webpack.config.js中修改shared配置 shared: { '@angular/core': { eager: true, singleton: true }, '@angular/common': { eager: true, singleton: true }, '@angular/router': { eager: true, singleton: true }, '@ngxs/store': { singleton: true, eager: true }, 'mdmf-shared': { singleton: true, eager: true, requiredVersion: false // 本地共享库无需版本校验 }, },
4. 清理缓存并重新构建
清理所有微应用的dist目录、node_modules缓存,然后重新构建启动,确保新配置生效。
内容的提问来源于stack exchange,提问作者Encryptabit
相关产品推荐
相关产品推荐

