鴻蒙開發(fā)Hvigor插件動態(tài)生成代碼的操作方法
Hvigor允許開發(fā)者實現(xiàn)自己的插件,開發(fā)者可以定義自己的構(gòu)建邏輯,并與他人共享。Hvigor主要提供了兩種方式來實現(xiàn)插件:基于hvigorfile腳本開發(fā)插件、基于typescript項目開發(fā)。下面以基于hvigorfile腳本開發(fā)插件進行介紹。
基于hvigorfile腳本開發(fā)
基于hvigorfile.ts腳本開發(fā)的方式,其優(yōu)點是可實現(xiàn)快速開發(fā),直接編輯工程或模塊下hvigorfile.ts即可編寫插件代碼,不足之處是在多個項目中,無法方便的進行插件代碼的復(fù)用和共享分發(fā)。
- 導(dǎo)入模塊依賴。
// 導(dǎo)入接口
import { HvigorPlugin, HvigorNode } from '@ohos/hvigor'- 編寫插件代碼。
在hvigorfile.ts中定義插件方法,實現(xiàn)HvigorPlugin接口。
// 實現(xiàn)自定義插件
function customPlugin(): HvigorPlugin {
return {
pluginId: 'customPlugin',
apply(node: HvigorNode) {
// 插件主體
console.log('hello customPlugin!');
}
}
}- 在導(dǎo)出聲明中使用插件。
export default {
system: appTasks,
plugins:[
customPlugin() // 應(yīng)用自定義Plugin
]
}使用hvigorfile插件動態(tài)生成navigation防混淆文件
我們在使用navigation的系統(tǒng)路由表時,每次添加新頁面,都需要配置一下release環(huán)境防混淆。若將這些頁面放在一個固定的目錄下,則與我們的模塊化設(shè)計相違背,若命名使用固定的前綴或后綴,總感覺有點多余,手動一個一個的添加,雖然符合我們的代碼規(guī)范設(shè)計,但就是有點繁瑣。有沒有更方便的方式來處理這個混淆配置呢?
其實我們可以在寫一個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',
}到此這篇關(guān)于鴻蒙開發(fā)Hvigor插件動態(tài)生成代碼的文章就介紹到這了,更多相關(guān)鴻蒙開發(fā)Hvigor插件動態(tài)生成代碼內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
詳解inet_pton()和inet_ntop()函數(shù)
這篇文章主要介紹了inet_pton()和inet_ntop()函數(shù),本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2019-12-12
ant?design?vue?圖片預(yù)覽組件自定義樣式
這篇文章主要為大家介紹了ant?design?vue?圖片預(yù)覽組件自定義樣式方法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-03-03
win10 + anaconda3 + python3.6 安裝tensorflow + keras的步驟詳解
這篇文章主要介紹了win10 + anaconda3 + python3.6 安裝tensorflow + keras的步驟,需要的朋友可以參考下2019-09-09
RabbitMQ隊列中間件消息持久化?確認機制?死信隊列原理
這篇文章主要介紹了消息隊列中間件之RabbitMQ消息的持久化、確認機制、死信隊列原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-05-05

