Harmonys多Module设计机制详解:构建高效的应用模块体系

131 阅读8分钟

@TOC

项目应用模块

简介

基于Stage模型开发应用之前,需要了解应用的设计机制,应用程序包结构等基础知识,用户应用程序指的是运行在设备的操作系统之上,为用户提供特定服务的程序,简称为“应用”,一个应用所对应的软件包文件称为“应用程序包”。

多Module设计机制

  1. 支持模块化开发:可以将一个庞大的项目拆分为很多的模块,每个模块负责自己独立业务,有利于分工协作,有利于我们项目功能划分和维护,每个模块还可以独立编译运行。他是鸿蒙系统提供的一种架构,按照指定模式来设计就能满足我们的项目设计要求。
  2. 支持多设备适配:每个模块独立开发,并且每个模块都可以设置支持的设备类型,应用开发完成后上架市场,根据你的module支持设备类型动态进行分配,比如pad打开应用市场看到的就是支持pad的软件或者指定的一些模块,打包后应用。

鸿蒙系统:1+8+n,你开发的软件可能会放在各种设备上运行,为了让应用能够再多设备上运行,提出的新的开发模式。

Module类型

Module按照使用场景可以分为两种类型:

Ability类型的Module:

可以独立编译,打包,运行,相当于一个公司的子公司,可以独立运行,也可以和总公司一起运行,对应到程序:电商项目主模块,物流信息:可以设计为子模块,这个模块在手机上和其他业务一起运行,也可以独立放在车机以及手表上面运行。

具体包含如下两种类型:

  • entry类型的Module:应用的主模块,包含应用的入口界面、入口图标和主功能特性,编译后生成entry类型的HAP。每一个应用分发到同一类型的设备上的应用程序包,只能包含唯一一个entry类型的HAP,也可以不包含。
  • feature类型的Module:应用的动态特性模块,编译后生成feature类型的HAP。一个应用中可以包含一个或多个feature类型的HAP,也可以不包含。

Library类型的Module

Library:实现代码和资源的共享,一个大项目可以拆分业务,放在每一个模块中运行,这些模块无法独立打包出来,必须依赖整个项目。帮助我们分工协作,也可以帮助我们项目业务拆分后的维护。 一个模块类似于一个独立的项目,项目中用到的公共工具或者代码,没有提取公共模块,每个模块需要重复写。

