鴻蒙開發(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)點是可實現(xiàn)快速開發(fā),直接編輯工程或模塊下hvigorfile.ts即可編寫插件代碼,不足之處是在多個項目中,無法方便的進(jìn)行插件代碼的復(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)文章
Atlassian系列產(chǎn)品及插件激活方法[JIRA8.19.0+]
Atlassian家有很多產(chǎn)品,都真的非常好用。比如公司使用JIRA做項目管理,使用Confluence做文檔、知識管理等(我個人用它來做筆記)。本文給大家分享Atlassian系列產(chǎn)品及插件激活方法[JIRA8.19.0+],感興趣的朋友參考下吧2021-12-12詳解SHA-256算法的原理以及C#和JS的實現(xiàn)
SHA-256 是 SHA-2 下細(xì)分出的一種算法。截止目前(2023-03)未出現(xiàn)“碰撞”案例,被視為是絕對安全的加密算法之一,本文主要介紹了SHA-256算法的原理以及C#和JS的實現(xiàn),希望對大家有所幫助2023-03-03細(xì)說ASCII、GB2312/GBK/GB18030、Unicode、UTF-8/UTF-16/UTF-32編碼
本文主要介紹了細(xì)說ASCII、GB2312/GBK/GB18030、Unicode、UTF-8/UTF-16/UTF-32編碼,詳細(xì)的介紹了這些編碼的知識,具有一定的參考價值,感興趣的可以了解一下2023-09-09C++/QT/Python/MATLAB獲取文件行數(shù)的示例詳解
這篇文章主要為大家學(xué)習(xí)介紹了如何利用C++、QT、Python、MATLAB分別實現(xiàn)獲取文件行數(shù)的功能,文中的示例代碼講解詳細(xì),需要的可以參考一下2023-08-08