HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行

HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行

cke_217.png

目前最新的Api版本,已经来到了21版本,在实际的项目开发中,如果选择了组件化开发,如何让单个组件实现运行呢?


更多关于HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行的实战教程也可以访问 https://www.itying.com/category-93-b0.html

5 回复

很宝贵的经验,学习了!

更多关于HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


感谢支持,

关于组件化和模块化,有过太多的文章进行概述,这里就不过多赘述了。

实现单个组件运行,我们还是从基本的运行包和共享包差异性来分析,然后在着手利用脚本或插件帮我们快速实现组件化运行包切换,本篇文章,重点概述手动实现普通模块(共享包)运行。

运行包和共享包

什么是运行包?什么是共享包?拿我们这个某一个项目来说,entry模块就是运行包,我们直接可以运行到设备上并正确展示,其他模块就是共享包,无法单独运行到设备上正确展示;一句话解读:能独立运行至设备上的模块,并且能够正确展示,就是运行包。

这里有一点需要清晰,那就是,运行包一个项目中只能存在一个,即便后续,我们把其他的模块修改为了可运行,也要把原有的运行包修改为不可运行。

cke_11496.png

如何把一个共享包修改为运行包,前提需要对比两者的差异,根据不同之处,才能方便后续修改。

两者差异性

我们主要对比主模块entry和一个普通的共享包即可,新的API中,和之前的差异性不是很大,不同之处基本上一样,目前有以下几处不同,这里我们只分析动态共享包,静态共享包其实也是类似的。

1、hvigorfile.ts不同

主模块(entry,可运行)

import { hapTasks } from '@ohos/hvigor-ohos-plugin';

export default {
    system: hapTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
    plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

普通模块(共享包,不可运行)

import { hspTasks } from '@ohos/hvigor-ohos-plugin';

export default {
    system: hspTasks,  /* Built-in plugin of Hvigor. It cannot be modified. */
    plugins:[]         /* Custom plugin to extend the functionality of Hvigor. */
}

以上的不同为:主模块中用的是hapTasks,普通模块中用的是hspTasks。

2、module.json5不同

主模块(entry,可运行)

{
  "module": {
    "name": "entry",
    "type": "entry",
    "description": "$string:module_desc",
    "mainElement": "EntryAbility",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "deliveryWithInstall": true,
    "installationFree": false,
    "pages": "$profile:main_pages",
    "abilities": [
      {
        "name": "EntryAbility",
        "srcEntry": "./ets/entryability/EntryAbility.ets",
        "description": "$string:EntryAbility_desc",
        "icon": "$media:layered_image",
        "label": "$string:EntryAbility_label",
        "startWindowIcon": "$media:startIcon",
        "startWindowBackground": "$color:start_window_background",
        "exported": true,
        "skills": [
          {
            "entities": [
              "entity.system.home"
            ],
            "actions": [
              "action.system.home"
            ]
          }
        ]
      }
    ],
    "extensionAbilities": [
      {
        "name": "EntryBackupAbility",
        "srcEntry": "./ets/entrybackupability/EntryBackupAbility.ets",
        "type": "backup",
        "exported": false,
        "metadata": [
          {
            "name": "ohos.extension.backup",
            "resource": "$profile:backup_config"
          }
        ],
      }
    ]
  }
}

普通模块(共享包,不可运行)

{
  "module": {
    "name": "home",
    "type": "shared",
    "description": "$string:shared_desc",
    "deviceTypes": [
      "phone",
      "tablet",
      "2in1"
    ],
    "deliveryWithInstall": true,
    "pages": "$profile:main_pages"
  }
}

module.json5中差异性比较大,不仅仅是type类型的不同,一个共享包中的配置属性相对于主模块而言,缺失了很多的属性,比如abilities,extensionAbilities等。

3、缺少ability

其实在module.json5中我们已经看出了这个差异,主模块中是多了两个Ability,一个是EntryAbility,一个是EntryBackupAbility,虽然说默认生成的自带EntryBackupAbility这个用于应用接入数据备份恢复的类,但是我们删除,也不会影响到我们的应用开发。

cke_38401.png

4、缺少资源

共享包和运行包,在module.json5差异中,还有一些资源上的缺少,如icon图标,如背景颜色等等。

cke_42058.png

实现共享包运行

让一个普通模块实现运行,我们只需要按照以上的差异进行修改,便可以达到组件的单独运行效果,更改完有两点需要注意,第一点,清除缓存,清除之前的配置信息,第二点,设置启动Ability。

cke_45202.png

除了自身的模块需要更改,也需要把之前的运行模块修改为共享模块,否则也是无法单独运行,也就是遵循,共享包改为运行包,运行包改为共享包

主要改动就是互相调换代码,弥补资源信息,比如共享包改动如下:

hvigorfile.ts里改为和主模块一样的:

cke_48408.png

module.json5中也是改为和主模块一样的,并且需要两个Ability。

cke_51740.png

然后就是复制需要的资源信息:

cke_55139.png

同样的,主模块也是按照共享包里的配置进行更改,两个都互相改完之后,单独的模块就可以独立运行了,比如资讯项目中的home模块,改为之后,点击运行后,效果如下:

cke_58597.png

相关总结

组件化运行目的是为了减少编译时间,提高运行测试效率,毕竟一个模块的运行时间肯定远远小于整个项目的运行时间。

本篇文章,主要分析了运行包和共享包之间的差异,了解了差异点,我们便可以手动实现共享包的运行。

手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!

鸿蒙Next基于ArkTS实现组件化运行。使用@Entry装饰器定义入口组件,@Component装饰器声明自定义组件。通过struct结构体封装UI描述,支持组件复用和组合。组件间通信使用@State@Prop@Link等装饰器管理状态传递。构建时采用声明式UI范式,组件可独立编译和部署。

在HarmonyOS Next中,基于API 21实现组件化运行,核心是利用HSP(Harmony Shared Package)或HAR(Harmony Archive)进行模块解耦,并通过DevEco Studio的“运行至指定模块”功能来独立运行调试单个组件。具体步骤如下:

  1. 项目结构组件化:将工程按业务模块拆分为多个HSP或HAR模块。HSP支持独立编译、运行和代码共享,是实现真正组件化运行的关键;HAR主要用于静态代码共享。

  2. 配置模块入口:在需要独立运行的HSP模块的module.json5文件中,确保已正确声明abilities(UI组件)作为入口点。例如:

    "abilities": [{
      "name": "EntryAbility",
      "srcEntry": "./ets/entryability/EntryAbility.ets",
      "description": "$string:EntryAbility_desc",
      "icon": "$media:icon",
      "label": "$string:EntryAbility_label",
      "startWindowIcon": "$media:icon",
      "startWindowBackground": "$color:start_window_background",
      "exported": true,
      "skills": [{
        "entities": ["entity.system.home"],
        "actions": ["action.system.home"]
      }]
    }]
    

    关键是将"exported"设置为true,允许外部或其他模块启动。

  3. 使用DevEco Studio运行:在DevEco Studio的“Project”窗口中,右键点击需要单独运行的HSP模块目录,选择“Run ‘模块名’”或点击工具栏中的运行配置下拉菜单,选择该模块即可。IDE会自动编译该模块及其依赖,并启动一个模拟器或真机实例运行此模块。

  4. 模块间调用(如需要):在独立运行时,如果该组件依赖其他HSP提供的服务或UI,需使用动态导入(如import())或FeatureAbility等机制调用,确保模块隔离性。

这种方式允许开发者在不启动完整主应用的情况下,快速编译、部署并测试单个业务组件,极大提升了组件化开发的调试效率与灵活性。

回到顶部