鸿蒙HarmonyOS:应用程序开发与使用-延迟加载(lazy import)

news2024/9/21 12:37:20

随着应用程序功能的不断扩展,冷启动所需的时间显著增长,主要是由于在启动初期加载了大量模块,其中存在大量未被实际执行的冗余文件。这种情形不仅拖延了应用的初始化过程,还造成了资源的无效占用。亟需采取措施精简加载流程,剔除非必需的文件执行,以优化冷启动性能,确保用户体验的流畅性。

说明

延迟加载特性在API12版本开始支持。

开发者如需在API12上使用lazy import语法,需在工程中配置"compatibleSdkVersionStage": "beta3",否则将无法通过编译。参考Deveco Studio build-profile.json5配置文件说明

功能特性

延迟加载特性可使待加载文件在冷启动阶段不被加载,直至应用程序实际运行过程中需要用到这些组件时,才按需同步加载相关文件,从而缩短应用冷启动耗时。

使用方式

开发者可以利用诸如Trace工具或日志记录等手段,来识别冷启动期间未被实际调用的文件。通过对这些数据的分析,开发者能够精准地定位出启动阶段不必预先加载的文件列表。针对这些文件的调用点,可以直接增加lazy标识。但需要注意的是,后续执行的加载是同步加载,有可能会阻塞任务执行(如点击任务,触发了延迟加载,那么运行时会去执行冷启动未加载的文件,从而增加耗时),因此是否使用lazy需要开发者自行评估。

说明

不推荐开发者盲目增加lazy,同样会增大编译及运行时的识别开销。

场景行为解析

  • 使用lazy-import延迟加载。

        // main.ets   
        import lazy { a } from "./mod1";    // "mod1" 未执行
        import { c } from "./mod2";         // "mod2" 执行
        
        // ...
        
        console.log("main executed");
        while (false) {
            let xx = a;
        }
        
        // mod1.ets
        export let a = "mod1 executed"
        console.log(a);
        
        // mod2.ets
        export let c = "mod2 executed"
        console.log(c);

    执行结果为:

        main executed
  • 同时对同一模块引用lazy-import与原生import。

        // main.ets   
        import lazy { a } from "./mod1";    // "mod1" 未执行
        import { c } from "./mod2";         // "mod2" 执行
        import { b } from "./mod1";         // "mod1" 执行
        
        // ...
        
        console.log("main executed");
        while (false) {
            let xx = a;
        }
        
        // mod1.ets
        export let a = "mod1 a executed"
        console.log(a);
        
        export let b = "mod1 b executed"
        console.log(b);
        
        // mod2.ets
        export let c = "mod2 c executed"
        console.log(c);

    执行结果为:

        mod2 c executed
        mod1 a executed
        mod1 b executed
        main executed

    如果在mian.ets内删除lazy关键字,执行顺序为:

        mod1 a executed
        mod1 b executed
        mod2 c executed
        main executed

语法规格

lazy-import支持如下指令实现:

语法ModuleRequestImportNameLocalNameAPI12是否支持lazy加载
import lazy { x } from "mod";"mod""x""x"支持
import lazy { x as v } from "mod";"mod""x""v"支持

错误示例

以下写法将引起编译报错。

    export lazy var v;                  // 编译器提示报错:应用编译报错
    export lazy default function f(){}; // 编译器提示报错:应用编译报错
    export lazy default function(){};   // 编译器提示报错:应用编译报错
    export lazy default 42;             // 编译器提示报错:应用编译报错
    export lazy { x };                    // 编译器提示报错:应用编译报错
    export lazy { x as v };               // 编译器提示报错:应用编译报错
    export lazy { x } from "mod";         // 编译器提示报错:应用编译报错
    export lazy { x as v } from "mod";    // 编译器提示报错:应用编译报错
    export lazy * from "mod";           // 编译器提示报错:应用编译报错
    
    import lazy v from "mod";           // 编译器提示报错:应用编译报错
    import lazy * as ns from "mod";     // 编译器提示报错:应用编译报错

与type关键词同时使用将会导致报错。

    import lazy type { obj } from "./mod";    // 不支持,编译器、应用编译报错
    import type lazy { obj } from "./mod";    // 不支持,编译器、应用编译报错

不推荐用法

  • 在同一ets文件中,期待延迟加载的依赖模块标记不完全。

    标记不完全将导致延迟加载失效,并且增加识别lazy-import的开销。

        // main.ets   
        import lazy { a } from "./mod1";    // 从"mod1"内获取a对象,标记为延迟加载
        import { c } from "./mod2";
        import { b } from "./mod1";         // 再次获取"mod1"内属性,未标记lazy,"mod1"默认执行
        
        // ...
  • 延迟加载共享模块或依赖路径内包含共享模块。

    延迟加载对于共享模块依旧生效,使用限制参考共享模块开发指导。

  • 暂不支持lazy-import延迟加载kit。

  • 延迟加载存在的影响。

    • 不依赖该模块的执行的side-effect。

    • 使用导出对象时,触发延迟加载的耗时导致对应特性的功能劣化。

    • 使用lazy特性导致模块未执行而导致的bug。

      开发者需自行评估延迟加载存在的影响。

