HarmonyOS应用多Module设计机制:解锁高效开发新姿势

目录

一、HarmonyOS 应用开发的多 Module 设计机制是什么

二、多 Module 设计机制的原理

(一)模块类型

(二)标识机制

(三)项目结构与应用安装流程

三、多 Module 设计机制的优势

(一)功能解耦

(二)按需加载

(三)团队协作

(四)可维护性

四、多 Module 设计机制的使用场景与案例分析

(一)使用场景

(二)案例分析

五、总结与展望


一、HarmonyOS 应用开发的多 Module 设计机制是什么

在 HarmonyOS 应用开发中,多 Module 设计机制是一项极为关键且具有创新性的特性 ,是整个应用开发架构的核心。简单来说,多 Module 设计机制允许开发者将一个复杂的应用程序,按照不同的功能特性、业务逻辑或者设备适配需求,拆分成多个相对独立的模块(Module)。每个 Module 就像是一个具有特定功能的 “小零件”,它们既可以独立进行开发、编译和测试,又能相互协作,共同构建成一个完整的应用程序。

以一个综合类的电商应用为例,可能会拆分成商品展示模块、购物车模块、支付模块、用户管理模块等。商品展示模块负责展示各类商品的图片、价格、描述等信息;购物车模块专注于管理用户添加的商品、计算总价以及处理商品数量的增减;支付模块则聚焦于实现安全可靠的支付流程;用户管理模块负责用户的注册、登录、信息修改等操作。这些模块相互独立,开发者可以针对每个模块的特点进行专门的优化和维护 。

这种设计机制与传统的应用开发模式有着显著的区别。在传统开发模式中,整个应用往往是一个紧密耦合的整体,所有的功能代码都混合在一起,这使得代码的维护和扩展变得极为困难。而 HarmonyOS 的多 Module 设计机制打破了这种局面,实现了功能的模块化和松耦合。它就像是将一座大型建筑拆分成多个独立的小房间,每个房间都有自己独特的功能和用途,同时又通过合理的布局和通道相互连接,既方便了管理和维护,又增强了整体的灵活性和可扩展性。

二、多 Module 设计机制的原理

(一)模块类型

在 HarmonyOS 中,Module 主要分为 Ability 类型和 Library 类型 ,每一种类型都有着独特的作用和特性,它们相互配合,共同构建出灵活且高效的应用架构。

Ability 类型:这是用于实现应用功能和特性的模块,编译后会生成以.hap 为后缀的文件,即 HAP(Harmony Ability Package)包 ,它是应用安装和运行的基本单位,一个应用中可以包含一个或多个 HAP 包,具体又分为以下两种:

entry 类型的 Module:作为应用的主模块,它就像是一座大厦的大门和核心区域,包含应用的入口界面、入口图标和主功能特性 ,编译后生成 entry 类型的 HAP。每一个应用分发到同一类型的设备上的应用程序包,只能包含唯一一个 entry 类型的 HAP ,它是应用启动时最先加载的部分,为用户呈现应用的初始界面和核心功能,就如同电商应用的首页展示、用户登录等基础功能通常都在 entry 模块中实现。

feature 类型的 Module:这是应用的动态特性模块,编译后生成 feature 类型的 HAP ,可以看作是大厦里的一些特色功能区域,如会议室、健身房等。一个应用中可以包含一个或多个 feature 类型的 HAP,也可以不包含 。它作为应用能力的扩展,可以根据用户的需求和设备类型进行选择性安装 。例如,电商应用中的跨境购物功能、高端会员专属功能等,就可以放在 feature 模块中,用户如果有相关需求再进行下载安装,这样既节省了用户设备的存储空间,又能满足不同用户的个性化需求。

Library 类型:主要用于实现代码和资源的共享,不能单独运行,但可以被其他的 Module 多次引用,就像是大厦建设中使用的通用建筑材料和工具,合理地使用该类型的 Module,能够降低开发和维护成本 ,分为以下两种:

Static Library(静态共享库):编译后会生成一个以.har 为后缀的文件,即静态共享包 HAR(Harmony Archive) 。它在编译时会直接被打包到引用它的模块中,就像在建筑中,一旦使用了某种固定的建筑材料,它就成为了建筑结构的一部分。例如,多个模块都需要使用的通用工具类、基础 UI 组件等,就可以放在 Static Library 中,实现代码的复用 。

