鸿蒙开发:基于最新API,如何实现组件化运行

前言

本项目API>=13

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

image.png

因为Api发生了变化,新的IDE中,创建的项目结构,也潜移默化的发生了变化,那么之前开发的插件也好,脚本也好,也是无法继续使用的,没办法,只能改造升级了。

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

运行包和共享包

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

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

image.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这个用于应用接入数据备份恢复的类,但是我们删除,也不会影响到我们的应用开发。

image.png

4、缺少资源

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

image.png

实现共享包运行

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

image.png

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

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

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

image.png

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

image.png

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

image.png

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

image.png

相关总结

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

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

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

#鸿蒙开发#
鸿蒙点石成金 文章被收录于专栏

简单的也好,复杂的也罢,关于HarmonyOS,总要深入浅出,总要步步为赢。

全部评论

相关推荐

首先讲三个故事,关于牛客的事件一:2024年,牛客上有一对高学历情侣,求职方向与我当时一致,都是嵌入式方向。他们恰好是我的朋友,专业能力和学历背景都很扎实,也因此拿到了不少优质offer。和很多求职者一样,他们把offer情况整理后发在平台上,本意是记录与交流,但很快引发了争议。有声音指责他们“集邮”“不释放名额”,认为这种展示本身就是一种炫耀。最终讨论失控,当事人删除内容,事件也很快被遗忘。事件二:小红书评论区,一条评价获得了不少共鸣:“感觉牛客就是当年那群做题区毕业了开始找工作还收不住那股味,颇有一种从年级第一掉到年纪第二后抱怨考不上大学的味道”,这条评论被水印里这个同学转发到牛客后,评论...
小型域名服务器:当看到别人比自己强的时候,即便这是对方应得的,很多人会也下意识的歪曲解构对方的意图,来消解自己在这本就不存在的比较中输掉的自信,从而平白制造出很多无谓的争论。比如你会在空余时间来写优质好文,而我回家只会暗区突围,那么我就可以作为键盘侠在这里评论你是不是XXXXXXXX。即便我自己都知道这是假的,但只要这没那么容易证伪,那么当你开始回应的时候,脏水就已经泼出去了,后面可能会有更多的人带着情绪来给我点赞,而毫不关注你写的文章内容本身是啥了。
SAGIMA牛马咖啡
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务