最后

有很多小伙伴不知道学习哪些鸿蒙开发技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?而且学习时频繁踩坑,最终浪费大量时间。所以有一份实用的鸿蒙(HarmonyOS NEXT)资料用来跟着学习是非常有必要的。 

点击→【纯血版鸿蒙全套最新学习资料】希望这一份鸿蒙学习资料能够给大家带来帮助!~


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

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

路线图适合人群:

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

 获取以上完整版高清学习路线,请点击→纯血版全套鸿蒙HarmonyOS学习资料

2.视频学习资料+学习PDF文档

这份鸿蒙(HarmonyOS NEXT)资料包含了鸿蒙开发必掌握的核心知识要点,内容包含了(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、音频、视频、WebGL、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、(南向驱动、嵌入式等)鸿蒙项目实战等等)鸿蒙(HarmonyOS NEXT)技术知识点。

HarmonyOS Next 最新全套视频教程

​​

 《鸿蒙 (OpenHarmony)开发基础到实战手册》

OpenHarmony北向、南向开发环境搭建

​​

《鸿蒙开发基础》

​​

《鸿蒙开发进阶》

《鸿蒙进阶实战》

​​

大厂面试必问面试题

​​

鸿蒙南向开发技术

​​

鸿蒙APP开发必备

​​
点击→纯血版全套鸿蒙HarmonyOS学习资料

总结

总的来说,华为鸿蒙不再兼容安卓,对程序员来说是一个挑战,也是一个机会。只有积极应对变化,不断学习和提升自己,才能在这个变革的时代中立于不败之地。 

                   

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

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

相关文章

解决IDEA-HTTP状态500-内部服务器错误

目录 背景: 解决过程: MySQL的优点和缺点: 背景: 类型异常报告 消息无法打开Hibernate会话进行事务处理;嵌套异常是org.hibernate.exception.GenericJDBCException:无法连接 描述服务器遇到了意外情况,导致无法满足请求等等.... 在运行项目的时候&…

Linux中以单容器部署Nginx+ASP.NET Core

强烈推荐在生产环境中使用反向代理服务器转发请求到Kestrel Http服务器,本文将会实践将Nginx --->ASP.NET Core 部署架构容器化的过程。 Nginx->ASP.NET Coe部署架构容器化 在Docker中部署Nginx--->ASP.NETCore 有两种选择, 第一种是在单容器…

【Java】解析方法的调用关系

目录 一、方法的定义二、方法的声明格式三、方法的调用四、特殊方法:程序入口main方法五、方法的局部变量六、类的静态变量七、类的静态方法八、方法的传参九、方法的重载 一、方法的定义 方法就是 将功能重复的代码封装成一段独立的代码,通过调用方法的…

Element Plus的el-carousel走马灯平铺多张图片

效果 <template><div class"system-banner"><el-carousel height"320px" indicator-position"outside" :autoplay"false"><el-carousel-item v-for"(item, index) in govList" :key"index"…

「VLM」CLIP 文本与图像的桥梁

github&#xff1a;https://github.com/OpenAI/CLIP paper&#xff1a;Learning Transferable Visual Models From Natural Language Supervision CLIP全称&#xff1a;Contrastive Language-Imge Pre-training&#xff0c;即对比语言-图像预训练。 对比学习是一种更关注于学习…

SD卡无法读取怎么办?4个修复方法千万别错过

SD卡是我们生活中常见的存储设备之一&#xff0c;它小巧方便&#xff0c;容量适中&#xff0c;被广泛应用于数码相机、手机、平板等设备中&#xff0c;随着时间的增长&#xff0c;有时会遇到突然无法读取的问题&#xff0c;这不仅会影响我们的数据访问&#xff0c;还可能造成数…

idea 中的properties文件中文乱码

如遇到以下类似的问题&#xff1a; 配置setting中-》Editor-》File Encodings 中&#xff0c;将以下三处位置的编码格式进行修改 Global Encoding GBK Project Encoding GBK Default encoding for properties files UTF-8 修改之后文件的中文显示正常

MySQl 中对数据表的增删改查(基础)

MySQl 中对数据表的增删改查&#xff08;基础&#xff09; 新增演示插入一条数据插入多条数据 查询全列查询部分列查询查询关于列名的表达式查询时用别名查询去重后的结果查询排序后的结果条件查询比较运算符和逻辑运算符 分页查询 修改删除 黑白图是在命令行里的&#xff0c;彩…

