鴻蒙開發(fā)Hvigor插件動態(tài)生成代碼

Hvigor允許開發(fā)者實現(xiàn)自己的插件暑始,開發(fā)者可以定義自己的構(gòu)建邏輯胧谈,并與他人共享。Hvigor主要提供了兩種方式來實現(xiàn)插件:基于hvigorfile腳本開發(fā)插件浪藻、基于typescript項目開發(fā)浙芙。下面以基于hvigorfile腳本開發(fā)插件進(jìn)行介紹登刺。

基于hvigorfile腳本開發(fā)

基于hvigorfile.ts腳本開發(fā)的方式,其優(yōu)點(diǎn)是可實現(xiàn)快速開發(fā)嗡呼,直接編輯工程或模塊下hvigorfile.ts即可編寫插件代碼纸俭,不足之處是在多個項目中,無法方便的進(jìn)行插件代碼的復(fù)用和共享分發(fā)南窗。

  1. 導(dǎo)入模塊依賴揍很。
// 導(dǎo)入接口
import { HvigorPlugin, HvigorNode } from '@ohos/hvigor'
  1. 編寫插件代碼。
    在hvigorfile.ts中定義插件方法万伤,實現(xiàn)HvigorPlugin接口女轿。
// 實現(xiàn)自定義插件
function customPlugin(): HvigorPlugin {
    return {
        pluginId: 'customPlugin',
        apply(node: HvigorNode) {
            // 插件主體
            console.log('hello customPlugin!');
        }
    }
}
  1. 在導(dǎo)出聲明中使用插件。
export default {
    system: appTasks,
    plugins:[
        customPlugin()  // 應(yīng)用自定義Plugin
    ]
}

使用hvigorfile插件動態(tài)生成navigation防混淆文件

我們在使用navigation的系統(tǒng)路由表時壕翩,每次添加新頁面,都需要配置一下release環(huán)境防混淆傅寡。若將這些頁面放在一個固定的目錄下放妈,則與我們的模塊化設(shè)計相違背,若命名使用固定的前綴或后綴荐操,總感覺有點(diǎn)多余芜抒,手動一個一個的添加,雖然符合我們的代碼規(guī)范設(shè)計托启,但就是有點(diǎn)繁瑣宅倒。有沒有更方便的方式來處理這個混淆配置呢?

其實我們可以在寫一個hvigorfilew插件來自動生成混淆配置文件屯耸。我們自定義一個HvigorPlugin任務(wù)拐迁,通過OhosHapContext對象讀取module.json5文件中的routerMap字段蹭劈,可以獲取系統(tǒng)路由表的名稱,再讀取profile目錄下的路由表线召。解析json文件內(nèi)存铺韧,并將頁面路徑寫到一個混淆文件中,這樣每次編譯時缓淹,自動生成防混淆文件哈打,我們只需要引入這個文件就可以了。示例如下

import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin'
import { HvigorPlugin, HvigorNode, FileUtil } from '@ohos/hvigor'

function parseRouterMap(): HvigorPlugin {
  return {
    pluginId: 'parseRouterMap',
    apply(node: HvigorNode) {
      const hapCtx = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext
      const moduleJson = hapCtx.getModuleJsonOpt()
      const routerMapName = moduleJson['module']['routerMap'].split(':')[1]
      const dir = hapCtx.getModulePath()
      const srcFile = FileUtil.pathResolve(dir, 'src', 'main', 'resources', 'base', 'profile', `${routerMapName}.json`)
      const json = FileUtil.readJson5(srcFile)
      const routerRuleFile = FileUtil.pathResolve(dir, 'obfuscation-router.txt')
      FileUtil.ensureFileSync(routerRuleFile)
      const routerMapArray = json['routerMap']
      let rules = '-keep-file-name\n'
      for (const element of routerMapArray) {
        const pageSourceFile = element['pageSourceFile']
        const path = pageSourceFile.substring(0, pageSourceFile.lastIndexOf('.'))
        rules += `${path}\n`
      }
      FileUtil.writeFileSync(routerRuleFile, rules)
    }
  }
}

export default {
  system: hapTasks,
  plugins:[parseRouterMap()]
}

編譯后會在entry目錄下生成obfuscation-router.txt防混淆文件讯壶,只要引入這個文件就可以了料仗。

使用hvigorfile插件動態(tài)生成navigation頁面枚舉名稱

