HarmonyOS鸿蒙开发( Beta5版)Navigation组件常规加载与动态加载

news2024/9/21 20:27:49

简介

应用在加载页面时,如果引入暂时不需要加载的模块,会导致页面加载缓慢和不必要的内存占用。例如当页面使用Navigation组件时,主页默认加载子页面,此时若子页面使用了Web组件,则会提前加载Web相关的so库,即使并没有进入子页面。 本文推荐使用动态加载解决上述问题,不在进入主页面时就将所有模块都加载进来,而是按需加载模块,增加应用灵活性,提升应用性能。

场景示例

场景示例图

下面示例应用通过Navigation组件常规加载与动态加载的对比,介绍如何在跳转时触发加载方法,实现按需加载子模块。

常规加载

开发者使用Navigation组件时,通常会在主页引入子页面组件,在按钮中添加方法实现跳转。下述代码展示常规加载示例,通过import引入子组件。

  1. 创建子页面,添加一个Web组件,并加载一个在线的H5页面。

    import { webview } from '@kit.ArkWeb'
    
    @Builder
    export function buildPage() {
      WebViewPage()
    }
    
    @Component
    export struct WebViewPage {
      webController: WebviewController = new webview.WebviewController();
      url: string = 'https://gitee.com/harmonyos-cases/cases';
    
      aboutToAppear(): void {
        webview.WebviewController.initializeWebEngine();
        webview.WebviewController.prepareForPageLoad(this.url, true, 2);
      }
    
      build() {
        Column() {
          Web({ src: this.url, controller: this.webController })
        }
      }
    }

  2. 在主页面的Navigation中添加跳转到子页面的代码。

    import { WebViewPage } from './WebViewPage'
    
    @Entry
    @Component
    export struct Page1 {
      pageStack: NavPathStack = new NavPathStack();
    
      @Builder
      pageMap() {
        NavDestination() {
          WebViewPage()
        }
      }
    
      build() {
        Stack() {
          Navigation(this.pageStack) {
            Column() {
              Button('加载页面')
                .onClick(() => {
                  this.pageStack.pushPath({ name: "" })
                })
                .margin({
                  top:30
                })
            }
            .height('100%')
            .width('100%')
          }.navDestination(this.pageMap)
        }
      }
    }

编译运行后,通过DevEco Studio中的Profiler工具抓取Trace,可以得到图1。通过图中泳道可以看到,主页面加载完成共耗时22.9ms(从DispatchTouchEvent标签到sendCommands标签,即从点击进入页面到通知系统开始渲染页面)。其中,load page标签表示加载整个页面的时间,共耗时19ms。继续向下可以看到,虽然主页面并没有使用Web组件,但是依旧加载了libwebview_napi.z.so,耗时大概12ms左右。如果用户只是在主页面停留,并没有继续进入子页面,那么这个so库的初始化就是没有必要的,但是依旧产生了耗时,并且占用了一部分的内存,会降低应用的性能。

图1 常规加载主页面泳道图

image-20240725204758662

动态加载

由于Navigation组件一次性加载所有模块,使用常规加载会导致主页加载耗时变长。为了减少主页面加载耗时,可以使用动态加载,在实际页面跳转时再按需动态引入子组件,优化用户的首次加载速度体验。下面将使用动态import的方式实现常规加载的功能。

@Entry
@Component
export struct Page2 {
  pageStack: NavPathStack = new NavPathStack();
  @BuilderParam page: ESObject;

  @Builder
  pageMap() {
    NavDestination() {
      this.page();
    }
  }

  build() {
    Navigation(this.pageStack) {
      Column() {
        Button('加载页面')
          .onClick(async () => {
            import('./WebViewPage').then((result: ESObject) => {
              this.page = result.buildPage;
              this.pageStack.pushPath({ name: '' })
            })
          })
          .margin({
            top: 30
          })
      }
      .height('100%')
      .width('100%')
    }
    .navDestination(this.pageMap)
  }
}

通过代码可以看到,在主页面中并没有直接import子页面,而是在点击事件中使用了动态import的方式加载子页面,再通过NavPathStack.pushPath方法进行了跳转。编译运行后,通过DevEco Studio中的Profiler工具抓取Trace,可以得到图2。通过图中泳道可以看到,使用动态import后,主页面加载耗时只有7.9ms。相较于常规加载,耗时减少了15ms。

继续查看下面的泳道,可以发现相较于常规加载,并没有加载libwebview_napi.z.so的耗时,而是直接开始创建主页中的组件(Build[page]标签)。因为代码里没有直接使用import引入子页面,而是通过动态import的方式将加载子页面的逻辑放在了点击事件里面。只有在进入子页面时才会触发WebView库的加载,如图3所示,实现了按需加载,减少了主页面不必要的耗时和内存占用。

