組件化一直是移動(dòng)端比較流行的開發(fā)方式,有著編譯運(yùn)行快,業(yè)務(wù)邏輯分明,任務(wù)劃分清晰等優(yōu)點(diǎn),針對(duì)Android端的組件化;與Android端的組件化相比,HarmonyOS的組件化可以說實(shí)現(xiàn)起來就頗費(fèi)一番周折,因?yàn)?a target="_blank">HarmonyOS經(jīng)過更新迭代之后,最新的開發(fā)方式已經(jīng)和之前兼容AOSP階段有著很大的區(qū)別,基于最新的Api9,以及采用全新的ArkTs語言的開發(fā)方式,想實(shí)現(xiàn)組件化,就需要另謀途徑。
在以往的Android組件化實(shí)現(xiàn)中,我們直接可以在gradle里進(jìn)行自定義配置相關(guān)參數(shù),執(zhí)行application和library,以及其他的參數(shù)信息,來實(shí)現(xiàn)一個(gè)可運(yùn)行模塊和依賴模塊的動(dòng)態(tài)轉(zhuǎn)換,這是非常方便的,但是,在HarmonyOS中,構(gòu)建文件中,除了使用系統(tǒng)配置的之外,是不支持自定義的,起碼當(dāng)前是不支持的,也就是說,我們無法通過在構(gòu)建里來實(shí)現(xiàn)組件化運(yùn)行的切換。
這就在一定程度上阻礙了組件化的配置,雖然我們可以按照動(dòng)態(tài)包的模式,拆分出獨(dú)立的業(yè)務(wù)模塊,形成模塊化開發(fā),但是在業(yè)務(wù)邏輯復(fù)雜的項(xiàng)目,很多的模塊,同時(shí)編譯運(yùn)行,無疑來說是耗時(shí)的,遠(yuǎn)遠(yuǎn)比不上組件化方式的開發(fā)效率,基于此,能夠探索出組件化的可行性,確實(shí)是很有必要的。
本文的大致如下:
1、模塊化的拆分與設(shè)計(jì)
2、模塊化向組件化切換
3、鴻蒙項(xiàng)目如何實(shí)現(xiàn)組件化
4、使用腳本快速實(shí)現(xiàn)組件化運(yùn)行
5、腳本地址和相關(guān)總結(jié)
一、模塊化的拆分與設(shè)計(jì)
模塊化,簡(jiǎn)而言之,就是把項(xiàng)目中獨(dú)立的業(yè)務(wù)模塊抽取出來,單獨(dú)創(chuàng)建一個(gè)模塊。
原始的開發(fā)方式,我們都會(huì)把所有的代碼,所有的業(yè)務(wù),放在一個(gè)模塊下,以至于導(dǎo)致,此模塊,代碼越來越多,業(yè)務(wù)越來越繁雜,不利于人員的維護(hù),也不利于項(xiàng)目的可移植和健壯,最大的不便在于,后續(xù)一旦有同樣功能的項(xiàng)目,不能第一時(shí)間拿來復(fù)用,為解決以上的問題,便有了模塊化。
具體在項(xiàng)目中,需要把哪些功能抽取成一個(gè)單獨(dú)的模塊,需要具體問題具體分析,但有一個(gè)潛在的宗旨,那就是,必須業(yè)務(wù)獨(dú)立,比如項(xiàng)目中的用戶信息模塊,商城模塊,再比如底層的網(wǎng)絡(luò)請(qǐng)求模塊,數(shù)據(jù)庫操作模塊等等,只有業(yè)務(wù)獨(dú)立,才能方便后續(xù)的復(fù)用。
當(dāng)然了,有一個(gè)前提,大家必須明確,那就是后續(xù)的組件化是在模塊化的基礎(chǔ)上,只是增加了單模塊可以運(yùn)行的能力。
如下圖所示,是基于API9和ArkTs語言,設(shè)計(jì)的模塊化。
以上只是一個(gè)通用的場(chǎng)景,在實(shí)際的開發(fā)中,大家可以按照實(shí)際的業(yè)務(wù)進(jìn)行修改,比如省略聚合層,直接讓中間層依賴基礎(chǔ)庫層,又或者,中間層直接依賴底層的sdk等等,靈活多變即可。
entry,作為我們的主模塊,是單獨(dú)可以運(yùn)行的,除了這個(gè)模塊之外,其他的所有模塊均不可運(yùn)行,只能被作為依賴項(xiàng)使用。
從上圖中,大家可以發(fā)現(xiàn),存在基礎(chǔ)庫一層,此層的作用,主要封裝了基礎(chǔ)能力,比如網(wǎng)絡(luò),數(shù)據(jù)操作,日志工具類,列表加載等等,目的是顯而易見的,就是為了便于拓展和后續(xù)的復(fù)用,因?yàn)檫@些能力是統(tǒng)一的,是每個(gè)項(xiàng)目都或多或少都是需要的,前期封裝好之后,無論后續(xù)多少個(gè)項(xiàng)目,我們都可以直接拿來用。
聚合層,它的作用,是把多個(gè)基礎(chǔ)庫,包裝成一個(gè)整體的庫,更方便上層的調(diào)用,但缺點(diǎn)也是很明顯的,有些可能上層用不到的基礎(chǔ)庫也被添加進(jìn)來了,造成包體積的增大,還有就是,基礎(chǔ)庫某個(gè)更新之后,聚合層也需要更新;所以基于此,在實(shí)際的開發(fā)中,大家也可以省略這一層,直接讓中間層和基礎(chǔ)庫層進(jìn)行對(duì)接。
中間層(common),一些公用的資源或者類的存放地,也作為各模塊數(shù)據(jù)傳遞的一個(gè)紐帶,它做為一個(gè)樞紐,是業(yè)務(wù)各模塊的必依賴項(xiàng)。
業(yè)務(wù)模塊,沒什么好說的,是業(yè)務(wù)層各個(gè)單獨(dú)的業(yè)務(wù)組件。
相關(guān)的模塊化拆分如下的項(xiàng)目所示:
二、模塊化向組件化切換
在上述的模塊化中,我們知道組件化和模塊化是類似的,只不過多了一個(gè)獨(dú)立運(yùn)行的功能,別小看這個(gè)獨(dú)立運(yùn)行的能力,在實(shí)際的開發(fā)中,能大大減少我們的編譯時(shí)間,提高我們的開發(fā)效率,畢竟全部編譯和局部編譯,還是有著很大的差距。
在模塊化中,只有entry主模塊是能夠獨(dú)立運(yùn)行的,如果向組件化進(jìn)行切換,意味著業(yè)務(wù)中每個(gè)獨(dú)立的模塊都可以運(yùn)行,如下結(jié)構(gòu)圖:
也就是把業(yè)務(wù)模塊,需要做成動(dòng)態(tài)設(shè)置,組件化時(shí),類型是entry可運(yùn)行狀態(tài),非組件化時(shí),類型是shared,也就是動(dòng)態(tài)包方式,不可運(yùn)行。
三、鴻蒙項(xiàng)目如何實(shí)現(xiàn)組件化
經(jīng)過上一節(jié)的概述,實(shí)現(xiàn)組件化就非常的簡(jiǎn)單了,無非就是業(yè)務(wù)模塊的類型entry和shared切換即可,可是實(shí)際操作之后,缺發(fā)現(xiàn),不是僅僅修改一個(gè)類型便可以搞定的。
由于可運(yùn)行組件和動(dòng)態(tài)包有著很大的區(qū)別,如果想要把動(dòng)態(tài)包改為可運(yùn)行,那么所有的配置信息都要和運(yùn)行組件保持一致,經(jīng)過仔細(xì)地比對(duì)之后,發(fā)現(xiàn)有三處不同,分別如下:
開發(fā)環(huán)境
鴻蒙開發(fā)指南[docs.qq.com/doc/DUmN4VVhBd3NxdExK
]
或者+mau123789是v可直接添加拿
DevEco Studio 4.0 Beta2,Build Version: 4.0.0.400
Api版本:9
hvigorVersion:3.0.2
如果你的開發(fā)環(huán)境和以上不一致,那么幾處文件的不同之處也會(huì)不一樣,只需要改為你環(huán)境下的可運(yùn)行模塊也就是entry下的即可。
1、hvigorfile.ts不同
主模塊(entry,可運(yùn)行)
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. */
}
普通模塊(動(dòng)態(tài)包,不可運(yùn)行)
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. */
}
2、module.json5不同
主模塊(entry,可運(yùn)行)
{
"module": {
"name": "entry",
"type": "entry",
"description": "$string:module_desc",
"mainElement": "EntryAbility",
"deviceTypes": [
"phone",
"tablet"
],
"deliveryWithInstall": true,
"installationFree": false,
"pages": "$profile:main_pages",
"abilities": [
{
"name": "EntryAbility",
"srcEntry": "./ets/entryability/EntryAbility.ts",
"description": "$string:EntryAbility_desc",
"icon": "$media:icon",
"label": "$string:EntryAbility_label",
"startWindowIcon": "$media:icon",
"startWindowBackground": "$color:start_window_background",
"exported": true,
"skills": [
{
"entities": [
"entity.system.home"
],
"actions": [
"action.system.home"
]
}
]
}
]
}
}
普通模塊(動(dòng)態(tài)包,不可運(yùn)行)
{
"module": {
"name": "mine",
"type": "shared",
"description": "$string:shared_desc",
"deviceTypes": [
"phone",
"tablet"
],
"deliveryWithInstall": true,
"pages": "$profile:main_pages"
}
}
3、缺少入口ability
普通的動(dòng)態(tài)包是沒有Ability,這就導(dǎo)致的,無入口配置。
主模塊(entry,可運(yùn)行)
普通模塊(動(dòng)態(tài)包,不可運(yùn)行)
只需要把以上的三處不同更改之后,便可以達(dá)到組件的單獨(dú)運(yùn)行,需要注意的是,更改完之后,一定記得清除緩存,清除之前的配置信息,方可運(yùn)行成功。
雖然手動(dòng)更改能達(dá)到組件的運(yùn)行目標(biāo),但會(huì)有一個(gè)潛在的問題,那就很影響開發(fā)效率,你需要在可運(yùn)行和不可運(yùn)行兩種狀態(tài)下不停的進(jìn)行切換,那么就需要不斷地進(jìn)行更改這三處文件,是非常繁瑣的,不過,后續(xù)經(jīng)過自己的摸索,開發(fā)了一個(gè)動(dòng)態(tài)修改配置信息的腳本,使用腳本,便可很簡(jiǎn)單的進(jìn)行切換。
四、使用腳本快速實(shí)現(xiàn)組件化運(yùn)行
鴻蒙的項(xiàng)目不像Android端,可以在gradle進(jìn)行腳本的編寫,所以無法很方便的進(jìn)行組件化的實(shí)現(xiàn),雖然不能配置腳本文件,但是能否借助外部的腳本來動(dòng)態(tài)的進(jìn)行組件化的切換呢?顯然是可以的,在HarmonyOS開始階段,環(huán)境配置我們使用到了NodeJs,那么我們就可以通過NodeJs來開發(fā)相關(guān)腳本。
腳本沒什么難的,只解決一個(gè)問題,那就是把手動(dòng)需要改的文件,改為程序去改,減少錯(cuò)誤率和提高開發(fā)效率。
下載腳本之后,有三個(gè)文件,如下圖所示,把文件復(fù)制到根項(xiàng)目下即可。
module.harmony:主要配置文件,所有的配置都在這里,以后的使用,也只要更改這一個(gè)文件即可。
#組件化配置文件
#是否開啟組件化
startModule=true
#開啟的組件名字,開啟后,當(dāng)前的組件可以獨(dú)立運(yùn)行
startModuleName=
#上述組件開啟后,其他非必要組件是否改為動(dòng)態(tài)包模式,默認(rèn)不改變
startOtherShared=false
#過濾組件名字,永遠(yuǎn)不會(huì)獨(dú)立運(yùn)行,以應(yīng)為逗號(hào)作為分割
filterModuleName=
#當(dāng)前腳本默認(rèn)加載的頁面,默認(rèn)不填是Index.ets
loadPage=
module.js:腳本邏輯文件,主要進(jìn)行組件化的內(nèi)容之間的切換。
package.json:一些配置信息,用于執(zhí)行。
module.harmony文件介紹
三個(gè)文件復(fù)制到根項(xiàng)目下之后,當(dāng)然了你也可以復(fù)制到其他地方,只關(guān)注module.harmony這一個(gè)文件即可,以后所有的操作都在這里進(jìn)行配置。
module.harmony文件里最重要的就兩個(gè)參數(shù),一個(gè)是startModule,一個(gè)是startModuleName;startModule用于是否開啟組件化,startModuleName是負(fù)責(zé)開啟哪個(gè)組件,兩個(gè)是結(jié)合使用的。當(dāng)startModule為true,自動(dòng)就會(huì)把startModuleName的值對(duì)應(yīng)的組件,改為可運(yùn)行狀態(tài),當(dāng)startModule為false,就只保留entry模塊為可運(yùn)行狀態(tài),其他均為不可運(yùn)行。
startOtherShared這個(gè)參數(shù),主要用于是否要把startModuleName對(duì)應(yīng)的組件之外的所有組件(不包含entry和過濾組件),改為動(dòng)態(tài)包模式,比如A模塊改為可運(yùn)行組件之后,又想把B模塊改為可運(yùn)行組件,這時(shí),是否要把A改回去,也就是動(dòng)態(tài)包不可運(yùn)行狀態(tài)。
filterModuleName參數(shù)沒啥好說的,如果項(xiàng)目中有固定狀態(tài)的模塊,就可以配置其中。
loadPage參數(shù),默認(rèn)配置的是Index.ets,沒有會(huì)自動(dòng)創(chuàng)建,如果你有默認(rèn)的頁面,可以配置這里,運(yùn)行組件后,會(huì)展示你配置的頁面。
腳本運(yùn)行
每次更改完配置文件module.harmony后,在當(dāng)前項(xiàng)目的根目錄下執(zhí)行如下的命令即可。
npm run module
五、腳本地址和相關(guān)總結(jié)
腳本開發(fā)環(huán)境:
DevEco Studio 4.0 Beta2,Build Version: 4.0.0.400
Api版本:9
hvigorVersion:3.0.2
目前的組件化方式,和Android端的組件化有些類似,如果你的項(xiàng)目很龐大,比如,項(xiàng)目里也有很多獨(dú)立的小功能,類似美團(tuán)App中的,外賣,騎車等,那么我們就可以采取多hap的結(jié)構(gòu)開發(fā),目前鴻蒙是支持的,這種應(yīng)用是獨(dú)立的,隔離的;如果所有的模塊都有著一定的耦合,關(guān)聯(lián),一個(gè)主模塊和多個(gè)動(dòng)態(tài)模塊的形式,建議還是以文中組件化的方式開發(fā),可以大大提高你的編譯速度。
審核編輯 黃宇
-
Android
+關(guān)注
關(guān)注
12文章
3936瀏覽量
127413 -
HarmonyOS
+關(guān)注
關(guān)注
79文章
1975瀏覽量
30201 -
鴻蒙OS
+關(guān)注
關(guān)注
0文章
188瀏覽量
4396
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論