我們在我們navigation的push跳轉(zhuǎn)到新頁面時,都得提前定義好系統(tǒng)路由表中的頁面name伏蚊,因為使用的name與系統(tǒng)路由表中定義的name不相同時立轧,跳轉(zhuǎn)頁面則會白屏。有了前面的經(jīng)驗丙挽,其它我們也可以動態(tài)生成一個ets文件肺孵,將系統(tǒng)路由表中的頁面名稱自動生成一個枚舉,這樣就不用每次配置系統(tǒng)路由表颜阐,還是復(fù)制一下名稱了平窘。例如我們的系統(tǒng)路由表是這樣的

{
  "routerMap": [
    {
      "name": "dialog",
      "pageSourceFile": "src/main/ets/pages/dialog/DialogPage.ets",
      "buildFunction": "dialogBuilder"
    },
    {
      "name": "web",
      "pageSourceFile": "src/main/ets/pages/web/WebPage.ets",
      "buildFunction": "webBuilder"
    },
    {
      "name": "login",
      "pageSourceFile": "src/main/ets/pages/login/LoginPage.ets",
      "buildFunction": "loginBuilder"
    }
  ]
}

我們現(xiàn)在實現(xiàn)一個hvigorfile插件,來解析系統(tǒng)路由表中的name字段凳怨,并生成對應(yīng)的枚舉值瑰艘。示例如下

import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin'
import { HvigorPlugin, HvigorNode, FileUtil } from '@ohos/hvigor'

function parseRouterMap(): HvigorPlugin {
  return {
    pluginId: 'parseRouterMap',
    apply(node: HvigorNode) {
      const hapCtx = node.getContext(OhosPluginId.OHOS_HAP_PLUGIN) as OhosHapContext
      const moduleJson = hapCtx.getModuleJsonOpt()
      const routerMapName = moduleJson['module']['routerMap'].split(':')[1]
      const dir = hapCtx.getModulePath()
      const srcFile = FileUtil.pathResolve(dir, 'src', 'main', 'resources', 'base', 'profile', `${routerMapName}.json`)
      const json = FileUtil.readJson5(srcFile)
      const routerMapFile = FileUtil.pathResolve(dir, 'src', 'main', 'ets', 'Pages.ets')
      FileUtil.ensureFileSync(routerMapFile)
      const routerMapArray = json['routerMap']
      let ss = ''
      for (const element of routerMapArray) {
        const name = element['name']
        ss += `  ${name} = '${name}',\n`
      }
      ss = `export enum Pages {\n${ss}}`
      FileUtil.writeFileSync(routerMapFile, ss)
    }
  }
}

export default {
  system: hapTasks,
  plugins:[parseRouterMap()]
}

我們在ets目錄下生成了一個Pages.ets文件,并將所有navigation頁面生成對應(yīng)的枚舉值肤舞,頁面跳轉(zhuǎn)時紫新,使用這些枚舉值就不怕出錯了。Pages.ets內(nèi)容如下

export enum Pages {
  dialog = 'dialog',
  web = 'web',
  login = 'login',
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末李剖,一起剝皮案震驚了整個濱河市芒率,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌篙顺,老刑警劉巖偶芍,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異德玫,居然都是意外死亡匪蟀,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門宰僧,熙熙樓的掌柜王于貴愁眉苦臉地迎上來材彪,“玉大人,你說我怎么就攤上這事《位” “怎么了嘁捷?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長穗泵。 經(jīng)常有香客問我普气,道長,這世上最難降的妖魔是什么佃延? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任现诀,我火速辦了婚禮,結(jié)果婚禮上履肃,老公的妹妹穿的比我還像新娘仔沿。我一直安慰自己,他們只是感情好尺棋,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布封锉。 她就那樣靜靜地躺著,像睡著了一般膘螟。 火紅的嫁衣襯著肌膚如雪成福。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天荆残,我揣著相機(jī)與錄音奴艾,去河邊找鬼。 笑死内斯,一個胖子當(dāng)著我的面吹牛蕴潦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播俘闯,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼潭苞,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了真朗?” 一聲冷哼從身側(cè)響起此疹,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎遮婶,沒想到半個月后秀菱,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡蹭睡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赶么。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肩豁。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出清钥,到底是詐尸還是另有隱情琼锋,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布祟昭,位于F島的核電站缕坎,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏篡悟。R本人自食惡果不足惜谜叹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望搬葬。 院中可真熱鬧荷腊,春花似錦、人聲如沸急凰。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽抡锈。三九已至疾忍,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間床三,已是汗流浹背一罩。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留勿璃,地道東北人擒抛。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像补疑,于是被迫代替她去往敵國和親歧沪。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容