图2 动态加载主页面泳道图

di1

图3 动态加载子页面泳道图

di2

性能对比

主页面加载耗时主页面so加载耗时
常规加载22.9ms12ms
动态加载7.9ms0ms

总结

通过上面的示例可以看到,使用动态import能够更灵活地按需加载子页面,减少主页面的加载耗时,提升应用性能和用户体验。当子页面不会被马上使用或者可能占用大量内存时,可以通过动态import的方式进行性能方面的优化。

最后

小编在之前的鸿蒙系统扫盲中,有很多朋友给我留言,不同的角度的问了一些问题,我明显感觉到一点,那就是许多人参与鸿蒙开发,但是又不知道从哪里下手,因为资料太多,太杂,教授的人也多,无从选择。有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)文档用来跟着学习是非常有必要的。 

为了确保高效学习,建议规划清晰的学习路线,涵盖以下关键阶段:

希望这一份鸿蒙学习文档能够给大家带来帮助~


 鸿蒙(HarmonyOS NEXT)最新学习路线

该路线图包含基础技能、就业必备技能、多媒体技术、六大电商APP、进阶高级技能、实战就业级设备开发,不仅补充了华为官网未涉及的解决方案

路线图适合人群:

IT开发人员:想要拓展职业边界
零基础小白:鸿蒙爱好者,希望从0到1学习,增加一项技能。
技术提升/进阶跳槽:发展瓶颈期,提升职场竞争力,快速掌握鸿蒙技术

2.视频教程+学习PDF文档

(鸿蒙语法ArkTS、TypeScript、ArkUI教程……)

 纯血版鸿蒙全套学习文档(面试、文档、全套视频等)

                   

鸿蒙APP开发必备

​​

总结

参与鸿蒙开发,你要先认清适合你的方向,如果是想从事鸿蒙应用开发方向的话,可以参考本文的学习路径,简单来说就是:为了确保高效学习,建议规划清晰的学习路线

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

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

相关文章

Mybatis:基础巩固-DQL

目录 一、概述二、数据准备三、基础查询四、条件查询五、聚合函数六、分组查询七、排序查询八、分页查询九、DQL执行顺序 一、概述 主要用于对数据的查询操作,使用的关键字SELECT SELECT 字段列表 FROM 表名 WHERE 条件列表 GROUP BY 分组字段 HAVING 分组后条件列表…

Renesa Version Board和微信小程序通信

目录 概述 1. 系统框架结构 1.1 功能介绍 1.2 系统框图 2 微信小程序开发 2.1 UI介绍 2.2 代码实现 3 功能实现 3.1 通信协议 3.2 系统测试 概述 本文主要介绍基于Renesa Version Board,采集多个传感器数据,并将这些数据通过蓝牙模块发送微信…

《黑神话悟空》:国产3A游戏的崛起与AI绘画技术的融合

一、游戏简介 近年来,国产3A游戏《黑神话悟空》以其精美的画面、丰富的剧情和独特的文化底蕴吸引了众多玩家的关注。这款游戏以中国古典名著《西游记》为背景,讲述了孙悟空历经磨难,最终成长为斗战胜佛的故事。在游戏制作过程中,开…

办公必备,免费的在线万能格式转换工具

在当今数字化时代,文件格式转换已成为办公和日常生活中不可或缺的一部分。随着各种文件格式的不断涌现,人们对于高效、便捷的文件转换工具的需求日益增长。小编将为大家介绍几款免费的在线万能格式转换工具,帮助大家轻松应对各种文件转换需求…

golang uint8 转int出现ascll码值

在Golang中,uint8类型被用来表示ASCII码值。 结果是51 如果是uint8(3)的话结果还是3 所以在我们想把一个uint8类型的字符数字转换为int类型时需要特殊处理 减去对应ASCII码’0’的值 结果就是3了

Python循环结束语句 break语句 continue语句

Python break 语句 Python break语句,就像在C语言中,打破了最小封闭for或while循环。 break语句用来终止循环语句,即循环条件没有False条件或者序列还没被完全递归完,也会停止执行循环语句。 break语句用在while和for循环中。 …

df的 一列,是文字, 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2,把最后的数字减去1,写道一个新的列里面

file_pathrf"D:\file\工作簿1-1.xlsx"# from stutil import PandasUtil import pandas as pd dfpd.read_excel(file_path) # PandasUtil. # df的 一列,是文字, 比如 xxxxx-1, xxxx-2 , 最后有 -1 或者 -2,把 -1 变成 -0&#xff…

