前言
本项目API>=13
在《鸿蒙开发:资讯项目实战之项目初始化搭建》一文中,遗留了一个问题,那就是,如何实现各个模块独立运行,其实关于组件化各模块独立运行,之前也写过三篇文章,分别探讨了运行包和共享包区别,nodeJs脚本实现组件化和hvigor插件形式进行组件化,奈何时间过去已久,之前的方式已不在通用,因为新的API更新迭代太快了,不知不觉API19已经到来,今年以来,已经更新了6个版本了,官方的速度如火箭一般,实现追不上啊!

因为Api发生了变化,新的IDE中,创建的项目结构,也潜移默化的发生了变化,那么之前开发的插件也好,脚本也好,也是无法继续使用的,没办法,只能改造升级了。
还是按照以往的顺序,我们从基本的运行包和共享包差异性分析,然后在着手利用脚本或插件帮我们快速实现组件化运行包切换,本篇文章,重点概述手动实现普通模块(共享包)运行。
运行包和共享包
什么是运行包?什么是共享包?拿我们这个资讯项目来说,entry模块就是运行包,我们直接可以运行到设备上并正确展示,其他模块就是共享包,无法单独运行到设备上正确展示;一句话解读:能独立运行至设备上的模块,并且能够正确展示,就是运行包。
这里有一点需要清晰,那就是,运行包一个项目中只能存在一个,即便后续,我们把其他的模块修改为了可运行,也要把原有的运行包修改为不可运行。

如何把一个共享包修改为运行包,前提需要对比两者的差异,根据不同之处,才能方便后续修改。
两者差异性
我们主要对比主模块entry和一个普通的共享包即可,新的API中,和之前的差异性不是很大,不同之处基本上一样,目前有以下几处不同,这里我们只分析动态共享包,静态共享包其实也是类似的。
1、hvigorfile.ts不同
主模块(entry,可运行)
TypeScript
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. */
}
普通模块(共享包,不可运行)
TypeScript
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,可运行)
json
{
"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"
}
],
}
]
}
}
普通模块(共享包,不可运行)
json
{
"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模块,改为之后,点击运行后,效果如下:

相关总结
组件化运行目的是为了减少编译时间,提高运行测试效率,毕竟一个模块的运行时间肯定远远小于整个项目的运行时间。
本篇文章,主要分析了运行包和共享包之间的差异,了解了差异点,我们便可以手动实现共享包的运行。
手动只是让大家了解切换的原理,在实际开发中,可不推荐手动,下篇文章,我们将通过脚本或者插件,快速实现组件化模块之间的切换,实现独立运行,敬请期待!