Shared Library(动态共享库):编译后会生成一个以.hsp 为后缀的文件,即动态共享包 HSP(Harmony Shared Package) 。它与 Static Library 不同,在运行时才被加载,并且在同一个进程中代码只会存在一份,就像大厦里的一些可随时调用的公共服务,多个区域可以共享使用,避免了资源的重复占用。例如,多个 HAP 模块都需要使用的网络请求模块、数据库操作模块等,使用 Shared Library 可以减少内存开销,提高应用的性能 。

(二)标识机制

在 HarmonyOS 应用中,每个 HAP 包都由唯一的 Bundle Name(应用包名)和 Module Name(模块名)共同标识 ,它们就像是每个人的身份证号和姓名,共同确定了一个人的唯一身份。

Bundle Name:在整个系统中唯一标识一个应用,遵循反向域名命名规范,比如 “com.example.myapplication” ,确保了在系统中的全局唯一性。无论应用包含多少个模块,Bundle Name 始终保持一致,就像一个家族的姓氏,所有家族成员都共享这个姓氏,通过 Bundle Name,系统可以准确地区分不同的应用 。

Module Name:则在应用内部唯一标识一个模块,使得同一应用的不同模块可以被准确区分和管理 ,就像家族中每个成员的名字,各不相同,用于区分家族内部的不同个体。例如,在一个包含多个功能模块的电商应用中,商品展示模块、购物车模块、支付模块等都有各自独特的 Module Name,这样在应用开发和运行过程中,就可以方便地对各个模块进行调用、管理和维护 。

(三)项目结构与应用安装流程

一个标准的 HarmonyOS 应用项目具有清晰且严谨的目录结构,每个目录都承担着特定的职责,共同协作构建出完整的应用。以一个常见的 HarmonyOS 应用项目为例,其目录结构大致如下:


MyHarmonyApp/

├── AppScope/ // 应用级作用域

│ ├── app.json5 // 应用级配置文件,声明应用的全局配置信息,如应用Bundle名称、应用名称、应用图标、应用版本号等

│ └── resources/ // 应用级资源

│ ├── base/ // 基础资源

│ │ ├── element/ // 基础元素资源,如字符串、颜色等定义

│ │ │ └── string.json // 字符串资源文件

│ │ ├── media/ // 媒体资源,如图片、音频等

│ │ │ └── app_icon.png// 应用图标

│ │ └── profile/ // 配置文件

│ └── en_US/ // 英文资源,用于多语言支持

├── entry/ // 入口模块,应用的主模块

│ ├── src/ // 源代码目录

│ │ ├── main/ // 主要代码

│ │ │ ├── ets/ // ArkTS代码目录

│ │ │ │ ├── entryability/

│ │ │ │ │ └── EntryAbility.ets // 入口Ability,负责应用的启动和初始化

│ │ │ │ ├── entrybackupability/

│ │ │ │ │ └── EntryBackupAbility.ets // 备份Ability(假设存在)

│ │ │ │ └── pages/ // 页面代码,存放应用的各个页面布局和逻辑

│ │ │ │ └── Index.ets // 首页代码

│ │ │ ├── resources/ // 模块资源

│ │ │ │ ├── base/ // 基础资源

│ │ │ │ │ ├── element/

│ │ │ │ │ │ ├── color.json // 颜色资源文件

│ │ │ │ │ │ └── string.json// 字符串资源文件

│ │ │ │ │ ├── media/ // 媒体资源

│ │ │ │ │ │ ├── layered_image.json

│ │ │ │ │ │ └── startIcon.png

│ │ │ │ │ └── profile/

│ │ │ │ │ ├── main_pages.json // 页面配置文件

│ │ │ │ │ └── backup_config.json // 备份配置文件(假设存在)

│ │ │ │ └── en_US/ // 英文资源

│ │ │ └── module.json5 // 模块配置文件,声明模块基本信息、支持的设备类型、所含的组件信息、运行所需申请的权限等

│ │ └── ohosTest/ // 测试代码目录,用于编写和存放单元测试等测试代码

│ ├── build-profile.json5 // 构建配置文件,包含当前模块的构建信息,如签名配置、产品配置等

│ └── hvigorfile.ts // 构建脚本文件,用于自定义编译构建工具版本、控制构建行为的配置参数

├── build-profile.json5 // 应用构建配置文件,包含应用级的构建信息,如签名、产品配置等

└── hvigorfile.ts // 应用构建脚本文件,用于控制应用整体的编译构建过程

当用户从应用市场下载一个 HarmonyOS 应用时,整个安装流程就像是一场有序的物流配送和组装过程:

下载 APP 包:用户在应用市场点击下载应用时,实际下载的是一个.app 文件,这个文件就像是一个装满了各种零件的大包裹,包含了应用运行所需的所有 HAP 包和相关资源 。

