鸿蒙开发新纪元:Hvigor插件助力代码自动化生成与高效开发

鸿蒙开发中使用Hvigor插件动态生成代码的操作方法,主要涉及基于hvigorfile脚本开发插件。以下是一个具体的操作步骤指南:

一、开发环境准备

确保已经搭建好鸿蒙开发环境,并安装了相关的开发工具,如DevEco Studio等。

二、Hvigor插件开发基础

  1. 了解Hvigor插件的两种实现方式
    • 基于hvigorfile脚本开发插件。
    • 基于TypeScript项目开发插件(本指南主要介绍基于hvigorfile脚本的方式)。
  2. 导入模块依赖
    在hvigorfile.ts中,需要导入Hvigor相关的接口和工具类。例如:
import { HvigorPlugin, HvigorNode } from '@ohos/hvigor';
import { hapTasks, OhosHapContext, OhosPluginId } from '@ohos/hvigor-ohos-plugin';
import { FileUtil } from '@ohos/hvigor';

三、编写插件代码

定义插件方法
在hvigorfile.ts中,定义一个实现HvigorPlugin接口的方法。例如:

    function customPlugin(): HvigorPlugin {
        return {
            pluginId: 'customPlugin',
            apply(node: HvigorNode) {
                // 插件主体逻辑
                console.log('hello customPlugin!');
            }
        };
    }

    使用插件
    在导出声明中使用定义的插件。例如:

    export default {
        system: hapTasks,
        plugins: [customPlugin()] // 应用自定义Plugin
    };

      四、动态生成代码示例

      以下是通过Hvigor插件动态生成代码的两个具体示例:

      1. 动态生成navigation防混淆文件
        • 自定义一个HvigorPlugin任务,通过OhosHapContext对象读取module.json5文件中的routerMap字段,获取系统路由表的名称。
        • 读取profile目录下的路由表,解析JSON文件内容。
        • 将页面路径写到一个混淆文件中,每次编译时自动生成防混淆文件。
        示例代码:
      function parseRouterMapForObfuscation(): HvigorPlugin {
          return {
              pluginId: 'parseRouterMapForObfuscation',
              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, 'entry', '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: [parseRouterMapForObfuscation()]
      };
      1. 动态生成navigation页面枚举名称
        • 自定义一个HvigorPlugin任务,解析系统路由表中的name字段。
        • 生成对应的枚举值,并写入一个ets文件中。
        示例代码:
      function generatePagesEnum(): HvigorPlugin {
          return {
              pluginId: 'generatePagesEnum',
              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: [generatePagesEnum()]
      };

      五、编译与验证

      1. 编译项目
        在DevEco Studio中,选择编译项目,查看编译输出是否包含生成的防混淆文件或枚举文件。
      2. 验证生成的代码
        检查生成的防混淆文件或枚举文件内容是否正确,确保插件按预期工作。

      通过以上步骤,你可以在鸿蒙开发中使用Hvigor插件动态生成代码,提高开发效率和代码质量。

      © 版权声明
      THE END
      喜欢就点个赞,支持一下吧!
      点赞82 分享
      评论 抢沙发
      头像
      欢迎您留下评论!
      提交
      头像

      昵称

      取消
      昵称表情代码图片

        暂无评论内容