Library类型的Module分为StaticShared`两种类型,编译后会生成共享包

  • Static Library:静态共享库。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)
  • Shared Library:动态共享库。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)

实际上,Shared Library编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。为了表述方便,我们通常认为Shared Library编译后生成HSPHARHSP两种共享包的主要区别体现在: 多Module设计机制详解:构建高效的应用模块体系 HARHSPAPP包中的形态示意图 多Module设计机制详解:构建高效的应用模块体系

HAP模块

介绍

HAP:这种模块创建出来,可以代表独立的一个项目,这个模块打包后的后缀名为hap,可以独立运行到设备,也能独立上架应用市场。 多Module设计机制详解:构建高效的应用模块体系

步骤一、

多Module设计机制详解:构建高效的应用模块体系

步骤二、

多Module设计机制详解:构建高效的应用模块体系

步骤三、

多Module设计机制详解:构建高效的应用模块体系 选择feature模块,项目开发允许多个feature模块,但是只允许一个entry模块,以后把地图,支付相关的一些功能独立出去放到这个模块中。多个模块之间是可以进行通信的。

HSP模块

介绍

HSP这个模块的type类型为shared,打包后的包名hsp格式,无法独立编译和运行,必须依赖于entry或者application模块来运行,任何一个模块都可以引入shared模块中的内容,当成就是公共共享模块,最大的特点在于多个模块引入shared模块内容,最终项目打包的时候只会生成一个HSP模块进行代码的共享。 多Module设计机制详解:构建高效的应用模块体系

步骤一、创建

多Module设计机制详解:构建高效的应用模块体系

步骤二、创建一个shared模块

多Module设计机制详解:构建高效的应用模块体系 一般在项目中只会创建一个shared模块,名字common代表公共模块内容,以后工具包,公共组件都会存放在common模块中,其他的ability模块引入使用。

步骤三、查看common模块的类型

查看common模块的类型,在common\module.json5配置文件中

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

每个模块都可以引入这个common模块中的内容,但是最后打包的时候只会产生一份hsp代码,减少代码体积,以后修改了公共代码,其他页面都将直接修改。

步骤四、暴露公共代码

common里面写的代码基本上都是其他模块要用的公共代码,所以代码写完后将对应内容暴露出去,其他模块才能引用。

common/index.ets文件中,暴露出去方法和模块

export { add } from './src/main/ets/utils/Calc';
export { EmptyView } from "./src/main/ets/components/EmptyView"

只要在这个index文件中暴露出去指定组件,工具,插件等等,其他模块就可以使用。

第五步、entry模块加载common common是一个独立的模块,里面的内容如果需要使用,你要讲common模块引入到其他模块中,作为一个依赖项,其他模块在开发代码的时候,找对应某一个函数,先找自己本身有没有,没有内容找依赖项中有没有,oh_modules:存放自己的依赖和第三方的依赖比如common模块就是自己依赖,axios属于第三方依赖。

  1. oh_package.json5文件中引入依赖包

    {
      "modelVersion": "5.0.3",
      "description": "Please describe the basic information.",
      "dependencies": {
      },
      "devDependencies": {
        "@ohos/hypium": "1.0.21",
        "@ohos/hamock": "1.0.0",
        "@ohos/common": "file:./common"
      }
    }
    
    
  2. 运行依赖包,进行打包配置 多Module设计机制详解:构建高效的应用模块体系 多Module设计机制详解:构建高效的应用模块体系

步骤五、引入使用

import {add,EmptyView} from "@ohos/common"
@Entry
@Component
struct Index {
  @State message: string = 'Entry Index';
  aboutToAppear(): void {
    console.log(`${add(1,2)}`)
  }
  build() {
    Column() {
      Text(this.message).fontSize(20)
      EmptyView()
    }
    .height('100%')
    .width('100%')
  }
}

多Module设计机制详解:构建高效的应用模块体系 步骤五、查看效果 多Module设计机制详解:构建高效的应用模块体系

HAR模块

介绍

        HarHsp都是属于无法独立运行,但是可以将模块放在主模块中使用,har模块一旦被主模块或features模块使用,打包的时候独立一份代码放在对应的模块中,多个模块使用,打包多份文件,适用于存放项目中指定某些业务,从主模块中独立出来。         比如项目中可以将支付模块,购物车模块,商品列表独立为har,在页面中引入使用static library模块。

约束限制

  1. HAR不支持在设备上单独安装/运行,只能作为应用模块的依赖项被引用。
  2. HAR不支持在配置文件中声明ExtensionAbility组件,但支持UIAbility组件。
  3. HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过Navigation跳转的方式进行跳转。
  4. HAR不支持引用AppScope目录中的资源。在编译构建时,AppScope中的内容不会打包到HAR中,因此会导致HAR资源引用失败。
  5. HAR可以依赖其他HAR,但不支持循环依赖,也不支持依赖传递。

步骤一、

在项目目录下面创建一个文件夹features 多Module设计机制详解:构建高效的应用模块体系

步骤二、

选中features右键创建一个module 多Module设计机制详解:构建高效的应用模块体系 多Module设计机制详解:构建高效的应用模块体系

步骤三、

这个文件夹下面创建出来的模块全都是har模块 多Module设计机制详解:构建高效的应用模块体系

步骤四、

打开指定模块的module.json5文件

{
  "module": {
    "name": "home",
    "type": "har",
    "deviceTypes": [
      "default",
      "tablet",
      "2in1"
    ]
  }
}

官方推荐的三层目录架构

多Module设计机制详解:构建高效的应用模块体系 以后所有hap默认放在product,以后common就是hsp模块,用于存放公共的工具和代码,feature模块就是har模块,你可以将项目才分为无数个模块,独立管理

暴露和导入

暴露

homeLibrary中找到index.ets

export { MainPage } from './src/main/ets/components/MainPage';
导入

entry或者其他hap模块中一如指定homelibrary,在项目的oh_package.json文件中加入下面导入代码,并Run 'ohpm install'打包模块

{
  "modelVersion": "5.0.3",
  "description": "Please describe the basic information.",
  "dependencies": {
    "@ohos/common":"file:./common"
  },
  "devDependencies": {
    "@ohos/hypium": "1.0.21",
    "@ohos/hamock": "1.0.0",
    "@ohos/common":"file:./common",
    "@ohos/homeLibrary":"file:./features/home"
  }
}

多Module设计机制详解:构建高效的应用模块体系 多Module设计机制详解:构建高效的应用模块体系

主模块中引入使用
import { MainPage } from "@ohos/homeLibrary"
@Entry
@Component
struct Index {
  @State message: string = 'Entry Index';
  aboutToAppear(): void {
  }
  build() {
    Column() {
      Text(this.message).fontSize(20)
      MainPage()
    }
    .height('100%')
    .width('100%')
  }
}

多Module设计机制详解:构建高效的应用模块体系

效果:

多Module设计机制详解:构建高效的应用模块体系

完结~