解析 APP 包:系统接收到这个.app 文件后,会首先对其进行解析,就像打开包裹,查看里面都有哪些零件。系统会读取 APP 包的结构和元数据,了解其中包含了哪些 HAP 包以及它们的相关信息 。

提取 HAP 包:在解析完成后,系统会从 APP 包中提取出所有的 HAP 包,将这些 “零件” 一一拿出来,准备进行下一步的处理 。

验证 HAP 包:为了确保应用的安全性和完整性,系统会对每个提取出来的 HAP 包进行完整性和签名验证,就像检查每个零件是否合格,有没有被损坏或篡改 。只有通过验证的 HAP 包才能继续进行安装 。

安装 HAP 包:经过验证的 HAP 包会被安装到设备的相应位置,并注册到系统中 ,就像将合格的零件安装到正确的位置,使其能够正常工作。系统会将 entry 类型的 HAP 作为应用的入口进行初始化,其他 feature 类型的 HAP 也会根据需要进行加载和配置 ,最终完成应用的安装,让用户可以顺利使用应用 。

三、多 Module 设计机制的优势

(一)功能解耦

在软件开发中,高内聚、低耦合是一个重要的设计原则,而多 Module 设计机制正是实现这一原则的有效手段。通过将应用程序按照不同的功能特性拆分成多个独立的模块,每个模块只专注于实现自己的特定功能,就像工厂里的不同生产线,各自负责生产特定的产品,这样可以极大地减少不同功能之间的代码耦合度 。

以一个简单的音乐播放应用为例,在传统的单体应用设计中,播放功能、歌曲列表展示功能、用户设置功能等所有代码可能都混杂在一起,如下所示:


// 传统单体应用设计

@Entry

@Component

struct MusicApp {

// 歌曲列表数据

songList: string[] = [];

// 当前播放歌曲索引

currentSongIndex: number = 0;

// 用户设置数据

userSettings: {

volume: number;

playMode: string;

} = {

volume: 50,

playMode: '顺序播放'

};

// 播放歌曲方法

playSong(): void {

// 播放逻辑,包含与歌曲列表、用户设置相关的复杂逻辑

console.log('播放歌曲:', this.songList[this.currentSongIndex]);

// 根据用户设置调整播放音量和模式

console.log('音量:', this.userSettings.volume);

console.log('播放模式:', this.userSettings.playMode);

}

// 切换歌曲方法

switchSong(index: number): void {

this.currentSongIndex = index;

this.playSong();

}

// 更新用户设置方法

updateSettings(settings: { volume: number; playMode: string }): void {

this.userSettings = settings;

// 可能还需要根据新设置更新播放状态等

}

build() {

Column() {

// 歌曲列表展示

List(this.songList, (song, index) => {

Text(song)

.onClick(() => this.switchSong(index));

});

// 用户设置按钮

Button('设置')

.onClick(() => {

// 跳转到设置页面逻辑

});

// 播放按钮

Button('播放')

.onClick(() => this.playSong());

}

}

}

在这种设计下,各个功能之间的代码紧密耦合,牵一发而动全身。例如,如果要修改歌曲列表的展示方式,可能会影响到播放功能和用户设置功能的代码;如果要添加新的功能,也需要在这个庞大的代码文件中到处寻找合适的位置进行添加,这使得代码的维护和扩展变得极为困难 。

而采用多 Module 设计机制后,可以将这些功能分别拆分成独立的模块,每个模块都有自己独立的代码文件和逻辑,以 ArkTS 语言为例:


// 播放模块 playModule.ets

@Component

struct PlayModule {

currentSongIndex: number = 0;

songList: string[] = [];

playSong(): void {

console.log('播放歌曲:', this.songList[this.currentSongIndex]);

}

switchSong(index: number): void {

this.currentSongIndex = index;

this.playSong();

}

build() {

Column() {

// 播放按钮

Button('播放')

.onClick(() => this.playSong());

}

}

}


// 歌曲列表模块 songListModule.ets

@Component

struct SongListModule {

songList: string[] = [];

build() {

Column() {

List(this.songList, (song, index) => {

Text(song)

.onClick(() => {

// 通知播放模块切换歌曲

});

});

}

}

}


// 用户设置模块 userSettingsModule.ets

@Component

struct UserSettingsModule {

userSettings: {

volume: number;

playMode: string;

} = {

volume: 50,

playMode: '顺序播放'

};

updateSettings(settings: { volume: number; playMode: string }): void {

this.userSettings = settings;

}

build() {

Column() {

// 设置页面相关UI和逻辑

}

}

}