【测试面试题】14题常见APP测试面试题(参考答案)

大家好,这份面试题不难,都是一些基础题。 先上一个面试题汇总图,建议大家可以先思考下如果是自己能不能回答全,再去对照看参考答案。 下面为参考答案: 一、基础篇 1、APP的测试流程? APP测试流程与web测…

数分基础(03-3)客户特征分析--Tableau

文章目录 客户特征分析 - Tableau1. 说明2. 思路与步骤3. 数据准备和导入3.1 用EXCEL初步检查和处理数据3.1.1 打开3.1.2 初步检查(1)缺失值检查缺失值处理 (2)格式化日期字段(3)其他字段数据类型 &#xf…

在离线环境中安装依赖包

在离线环境中安装依赖包的方法: 参考文章: 1.如何离线下载python依赖包 2.python 依赖包打包 离线下载 3.Python的国内安装源(也称为镜像源) 最终安装效果,有部分失败的,重新下载失败的再去试试

达梦数据库启动与停止

1.1.1数据库启停之菜单方式启动、停止达梦数据库 当数据库服务器是Windows时,开始-->达梦数据库-->点击“DM服务查看器”,找到 “DmService【数据库实例名】” -->右键启动或停止。 下图中数据库实例名是DMSERVER 当数据库服务器是Linux时&…

kali

目录 一、网络配置 二、nat模式 1.检查服务 2.创建虚拟网卡 3.创建kali的网卡信息 三、桥接模式 四、nmap的使用 1.端口扫描 1>扫描主机端口 2>扫描指定端口 2.主机扫描 3.服务识别 4.系统识别 5.漏洞检测 6.导出扫描结果 五、msfconsole的使用 1.简介 …

imFile:全平台下载工具的新星

在数字化时代,我们经常需要下载各种文件和数据。一款好的下载工具不仅能提高我们的工作效率,还能带来愉悦的用户体验。今天,电脑天空将为大家介绍一款基于Motrix开发的全平台下载工具——imFile。 imFile是一款功能强大的下载工具&#xff0…

网络爬虫--生成假数据

爬取网址中的数据。 下面3个分别是姓、女孩名字、男孩名字的网址。 String familyURLStr "http://www.baijiaxing.net.cn/";String girlNameURLStr "https://wannianli.tianqi.com/qiming/news/16536.html";String boyNameURLStr "https://wanni…

python脚本自动备份华为交换机配置,Console重置密码,升级系统文件

Python脚本自动备份华为交换机配置,Console重置密码,升级系统文件 1.说明2.Console口重置密码3.版本升级4.SSH配置5.python脚本—————————————————————————————————————————————————— 1.说明 恢复密码交换机型号:Quidwa…

YB2421E是一款专为降低电磁干扰特性而设计的降压型DC/DC转换器

现代生活中,我们离不开各种电子设备的陪伴,而这些设备的正常运行离不开稳定的电源供应。YB2421E同步降压电压转换器可以满足您对电源供应的需求。 YB2421E是一款专为降低电磁干扰特性而设计的降压型DC/DC转换器。它采用了单片集成电路的设计,…

MyBatis错误

说明:记录一次MyBatis错误,错误信息如下,说数字转换异常,显然,把一个字符串类型转为数字类型,肯定是不行的。 2024-08-29 19:44:43.198 ERROR 24216 --- [nio-9090-exec-2] o.a.c.c.C.[.[.[/].[dispatcher…

RocketMQ部署单机版及集群版本(Docker部署)

目录 前言 单机版部署 1. 准备工作 2. 创建Docker网络 3.启动NameServer 4.启动Broker 5.启动RocketMQ控制台 集群版部署 1.启动NameServer 2.启动Broker 配置文件说明 前言 废话不多直接上干货,我负责踩坑,你负责验证。 单机版部署 1. 准备工…

DCMM数据管理能力成熟度评估模型解读

DCMM(GBT36073-2018)数据管理能力成熟度评估模型解读 DCMM标准的核心点在于通过八个核心能力域和五个成熟度等级的划分,全面评估企业的数据管理能力,并为企业提供提升数据管理能力的路径和方法,从而推动企业在信息化、数字化、智能化方面的发…

光伏设计中组串逆变和微型逆变是什么意思?有什么区别?

在光伏系统设计中,逆变器是核心组件之一,负责将太阳能电池板产生的直流电转换为交流电,以供家庭、商业或电网使用。根据设计和应用场景的不同,逆变器主要分为组串逆变器和微型逆变器两大类。 一、组串逆变器的定义 组串逆变器是太…