@TOC
项目应用模块
简介
基于Stage模型开发应用之前,需要了解应用的设计机制,应用程序包结构等基础知识,用户应用程序指的是运行在设备的操作系统之上,为用户提供特定服务的程序,简称为“应用”,一个应用所对应的软件包文件称为“应用程序包”。
多Module设计机制
- 支持模块化开发:可以将一个庞大的项目拆分为很多的模块,每个模块负责自己独立业务,有利于分工协作,有利于我们项目功能划分和维护,每个模块还可以独立编译运行。他是鸿蒙系统提供的一种架构,按照指定模式来设计就能满足我们的项目设计要求。
- 支持多设备适配:每个模块独立开发,并且每个模块都可以设置支持的设备类型,应用开发完成后上架市场,根据你的
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分为Static和Shared`两种类型,编译后会生成共享包
Static Library:静态共享库。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。Shared Library:动态共享库。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。
实际上,Shared Library编译后除了会生成一个.hsp文件,还会生成一个.har文件。这个.har文件中包含了HSP对外导出的接口,应用中的其他模块需要通过.har文件来引用HSP的功能。为了表述方便,我们通常认为Shared Library编译后生成HSP。
HAR与HSP两种共享包的主要区别体现在:
HAR和HSP在APP包中的形态示意图
HAP模块
介绍
HAP:这种模块创建出来,可以代表独立的一个项目,这个模块打包后的后缀名为hap,可以独立运行到设备,也能独立上架应用市场。
步骤一、
步骤二、
步骤三、
选择
feature模块,项目开发允许多个feature模块,但是只允许一个entry模块,以后把地图,支付相关的一些功能独立出去放到这个模块中。多个模块之间是可以进行通信的。
HSP模块
介绍
HSP这个模块的type类型为shared,打包后的包名hsp格式,无法独立编译和运行,必须依赖于entry或者application模块来运行,任何一个模块都可以引入shared模块中的内容,当成就是公共共享模块,最大的特点在于多个模块引入shared模块内容,最终项目打包的时候只会生成一个HSP模块进行代码的共享。
步骤一、创建
步骤二、创建一个shared模块
一般在项目中只会创建一个
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属于第三方依赖。
-
在
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" } } -
运行依赖包,进行打包配置
步骤五、引入使用
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%')
}
}
步骤五、查看效果
HAR模块
介绍
Har和Hsp都是属于无法独立运行,但是可以将模块放在主模块中使用,har模块一旦被主模块或features模块使用,打包的时候独立一份代码放在对应的模块中,多个模块使用,打包多份文件,适用于存放项目中指定某些业务,从主模块中独立出来。
比如项目中可以将支付模块,购物车模块,商品列表独立为har,在页面中引入使用static library模块。
约束限制
- HAR不支持在设备上单独安装/运行,只能作为应用模块的依赖项被引用。
- HAR不支持在配置文件中声明ExtensionAbility组件,但支持UIAbility组件。
- HAR不支持在配置文件中声明pages页面,但是可以包含pages页面,并通过Navigation跳转的方式进行跳转。
- HAR不支持引用AppScope目录中的资源。在编译构建时,AppScope中的内容不会打包到HAR中,因此会导致HAR资源引用失败。
- HAR可以依赖其他HAR,但不支持循环依赖,也不支持依赖传递。
步骤一、
在项目目录下面创建一个文件夹features
步骤二、
选中features右键创建一个module
步骤三、
这个文件夹下面创建出来的模块全都是har模块
步骤四、
打开指定模块的module.json5文件
{
"module": {
"name": "home",
"type": "har",
"deviceTypes": [
"default",
"tablet",
"2in1"
]
}
}
官方推荐的三层目录架构
以后所有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"
}
}
主模块中引入使用
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%')
}
}
效果:
完结~