在主应用模块中,通过引用这些独立的模块来组合成完整的应用:


// 主应用模块 main.ets

@Entry

@Component

struct MainApp {

build() {

Column() {

SongListModule();

PlayModule();

// 可以通过按钮点击等方式跳转到用户设置模块页面

Button('设置')

.onClick(() => {

// 跳转到用户设置模块页面逻辑

});

}

}

}

这样,每个模块的功能更加单一和明确,模块之间通过接口或者事件进行通信,耦合度大大降低 。当需要修改某个功能时,只需要在对应的模块中进行修改,而不会影响到其他模块的正常运行;当需要添加新功能时,也可以方便地创建新的模块并集成到应用中 。

(二)按需加载

按需加载是 HarmonyOS 多 Module 设计机制的又一重要优势,它就像是一个智能的物资调配系统,能够根据实际需求精准地提供资源,避免了资源的浪费和过度占用 。其原理基于动态加载技术,在应用运行过程中,只有当用户真正需要某个功能模块时,系统才会将该模块从存储设备加载到内存中并运行 。

以一个功能丰富的大型办公应用为例,它可能包含文档编辑、表格制作、演示文稿、邮件收发、云存储等多个功能模块。如果采用传统的加载方式,用户在安装应用时,所有的功能模块都会被一次性下载并安装到设备上,占用大量的设备存储空间。而且在应用启动时,所有模块的代码和资源都会被加载到内存中,这不仅会导致应用的安装时间变长,启动速度变慢,还会占用大量的内存资源,影响设备的整体性能 。

假设这个办公应用的总大小为 200MB,其中文档编辑模块大小为 80MB,表格制作模块大小为 50MB,演示文稿模块大小为 40MB,邮件收发模块大小为 20MB,云存储模块大小为 10MB。如果用户只是偶尔使用文档编辑和邮件收发功能,那么在传统加载方式下,用户不得不下载和安装整个 200MB 的应用,而其中 120MB 的其他功能模块资源对用户来说是完全浪费的 。

而采用 HarmonyOS 的多 Module 设计机制和按需加载功能后,用户在安装应用时,只需要下载和安装核心的 entry 模块以及常用的功能模块,比如文档编辑模块和邮件收发模块,假设这两个模块的总大小为 100MB,这样就可以节省 100MB 的设备存储空间 。当用户需要使用表格制作、演示文稿或云存储功能时,应用会根据用户的操作动态地从应用市场或其他存储位置下载并加载相应的模块到内存中,实现了功能的按需使用 。

这种按需加载的方式不仅节省了设备的存储空间,还显著提升了用户体验 。应用的安装时间和启动时间大大缩短,用户可以更快地开始使用应用的核心功能 。同时,由于在任何时刻都只有必要的模块在内存中运行,减少了内存的占用,提高了应用的运行效率和响应速度,使得应用在运行过程中更加流畅和稳定 。

(三)团队协作

在大型应用开发项目中,团队协作的效率直接影响着项目的进度和质量,而 HarmonyOS 的多 Module 设计机制为团队协作提供了有力的支持,就像一场精心组织的交响乐团演奏,每个成员都能在自己的位置上发挥最大的作用,同时又能与其他成员紧密配合 。

以一个电商应用的开发项目为例,假设这个项目由一个 50 人的开发团队负责,团队成员包括前端开发人员、后端开发人员、测试人员、产品经理等。在传统的单体应用开发模式下,所有的代码都集中在一个项目中,不同功能模块的代码相互交织 。前端开发人员在修改商品展示页面的 UI 时,可能会不小心影响到购物车模块的逻辑;后端开发人员在优化订单处理接口时,也可能会导致用户登录模块出现问题 。而且由于代码量庞大,不同成员之间的代码冲突频繁发生,例如两个开发人员同时修改了同一个文件的同一部分代码,这就需要花费大量的时间来解决冲突 。

而采用多 Module 设计机制后,整个电商应用可以拆分成多个独立的模块,如商品展示模块、购物车模块、支付模块、用户管理模块、订单管理模块等 。每个模块都可以由一个独立的小组负责开发和维护,例如商品展示模块由 5 名前端开发人员和 3 名后端开发人员组成的小组负责;购物车模块由 4 名前端开发人员和 2 名后端开发人员组成的小组负责 。每个小组只专注于自己负责的模块,对其他模块的依赖和影响较小 。

