OpenHarmony- 大型应用架构案例分析:模块化与组件化路由解耦方案 ...

打印 上一主题 下一主题

主题 1983|帖子 1983|积分 5949

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
问题配景与分析

在大型应用开发中,多团队并行开发不同业务模块时,模块间的路由跳转会导致严重的耦合问题。以案例中的A.har、B.har和C.har三个模块为例:

  • 循环依赖问题:模块间的相互跳转形成环形调用链路
  • 开发态耦合:需要显式import其他模块的组件
  • 编译依赖:模块无法独立编译,影响开发效率
现有方案的问题

当前基于Navigation的基本实现方案存在以下缺陷:

  • 强耦合的import方式:必须显式导入全部目标页面组件
  • 会合式路由配置:全部路由会合在使用方模块配置
  • 编译依赖:模块间存在直接依赖关系,无法独立编译
解耦方案设计

架构设计

接纳"RouterModule + EntryHap + 业务模块"的三层架构:

  • RouterModule

    • 独立的路由管理HAR包
    • 提供路由注册、跳转和动态加载能力
    • 维护全局路由表和路由栈

  • EntryHap

    • 应用主入口模块
    • 唯不停接依赖全部业务模块
    • 初始化Navigation并关联路由栈

  • 业务模块(A.har/B.har)

    • 仅依赖RouterModule
    • 初始化时注册自身路由
    • 不直接依赖其他业务模块

依赖关系

  1. EntryHap → A.har
  2.          → B.har
  3.          → RouterModule.har
  4. A.har → RouterModule.har
  5. B.har → RouterModule.har
复制代码
关键技能实现

1. 路由管理模块(RouterModule)

  1. export class RouterModule {
  2.   // 路由表:存储所有注册的路由组件
  3.   static builderMap: Map<string, WrappedBuilder<[object]>> = new Map();
  4.   
  5.   // 路由栈表:支持多Navigation场景
  6.   static routerMap: Map<string, NavPathStack> = new Map();
  7.   // 路由注册
  8.   public static registerBuilder(builderName: string, builder: WrappedBuilder<[object]>): void {
  9.     this.builderMap.set(builderName, builder);
  10.   }
  11.   // 路由跳转
  12.   public static async push(router: RouterModel): Promise<void> {
  13.     const harName = router.builderName.split('_')[0];
  14.     await import(harName).then((ns: ESObject) => ns.harInit(router.builderName));
  15.     this.getRouter(router.routerName).pushPath({
  16.       name: router.builderName,
  17.       param: router.param
  18.     });
  19.   }
  20. }
复制代码
2. 主入口模块(EntryHap)

  1. @Entry
  2. @Component
  3. struct EntryHap {
  4.   @State entryHapRouter: NavPathStack = new NavPathStack();
  5.   aboutToAppear() {
  6.     RouterModule.createRouter(RouterNameConstants.ENTRY_HAP, this.entryHapRouter);
  7.   };
  8.   @Builder
  9.   routerMap(builderName: string, param: object) {
  10.     RouterModule.getBuilder(builderName).builder(param);
  11.   };
  12.   build() {
  13.     Navigation(this.entryHapRouter) {
  14.       // 首页内容...
  15.     }
  16.     .navDestination(this.routerMap);
  17.   }
  18. }
复制代码
3. 业务模块实现(B.har示例)

路由注册
  1. // B1页面
  2. @Builder
  3. export function harBuilder(value: object) {
  4.   NavDestination() {
  5.     // 页面内容...
  6.   }
  7. }
  8. // 模块初始化时注册路由
  9. const builderName = "B_B1";
  10. if (!RouterModule.getBuilder(builderName)) {
  11.   let builder: WrappedBuilder<[object]> = wrapBuilder(harBuilder);
  12.   RouterModule.registerBuilder(builderName, builder);
  13. }
复制代码
动态加载优化
  1. // harB的index.ets
  2. export function harInit(builderName: string): void {
  3.   switch (builderName) {
  4.     case "B_B1": import("./B1"); break;
  5.     case "B_B2": import("./B2"); break;
  6.     case "B_B3": import("./B3"); break;
  7.   }
  8. }
复制代码
方案优势


  • 完全解耦

    • 业务模块间无直接依赖
    • 通过RouterModule进行间接通讯

  • 动态加载

    • 按需加载目标模块
    • 淘汰启动初始化负担

  • 多路由栈支持

    • 可管理多个Navigation的路由栈
    • 适应复杂业务场景

  • 独立编译

    • 各模块可独立开发编译
    • 提高团队协作效率

实施发起


  • 命名规范

    • 制定统一的路由命名规则(如"模块名_页面名")
    • 使用常量管理路由名称

  • 类型安全

    • 为RouterModel等焦点类提供类型定义
    • 添加必要的类型检查

  • 错误处理

    • 加强路由跳转的错误处理
    • 提供降级方案(如跳转失败表现默认页)

  • 性能监控

    • 跟踪动态加载耗时
    • 优化高频使用页面的预加载计谋

此方案通过中间层路由管理和动态加载机制,有效解决了大型应用中多模块开发的耦合问题,为复杂业务场景下的模块化开发提供了可扩展的架构基础。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表