鸿蒙开发Hvigor插件动态生成代码

Hvigor允许开发者实现自己的插件,开发者可以定义自己的构建逻辑,并与他人共享。Hvigor主要提供了两种方式来实现插件:基于hvigorfile脚本开发插件、基于typescript项目开发。下面以基于hvigorfile脚本开发插件进行介绍。

基于hvigorfile脚本开发

基于hvigorfile.ts脚本开发的方式,其优点是可实现快速开发,直接编辑工程或模块下hvigorfile.ts即可编写插件代码,不足之处是在多个项目中,无法方便的进行插件代码的复用和共享分发。

  1. 导入模块依赖。
// 导入接口
import { HvigorPlugin, HvigorNode } from '@ohos/hvigor'
  1. 编写插件代码。
    在hvigorfile.ts中定义插件方法,实现HvigorPlugin接口。
// 实现自定义插件
function customPlugin(): HvigorPlugin {return {pluginId: 'customPlugin',apply(node: HvigorNode) {// 插件主体console.log('hello customPlugin!');}}
}
  1. 在导出声明中使用插件。
export default {system: appTasks,plugins:[customPlugin()  // 应用自定义Plugin]
}

使用hvigorfile插件动态生成navigation防混淆文件

我们在使用navigation的系统路由表时,每次添加新页面,都需要配置一下release环境防混淆。若将这些页面放在一个固定的目录下,则与我们的模块化设计相违背,若命名使用固定的前缀或后缀,总感觉有点多余,手动一个一个的添加,虽然符合我们的代码规范设计,但就是有点繁琐。有没有更方便的方式来处理这个混淆配置呢?

其实我们可以在写一个hvigorfilew插件来自动生成混淆配置文件。我们自定义一个HvigorPlugin任务,通过OhosHapContext对象读取module.json5文件中的routerMap字段,可以获取系统路由表的名称,再读取profile目录下的路由表。解析json文件内存,并将页面路径写到一个混淆文件中,这样每次编译时,自动生成防混淆文件,我们只需要引入这个文件就可以了。示例如下

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 OhosHapContextconst 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插件动态生成navigation页面枚举名称

我们在我们navigation的push跳转到新页面时,都得提前定义好系统路由表中的页面name,因为使用的name与系统路由表中定义的name不相同时,跳转页面则会白屏。有了前面的经验,其它我们也可以动态生成一个ets文件,将系统路由表中的页面名称自动生成一个枚举,这样就不用每次配置系统路由表,还是复制一下名称了。例如我们的系统路由表是这样的

{"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"}]
}

我们现在实现一个hvigorfile插件,来解析系统路由表中的name字段,并生成对应的枚举值。示例如下

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 OhosHapContextconst 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页面生成对应的枚举值,页面跳转时,使用这些枚举值就不怕出错了。Pages.ets内容如下

export enum Pages {dialog = 'dialog',web = 'web',login = 'login',
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/60699.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

蓝桥杯c++算法秒杀【6】之动态规划【上】(数字三角形、砝码称重(背包问题)、括号序列、组合数问题:::非常典型的必刷例题!!!)

下将以括号序列、组合数问题超级吧难的题为例子讲解动态规划 别忘了请点个赞收藏关注支持一下博主喵!!!! ! ! ! ! 关注博主,更多蓝桥杯nice题目静待更新:) 动态规划 一、数字三角形 【问题描述】 上图给出了一…

YOLO-FaceV2: A Scale and Occlusion Aware Face Detector

《YOLO-FaceV2:一种尺度与遮挡感知的人脸检测器》 1.引言2.相关工作3.YOLO-FaceV23.1网络结构3.2尺度感知RFE模型3.3遮挡感知排斥损失3.4遮挡感知注意力网络3.5样本加权函数3.6Anchor设计策略3.7 归一化高斯Wasserstein距离 4.实验4.1 数据集4.2 训练4.3 消融实验4.3.1 SEAM块4…

Python 虚拟环境使用指南

Python 虚拟环境使用指南 博客 一、创建虚拟环境 在开始使用Python虚拟环境之前,我们需要先创建一个新的虚拟环境。 1. 基础创建流程 首先,进入您的项目目录: cd path\to\your\project然后使用以下命令创建虚拟环境: pytho…

【SQL Server】华中农业大学空间数据库实验报告 实验三 数据操作

1.实验目的 熟悉了解掌握SQL Server软件的基本操作与使用方法,以及通过理论课学习与实验参考书的帮助,熟练掌握使用T-SQL语句和交互式方法对数据表进行插入数据、修改数据、删除数据等等的操作;作为后续实验的基础,根据实验要求重…

深入解析自校正控制(STC)算法及python实现

目录 深入解析自校正控制(STC)算法第一部分:自校正控制算法概述1.1 什么是自校正控制1.2 自校正控制的核心思想1.3 STC 的应用场景1.4 STC 的分类第二部分:自校正控制算法的数学基础2.1 动态系统模型2.2 参数辨识方法2.3 控制器设计2.4 稳定性分析第三部分:Python 实现自校…

Linux 正则表达式(basic and extened)

正则表达式(Regular Expressions),整理自: https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap09.html gred sed 定义 Regular Expressions (REs) provide a mechanism to select specific strings from a set of character strings.…

【创建型设计模式】单例模式

【创建型设计模式】单例模式 这篇博客接下来几篇都将阐述设计模式相关内容。 接下来的顺序大概是:单例模式、工厂方法模式、抽象工厂模式、建造者模式、原型模式。 一、什么是单例模式 单例模式是一种创建型设计模式,它保证一个类仅有一个实例&#…

【Elasticsearch入门到落地】2、正向索引和倒排索引

接上篇《1、初识Elasticsearch》 上一篇我们学习了什么是Elasticsearch,以及Elastic stack(ELK)技术栈介绍。本篇我们来什么是正向索引和倒排索引,这是了解Elasticsearch底层架构的核心。 上一篇我们学习到,Elasticsearch的底层是由Lucene实…

【Spring Boot】# 使用@Scheduled注解无法执行定时任务

1. 前言 在 Spring Boot中,使用Scheduled注解来定义定时任务时,定时任务不执行;或未在规定时间执行。 import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component;Component public c…

Ubuntu24.04下的docker问题

按官网提示是可以安装成功的,但是curl无法使用https下载,会造成下述语句执行失败 # Add Dockers official GPG key: sudo apt-get update sudo apt-get install ca-certificates curl sudo install -m 0755 -d /etc/apt/keyrings sudo curl -fsSL https…

STM32总体架构简单介绍

目录 一、引言 二、STM32的总体架构 1、三个被动单元 (1)内部SRAM (2)内部闪存存储器 (3)AHB到APB的桥(AHB to APBx) 2、四个主动(驱动)单元 &#x…

el-input绑定点击回车事件意外触发页面刷新

小伙伴们在项目中应该还是比较常用键盘指定按键事件的&#xff0c;尤其是一些筛选条件的通过点击键盘回车按键去触发搜索 例如&#xff1a; <el-form><el-form-item label条件title><el-input v-modelformData.searchKey keydown.entersearch></el-input…

C# Postman或者PostApi调试前端webapi接口发送带有request/body/head信息

知识&#xff1a; 前端接口&#xff0c;表单形式提交。 req.ContentType "application/x-www-form-urlencoded"; x-www-form-urlencoded 是一种常见的 MIME 类型&#xff0c;用于将键值对编码为 HTTP 请求体中的 URL 编码格式。在 Web API 中&#xff0c;x-www-for…

李宏毅机器学习课程知识点摘要(1-5集)

前5集 过拟合&#xff1a; 参数太多&#xff0c;导致把数据集刻画的太完整。而一旦测试集和数据集的关联不大&#xff0c;那么预测效果还不如模糊一点的模型 所以找的数据集的量以及准确性也会影响 由于线性函数的拟合一般般&#xff0c;所以用一组函数去分段来拟合 sigmoi…

CentOS:A服务器主动给B服务器推送(上传),B服务器下载A服务器文件(下载)

Linux:常识(bash: ip command not found )_bash: ip: command not found-CSDN博客 rsync 中断后先判断程序是否自动重连:ps aux | grep rsync 查看目录/文件是否被使用(查询线程占用):lsof /usr/local/bin/mongodump/.B_database1.6uRCTp 场景:MongoDB中集合非常大需要…

七、SElinux

一、SElinux简介 SELinux是Security-Enhanced Linux的缩写&#xff0c;意思是安全强化的linuxSELinux 主要由美国国家安全局(NSA)开发&#xff0c;当初开发的目的是为了避免资源的误用传统的访问控制在我们开启权限后&#xff0c;系统进程可以直接访问当我们对权限设置不严谨时…

opencv相关报错

官网 报错&#xff1a; ./smart_car_camera ./smart_car_camera: error while loading shared libraries: libpython3.8.so.1.0: cannot open shared object file: No such file or directory 一、 解决方法&#xff1a; 安装 mlocate 工具&#xff0c;这样才能使用 update…

小程序25- iconfont 字体图标的使用

项目中使用到图标&#xff0c;一般由公司设计进行设计&#xff0c;设计好后上传到阿里巴巴矢量图标库 日常开发过程中&#xff0c;也可以通过 iconfont 图标库下载使用自带的图标 补充&#xff1a;使用 iconfont 图标库报错&#xff1a;Failed to load font 操作步骤&#xff…

鸢尾花植物的结构认识和Python中scikit-learn工具包的安装

鸢尾花植物的结构认识和Python中scikit-learn工具包的安装 鸢尾花植物的结构认识和Python中scikit-learn工具包的安装 鸢尾花植物的结构认识和Python中scikit-learn工具包的安装一、鸢尾花的认识1.1 对花结构和功能认识1.2、鸢尾花认识1.2.1 鸢尾花种类1.2.2 鸢尾花结构 二. Py…

[Unity]在TileMap上控制Camera移动、缩放

环境&#xff1a; unity2021.3.14f1c1Camera类型OrthographicTileMap为XY方向摆放 功能&#xff1a; 单点触摸或鼠标操作移动Camera。使用BoxCollider2D控制地图范围。鼠标滚轮或多点触摸控制缩放。缩放维持中心点在屏幕的固定位置。 代码&#xff1a; using System; usin…