在开发过程中,不同小组之间通过明确的接口和规范进行通信和协作 。例如,商品展示模块和购物车模块之间通过定义好的接口来传递商品信息和添加商品到购物车的操作;支付模块和订单管理模块之间通过接口来完成支付结果的通知和订单状态的更新 。这样,各个小组可以并行开发,大大提高了开发效率 。同时,由于每个模块的代码相对独立,不同小组之间的代码冲突也大大减少 。即使出现冲突,也只需要在相应的模块内部进行解决,不会影响到整个项目的其他部分 。

此外,多 Module 设计机制还方便了项目的管理和分工 。产品经理可以根据项目的进度和需求,灵活地调配各个小组的资源;测试人员也可以针对每个模块进行独立的测试,提高测试的效率和准确性 。

(四)可维护性

可维护性是衡量一个应用程序质量的重要指标,HarmonyOS 的多 Module 设计机制在提升应用可维护性方面表现出色,就像一个布局合理、设施齐全的大型工厂,各个车间分工明确,设备易于维护和管理 。

当应用出现问题需要修复 bug 时,在多 Module 设计的应用中,开发者可以快速定位到问题所在的模块 。以一个社交应用为例,如果用户反馈在发送消息时出现卡顿现象,开发团队可以迅速判断出这个问题可能出在消息发送模块,然后直接在该模块的代码中进行排查和修复 。而在传统的单体应用中,由于所有功能的代码混杂在一起,开发者可能需要在大量的代码中逐一排查,耗费大量的时间和精力 。

在添加新功能时,多 Module 设计同样具有明显的优势 。假设社交应用要添加一个新的视频通话功能,采用多 Module 设计,开发团队可以创建一个新的视频通话模块,在这个模块中独立地开发视频通话所需的界面、逻辑和接口 。新模块与其他现有模块之间通过预先定义好的接口进行交互,不会对其他模块的正常运行造成影响 。而在单体应用中,添加新功能可能需要对整个应用的架构和代码进行大规模的修改,这不仅容易引入新的问题,而且开发难度和风险都大大增加 。

再比如,在应用的版本更新过程中,如果应用采用了多 Module 设计,对于一些不涉及核心功能的模块更新,只需要单独更新对应的模块即可,而不需要重新发布整个应用 。例如,社交应用的广告展示模块进行了优化,只需要更新广告展示模块的代码和资源,用户在使用应用时可以通过在线更新的方式获取新的广告展示模块,而不会影响到其他模块的使用 。这不仅提高了应用更新的效率,也减少了对用户的影响 。

四、多 Module 设计机制的使用场景与案例分析

(一)使用场景

电商应用:在电商应用中,多 Module 设计机制可以实现各个核心业务功能的高效管理和灵活扩展。比如商品展示模块,负责展示各类商品的详细信息,包括图片、价格、描述、用户评价等,通过独立的模块设计,可以方便地对商品展示的界面样式、加载逻辑进行优化和更新,而不影响其他模块的正常运行。购物车模块则专注于管理用户添加的商品,实现商品数量的增减、总价计算、商品删除等功能,将其独立为一个模块,能够更好地进行购物车相关功能的开发和维护,如优化购物车的性能,实现购物车商品的实时同步等。支付模块更是电商应用的关键环节,涉及到多种支付方式的集成、支付安全验证、支付结果处理等复杂逻辑,将其作为独立模块,有利于保障支付流程的稳定性和安全性,同时也便于根据市场需求快速接入新的支付渠道。

社交应用:社交应用功能丰富,用户交互频繁,多 Module 设计机制可以提升用户体验和应用的可扩展性。消息模块是社交应用的核心功能之一,负责实现即时通讯,包括文字消息、语音消息、图片消息、视频消息的发送和接收,独立的消息模块可以进行高效的消息推送优化、消息加密处理等。好友管理模块则主要负责用户的好友添加、删除、分组、查找等操作,将其作为独立模块,能够方便地实现好友关系的维护和社交关系网络的构建。动态展示模块用于展示用户发布的动态,如文字动态、图片动态、视频动态等,以及好友的动态更新,通过独立模块设计,可以灵活地实现动态展示的个性化定制,如根据用户兴趣推荐相关动态等。

游戏应用:对于游戏应用而言,多 Module 设计机制有助于提升游戏的性能和开发效率。游戏核心玩法模块是游戏的核心部分,包含游戏的主要逻辑,如关卡设计、角色控制、敌人 AI、游戏规则等,将其独立出来,可以专注于游戏玩法的开发和优化,提升游戏的趣味性和挑战性。资源管理模块负责管理游戏中的各种资源,如图像资源、音频资源、模型资源等,通过独立的资源管理模块,可以实现资源的按需加载、缓存管理,减少游戏的内存占用,提升游戏的加载速度。社交互动模块则实现游戏内的社交功能,如好友组队、公会系统、聊天功能等,将其作为独立模块,能够方便地与游戏核心玩法模块进行解耦,同时也便于根据社交需求进行功能扩展。

