HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行
HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行
目前最新的Api版本,已经来到了21版本,在实际的项目开发中,如果选择了组件化开发,如何让单个组件实现运行呢?
更多关于HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行的实战教程也可以访问 https://www.itying.com/category-93-b0.html
很宝贵的经验,学习了!
更多关于HarmonyOS 鸿蒙Next基于最新API,如何实现组件化运行的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
感谢支持,
关于组件化和模块化,有过太多的文章进行概述,这里就不过多赘述了。
实现单个组件运行,我们还是从基本的运行包和共享包差异性来分析,然后在着手利用脚本或插件帮我们快速实现组件化运行包切换,本篇文章,重点概述手动实现普通模块(共享包)运行。
运行包和共享包
什么是运行包?什么是共享包?拿我们这个某一个项目来说,entry模块就是运行包,我们直接可以运行到设备上并正确展示,其他模块就是共享包,无法单独运行到设备上正确展示;一句话解读:能独立运行至设备上的模块,并且能够正确展示,就是运行包。
这里有一点需要清晰,那就是,运行包一个项目中只能存在一个,即便后续,我们把其他的模块修改为了可运行,也要把原有的运行包修改为不可运行。

如何把一个共享包修改为运行包,前提需要对比两者的差异,根据不同之处,才能方便后续修改。
两者差异性
我们主要对比主模块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这个用于应用接入数据备份恢复的类,但是我们删除,也不会影响到我们的应用开发。

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

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

除了自身的模块需要更改,也需要把之前的运行模块修改为共享模块,否则也是无法单独运行,也就是遵循,共享包改为运行包,运行包改为共享包。
主要改动就是互相调换代码,弥补资源信息,比如共享包改动如下:
hvigorfile.ts里改为和主模块一样的:

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

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

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

相关总结
组件化运行目的是为了减少编译时间,提高运行测试效率,毕竟一个模块的运行时间肯定远远小于整个项目的运行时间。
本篇文章,主要分析了运行包和共享包之间的差异,了解了差异点,我们便可以手动实现共享包的运行。
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!
鸿蒙Next基于ArkTS实现组件化运行。使用@Entry装饰器定义入口组件,@Component装饰器声明自定义组件。通过struct结构体封装UI描述,支持组件复用和组合。组件间通信使用@State、@Prop、@Link等装饰器管理状态传递。构建时采用声明式UI范式,组件可独立编译和部署。