【题解】【枚举】—— [NOIP1997 普及组] 棋盘问题

【题解】【枚举】—— [NOIP1997 普及组] 棋盘问题 [NOIP1997 普及组] 棋盘问题题目背景题目描述输入格式输出格式输入输出样例输入 #1输出 #1 解法1解法2 [NOIP1997 普及组] 棋盘问题 戳我查看题目&#xff08;洛谷&#xff09; 题目背景 NOIP1997 普及组第一题 题目描述 …

Java基础 文字小游戏

souf System.out.printf("你好啊%s","张三") 输出你好啊张三 System.out.printn()放在中间可以换行 System.out.printf("%s你好啊%s","张三","李四") 输出 张三你好啊李四 只有输出没有换行效果。 制作一个文字小游戏…

每期一个小窍门: Goland 配置跳板机登陆

写简单点 先说下大概流程 本地 访问 localhost:6000 --> 转发到跳板机:22 --> 再转发到指定内网地址 本机 .ssh/config Host *ControlPersist yesControlMaster autoControlPath ~/.ssh/%n:%p本机公钥 copy 到跳板机 和内网被跳机 本机命令 ssh -N -f -L 6000:<内…

Linux基础入门---安装vmware

&#x1f600;前言 本篇博文是关于Linux基础入门和vmwarel5.5下载&#xff0c;希望你能够喜欢。 &#x1f3e0;个人主页&#xff1a;晨犀主页 &#x1f9d1;个人简介&#xff1a;大家好&#xff0c;我是晨犀&#xff0c;希望我的文章可以帮助到大家&#xff0c;您的满意是我的动…

告别繁琐ppt制作,用这5款AI工具,一键生成轻松搞定!

在云办公逐渐成为主流的当下&#xff0c;许多职场人士在办公时会首选各类在线应用&#xff0c;最常见的就是在线制作PPT、在线编辑文档、在线编辑表格或智能表格&#xff0c;除此之外&#xff0c;这两年AI人工智能技术的发展&#xff0c;也诞生了许多能一键生成PPT的AI工具。 …

队列的实现及循环队列

一、队列的概念及结构 队列只允许在一端进行插入数据操作&#xff0c;在另一端进行删除数据操作的特殊线性表。队列具有先进先出FIFO&#xff08;Fist In First Out&#xff09;。 入队列&#xff1a;进行插入操作的一端称为队尾。 出队列&#xff1a;进行删除操作的一端称为…

nestjs 大笔记(连载中)

安装 npm i -g nestjs/cli nest new project-name快捷指令 nest g mo xxx # 生成 Module nest g co xxx # 生成 Controller nest g s xxx # 生成 Service nest g resource xxx # 生成一套Restful风格接口

PCIe板卡辅助信号解析

1.简介 PCIe Add-in卡借助PCIe插槽上的辅助信号&#xff0c;实现了很多系统级的功能&#xff0c;比如唤醒、复位、调试、热插拔等功能。具体的辅助信号有REFCLK-/REFCLK、PERST#、WAKE#、SMBCLK、SMBDAT、JTAG、CLKREQ#及PRSNT1#和PRSNT2#等&#xff0c;具体的作用如下&#x…

Facebook国内企业户、海外户、国内二不限户以及三不限户区别何在?

Facebook广告账户的类型和设置对于企业在不同市场中的广告活动至关重要。了解国内企业户、海外企业户&#xff0c;以及国内二不限户和三不限户的区别&#xff0c;可以帮助你更好地选择和管理广告账户。以下是对这些账户类型的详细解析。 一、Facebook海外企业广告账户 海外企业…

kettle的Javascript组件获取T-1天和T+1天

// 获取T-1的时间 var currentDate new Date(); currentDate.setDate(currentDate.getDate() - 1); var currentYear currentDate.getFullYear(); var currentMonth (0 (currentDate.getMonth() 1)).slice(-2); var currentDay (0 currentDate.getDate()).slice(-2); va…

每日OJ_牛客HJ52计算字符串的编辑距离(dp)

目录 牛客HJ52计算字符串的编辑距离&#xff08;dp&#xff09; 解析代码 牛客HJ52计算字符串的编辑距离&#xff08;dp&#xff09; 计算字符串的编辑距离_牛客题霸_牛客网 解析代码 计算字符串的编辑距离&#xff08;也称为Levenshtein距离&#xff09;是一个经典的动态规…

java SE--Lambda表达式和Stream流

一.Lambda表达式 1.Lambda表达式的简介 Lambda表达式是 jdk1.8 引入的一个新特性&#xff0c;它是函数式编程在Java中的一种体现。也是jdk1.8最值得学习的新特性&#xff0c;另一个就是流式编程。 1.Lambda表达式的引入简化了匿名内部类的语法&#xff0c;让代码更加简洁明了…