(二)案例分析

以一个名为 “HarmonyShop” 的 HarmonyOS 电商应用项目为例,该应用采用了多 Module 设计机制,主要包含以下几个模块:

entry 模块:作为应用的主模块,包含应用的入口界面,展示了应用的 logo、广告轮播图、热门商品推荐等,是用户打开应用时首先看到的界面。同时,它还负责应用的初始化工作,如加载应用配置、初始化网络请求模块等。此外,entry 模块还集成了用户登录、注册功能,用户可以通过手机号、邮箱等方式进行注册和登录,登录成功后,用户的信息将被存储在本地,并同步到服务器。在应用的首页布局文件(Index.ets)中,通过引入其他模块的组件来展示商品分类导航、热门商品推荐等功能,如下所示:


// entry模块首页布局文件Index.ets

@Entry

@Component

struct Index {

build() {

Column() {

// 引入商品分类导航组件,来自goodsCategory模块

GoodsCategoryComponent();

// 引入热门商品推荐组件,来自recommendGoods模块

RecommendGoodsComponent();

}

}

}

goodsList 模块:专门负责商品列表的展示,从服务器获取商品数据,包括商品的 ID、名称、价格、图片、描述等信息,并将其展示在列表中。用户可以在商品列表页面进行商品的筛选、排序操作,如按照价格从低到高、从高到低排序,按照商品类别进行筛选等。在商品列表页面的逻辑代码(GoodsList.ets)中,通过网络请求获取商品数据,并使用 List 组件进行展示,如下所示:


// goodsList模块商品列表页面逻辑代码GoodsList.ets

@Component

struct GoodsList {

// 存储商品列表数据

goodsList: Goods[] = [];

async onPageShow() {

// 模拟网络请求获取商品数据

const response = await fetch('https://api.example.com/goods/list');

const data = await response.json();

this.goodsList = data;

}

build() {

List(this.goodsList, (goods) => {

Row() {

Image(goods.imageUrl)

.width(100)

.height(100);

Column() {

Text(goods.name)

.fontSize(16);

Text('价格:' + goods.price)

.fontSize(14)

.textColor(Color.Gray);

}

}

.onClick(() => {

// 跳转到商品详情页面,传递商品ID

router.pushUrl({ url: `/goodsDetail/${goods.id}` });

});

});

}

}

goodsDetail 模块:用于展示商品的详细信息,当用户在商品列表页面点击某一商品时,会跳转到该商品的详情页面。在商品详情页面,用户可以看到商品的详细描述、规格参数、用户评价等信息,还可以进行添加到购物车、立即购买等操作。在商品详情页面的逻辑代码(GoodsDetail.ets)中,根据传递过来的商品 ID,从服务器获取商品的详细信息,并进行展示,如下所示:


// goodsDetail模块商品详情页面逻辑代码GoodsDetail.ets

@Component

struct GoodsDetail {

// 获取传递过来的商品ID

@RouteParam('id') goodsId: string;

// 存储商品详细数据

goodsDetail: GoodsDetailData | null = null;

async onPageShow() {

// 模拟网络请求获取商品详细数据

const response = await fetch(`https://api.example.com/goods/detail?id=${this.goodsId}`);

const data = await response.json();

this.goodsDetail = data;

}

build() {

if (this.goodsDetail) {

Column() {

Image(this.goodsDetail.imageUrl)

.width('100%')

.height(300);

Text(this.goodsDetail.name)

.fontSize(20)

.textAlign(TextAlign.Center);

Text('价格:' + this.goodsDetail.price)

.fontSize(16)

.textColor(Color.Red)

.textAlign(TextAlign.Center);

// 展示商品描述

Text(this.goodsDetail.description)

.fontSize(14)

.margin(10);

// 添加到购物车按钮

Button('添加到购物车')

.width('100%')

.height(50)

.backgroundColor(Color.Blue)

.fontSize(16)

.onClick(() => {

// 调用购物车模块的添加商品接口

cartModule.addGoodsToCart(this.goodsDetail);

});

// 立即购买按钮

Button('立即购买')

.width('100%')

.height(50)

.backgroundColor(Color.Green)

.fontSize(16)

.onClick(() => {

// 跳转到支付模块

router.pushUrl({ url: '@bundle:com.example.harmonyshop/payment' });

});

}

} else {

Text('加载中...')

.fontSize(18)

.textAlign(TextAlign.Center);

}

}

}

cart 模块:购物车模块,用于管理用户添加的商品。用户在商品详情页面点击 “添加到购物车” 按钮后,商品信息将被添加到购物车模块中。购物车模块会实时计算购物车中商品的总价、商品数量等信息,并展示在购物车页面。用户可以在购物车页面进行商品数量的增减、商品删除、全选、结算等操作。在购物车页面的逻辑代码(Cart.ets)中,通过存储在本地的购物车数据,展示购物车中的商品信息,并实现各种操作的逻辑,如下所示:


// cart模块购物车页面逻辑代码Cart.ets

@Component

struct Cart {

// 存储购物车商品列表数据

cartGoodsList: CartGoods[] = [];

async onPageShow() {

// 从本地存储获取购物车数据

const cartData = await storage.get('cartData');

if (cartData) {

this.cartGoodsList = cartData;

}

}

// 添加商品到购物车方法

addGoodsToCart(goods: GoodsDetailData) {

const existingGoods = this.cartGoodsList.find(cartGoods => cartGoods.id === goods.id);

if (existingGoods) {

existingGoods.quantity++;

} else {

this.cartGoodsList.push({...goods, quantity: 1 });

}

// 更新本地存储的购物车数据

storage.put('cartData', this.cartGoodsList);

}

// 减少商品数量方法

decreaseGoodsQuantity(index: number) {

if (this.cartGoodsList[index].quantity > 1) {

this.cartGoodsList[index].quantity--;

// 更新本地存储的购物车数据

storage.put('cartData', this.cartGoodsList);

}

}

// 删除商品方法

deleteGoods(index: number) {

this.cartGoodsList.splice(index, 1);

// 更新本地存储的购物车数据

storage.put('cartData', this.cartGoodsList);

}

// 计算购物车总价方法

calculateTotalPrice() {

return this.cartGoodsList.reduce((total, cartGoods) => total + cartGoods.price * cartGoods.quantity, 0);

}

build() {

Column() {

List(this.cartGoodsList, (cartGoods, index) => {

Row() {

Image(cartGoods.imageUrl)

.width(80)

.height(80);

Column() {

Text(cartGoods.name)

.fontSize(16);

Text('价格:' + cartGoods.price)

.fontSize(14)

.textColor(Color.Gray);

Row() {

Button('-')

.width(30)

.height(30)

.backgroundColor(Color.Gray)

.fontSize(16)

.onClick(() => this.decreaseGoodsQuantity(index));

Text(cartGoods.quantity.toString())

.width(30)

.height(30)

.textAlign(TextAlign.Center);

Button('+')

.width(30)

.height(30)

.backgroundColor(Color.Gray)

.fontSize(16)

.onClick(() => {

this.cartGoodsList[index].quantity++;

// 更新本地存储的购物车数据

storage.put('cartData', this.cartGoodsList);

});

}

}

Button('删除')

.width(60)

.height(30)

.backgroundColor(Color.Red)

.fontSize(14)

.onClick(() => this.deleteGoods(index));

}

});

Text('总价:' + this.calculateTotalPrice())

.fontSize(18)

.textColor(Color.Red)

.textAlign(TextAlign.Right);

Button('结算')

.width('100%')

.height(50)

.backgroundColor(Color.Blue)

.fontSize(16)

.onClick(() => {

// 跳转到支付模块

router.pushUrl({ url: '@bundle:com.example.harmonyshop/payment' });

});

}

}

}

payment 模块:支付模块负责实现支付功能,支持多种支付方式,如微信支付、支付宝支付、银行卡支付等。当用户在购物车页面点击 “结算” 按钮或在商品详情页面点击 “立即购买” 按钮时,会跳转到支付模块。在支付模块中,用户选择支付方式,输入支付密码或进行指纹验证等操作,完成支付流程。支付成功后,会跳转到支付结果页面,展示支付成功的信息,并更新订单状态。在支付模块的逻辑代码(Payment.ets)中,通过调用第三方支付 SDK,实现支付功能,如下所示:


// payment模块支付页面逻辑代码Payment.ets

@Component

struct Payment {

// 支付方式选项

paymentMethods: string[] = ['微信支付', '支付宝支付', '银行卡支付'];

// 当前选择的支付方式

selectedPaymentMethod: string = this.paymentMethods[0];

async onPageShow() {

// 初始化支付模块,如获取支付订单信息等

}

// 发起支付方法

async pay() {

if (this.selectedPaymentMethod === '微信支付') {

// 调用微信支付SDK进行支付

const result = await wechatPaySDK.pay({

// 支付订单信息

orderInfo: {

amount: 100,

orderId: '202401010001'

}

});

if (result.success) {

// 支付成功,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/success' });

} else {

// 支付失败,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/failure' });

}

} else if (this.selectedPaymentMethod === '支付宝支付') {

// 调用支付宝支付SDK进行支付

const result = await alipayPaySDK.pay({

// 支付订单信息

orderInfo: {

amount: 100,

orderId: '202401010001'

}

});

if (result.success) {

// 支付成功,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/success' });

} else {

// 支付失败,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/failure' });

}

} else if (this.selectedPaymentMethod === '银行卡支付') {

// 调用银行卡支付SDK进行支付

const result = await bankCardPaySDK.pay({

// 支付订单信息

orderInfo: {

amount: 100,

orderId: '202401010001'

},

// 银行卡信息

bankCardInfo: {

cardNumber: '1234567890123456',

expireDate: '2025-12',

cvv: '123'

}

});

if (result.success) {

// 支付成功,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/success' });

} else {

// 支付失败,跳转到支付结果页面

router.pushUrl({ url: '/paymentResult/failure' });

}

}

}

build() {

Column() {

Text('请选择支付方式:')

.fontSize(18);

List(this.paymentMethods, (method) => {

Radio({ checked: this.selectedPaymentMethod === method, onChange: () => {

this.selectedPaymentMethod = method;

}})

.value(method)

.fontSize(16);

});

Button('确认支付')

.width('100%')

.height(50)

.backgroundColor(Color.Blue)

.fontSize(16)

.onClick(() => this.pay());

}

}

}

在这个案例中,各模块之间通过接口和路由进行通信和跳转 。例如,在 goodsDetail 模块中,通过调用 cart 模块的添加商品接口,将商品添加到购物车;在 cart 模块和 goodsDetail 模块中,通过 router.pushUrl 方法跳转到 payment 模块进行支付操作 。这种多 Module 设计使得每个模块的职责清晰,代码结构更加简洁,易于维护和扩展 。如果需要添加新的功能,如优惠券模块、订单管理模块等,只需要创建新的模块,并与现有模块进行合理的交互即可 。

五、总结与展望

HarmonyOS 应用的多 Module 设计机制是一种创新且高效的应用开发架构,它以独特的模块划分方式、清晰的标识机制和有序的项目结构,为应用开发带来了诸多变革。通过将应用拆分成多个相对独立的模块,实现了功能的解耦、按需加载,大大提升了团队协作效率和应用的可维护性 。

在电商、社交、游戏等众多应用场景中,多 Module 设计机制都展现出了强大的适应性和优势,为开发者提供了更加灵活、高效的开发方式,也为用户带来了更优质的应用体验 。

随着 HarmonyOS 生态的不断发展壮大,多 Module 设计机制也将迎来更广阔的发展空间 。未来,我们有理由期待它在以下几个方面取得更大的突破:

技术创新:在动态加载技术方面,进一步优化加载速度和稳定性,实现模块的更快速、更可靠加载 。例如,通过改进网络传输协议和缓存机制,减少模块加载的时间延迟,确保在网络环境不稳定的情况下也能顺利加载模块 。在模块通信机制上,研发更加高效、安全的通信方式,降低模块间通信的开销,提高应用的整体性能 。比如,采用基于消息队列的异步通信方式,避免模块间的同步阻塞,提升应用的响应速度 。

生态融合:随着 HarmonyOS 设备种类的不断增加,多 Module 设计机制将更好地支持不同设备之间的协同工作 。开发者可以基于多 Module 设计,开发出能够在手机、平板、智能手表、智慧屏等多种设备上无缝运行的应用,实现真正的全场景覆盖 。例如,一个办公应用可以在手机上进行简单的文档查看和编辑,在平板上进行更复杂的排版和协作,在智慧屏上进行大屏展示和会议沟通,为用户提供一致且流畅的使用体验 。

应用拓展:多 Module 设计机制将助力 HarmonyOS 应用在更多领域实现创新和拓展 。在工业互联网领域,应用可以通过多 Module 设计,实现设备监控、数据分析、远程控制等功能的模块化开发,提高工业生产的智能化水平 。在医疗健康领域,医疗应用可以将患者信息管理、诊断辅助、远程医疗等功能拆分成不同模块,方便医疗机构根据自身需求进行定制化开发,提升医疗服务的质量和效率 。

© 版权声明
THE END
如果内容对您有所帮助,就支持一下吧!
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容