From bdffd6cacfb075456542dba6e6ffcc0a29240c87 Mon Sep 17 00:00:00 2001 From: tangjie Date: Sat, 21 Jun 2025 07:26:58 +0000 Subject: [PATCH] update zh-cn/application-dev/arkts-utils/arkts-lazy-import.md. Signed-off-by: tangjie --- .../arkts-utils/arkts-lazy-import.md | 260 +++++++++--------- 1 file changed, 130 insertions(+), 130 deletions(-) diff --git a/zh-cn/application-dev/arkts-utils/arkts-lazy-import.md b/zh-cn/application-dev/arkts-utils/arkts-lazy-import.md index 478e4a13f1b..e2081ff8b1e 100644 --- a/zh-cn/application-dev/arkts-utils/arkts-lazy-import.md +++ b/zh-cn/application-dev/arkts-utils/arkts-lazy-import.md @@ -26,80 +26,80 @@ - 使用lazy-import延迟加载。 - ```typescript - // main.ets - import lazy { a } from "./mod1"; // "mod1" 未执行 - import { c } from "./mod2"; // "mod2" 执行 +```typescript +// main.ets +import lazy { a } from "./mod1"; // "mod1" 未执行 +import { c } from "./mod2"; // "mod2" 执行 - // ... +// ... - console.info("main executed"); - while (false) { - let xx = a; - } +console.info("main executed"); +while (false) { + let xx = a; +} - // mod1.ets - export let a = "mod1 executed" - console.info(a); +// mod1.ets +export let a = "mod1 executed" +console.info(a); - // mod2.ets - export let c = "mod2 executed" - console.info(c); +// mod2.ets +export let c = "mod2 executed" +console.info(c); - ``` +``` - 执行结果为: +执行结果为: - ```typescript - mod2 executed - main executed - ``` +```typescript +mod2 executed +main executed +``` - 同时对同一模块引用lazy-import与原生import。 - ```typescript - // main.ets - import lazy { a } from "./mod1"; // "mod1" 未执行 - import { c } from "./mod2"; // "mod2" 执行 - import { b } from "./mod1"; // "mod1" 执行 +```typescript +// main.ets +import lazy { a } from "./mod1"; // "mod1" 未执行 +import { c } from "./mod2"; // "mod2" 执行 +import { b } from "./mod1"; // "mod1" 执行 - // ... +// ... - console.info("main executed"); - while (false) { - let xx = a; - } +console.info("main executed"); +while (false) { + let xx = a; +} - // mod1.ets - export let a = "mod1 a executed" - console.info(a); +// mod1.ets +export let a = "mod1 a executed" +console.info(a); - export let b = "mod1 b executed" - console.info(b); +export let b = "mod1 b executed" +console.info(b); - // mod2.ets - export let c = "mod2 c executed" - console.info(c); +// mod2.ets +export let c = "mod2 c executed" +console.info(c); - ``` +``` - 执行结果为: +执行结果为: - ```typescript - mod2 c executed - mod1 a executed - mod1 b executed - main executed - ``` +```typescript +mod2 c executed +mod1 a executed +mod1 b executed +main executed +``` - 如果在main.ets内删除lazy关键字,执行顺序如下: +如果在main.ets内删除lazy关键字,执行顺序如下: - ```typescript - mod1 a executed - mod1 b executed - mod2 c executed - main executed - ``` +```typescript +mod1 a executed +mod1 b executed +mod2 c executed +main executed +``` ## 语法规格及起始支持版本 @@ -120,27 +120,26 @@ 以下写法将引起编译报错。 ```typescript - 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 * as ns from "mod"; // 编译器提示报错:应用编译报错 - import lazy KitClass from "@kit.SomeKit" // 编译器提示报错:应用编译报错 - impott lazy * as MyKit from "@kit.SomeKit" // 编译器提示报错:应用编译报错 +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 * as ns from "mod"; // 编译器提示报错:应用编译报错 +import lazy KitClass from "@kit.SomeKit" // 编译器提示报错:应用编译报错 +impott lazy * as MyKit from "@kit.SomeKit" // 编译器提示报错:应用编译报错 ``` 与type关键词同时使用会导致编译报错。 ```typescript - import lazy type { obj } from "./mod"; // 不支持,编译器、应用编译报错 - import type lazy { obj } from "./mod"; // 不支持,编译器、应用编译报错 - +import lazy type { obj } from "./mod"; // 不支持,编译器、应用编译报错 +import type lazy { obj } from "./mod"; // 不支持,编译器、应用编译报错 ``` ### 不推荐用法 @@ -148,71 +147,72 @@ - 在同一ets文件中,期待延迟加载的依赖模块标记不完全。 标记不完全将导致延迟加载失效,并且增加识别延迟加载的开销。 - ```typescript - // main.ets - import lazy { a } from "./mod1"; // 从"mod1"内获取a对象,标记为延迟加载 - import { c } from "./mod2"; - import { b } from "./mod1"; // 再次获取"mod1"内属性,未标记lazy,"mod1"默认执行 +```typescript +// main.ets +import lazy { a } from "./mod1"; // 从"mod1"内获取a对象,标记为延迟加载 +import { c } from "./mod2"; +import { b } from "./mod1"; // 再次获取"mod1"内属性,未标记lazy,"mod1"默认执行 - // ... - ``` +// ... +``` - 在同一ets文件中,未使用懒加载变量并再次导出,不支持延迟加载变量被re-export导出,可以通过打开工程级build-profile.json5文件中的reExportCheckMode开关进行扫描排查。 - ```typescript - // build-profile.json5 - "arkOptions":{ - "reExportCheckMode":"compatible" - } - ``` - - > **说明:** - > - > - 针对以下场景,编译时是否进行拦截报错:使用lazy import导入的变量,在同文件中被再次导出。 - > - noCheck(缺省默认值):不检查,不报错。 - > - compatible:兼容模式,报Warning。 - > - strict:严格模式,报Error。 - > - 该字段从DevEco Studio 5.0.13.200版本开始支持。 - - 这种方式导出的变量c未在B.ets中使用,因此B.ets不触发执行。在A.ets中使用变量c时,该变量未初始化,会抛出JavaScript异常。 - ```typescript - // A.ets - import { c } from "./B"; - console.info(c); - - // B.ets - import lazy { c } from "./C"; // 从"C"内获取c对象,标记为延迟加载 - export { c } - - // C.ets - let c = "c"; - export { c } - ``` - 执行结果: - ```typescript - ReferenceError: c is not initialized - at func_main_0 (A.ets:2:13) - ``` - - ```typescript - // A_ns.ets - import * as ns from "./B"; - console.info(ns.c); - - // B.ets - import lazy { c } from "./C"; // 从"C"内获取c对象,标记为延迟加载 - export { c } - - // C.ets - let c = "c"; - export { c } - ``` - 执行结果: - ```typescript - ReferenceError: module environment is undefined - at func_main_0 (A_ns.js:2:13) - ``` +```typescript +// build-profile.json5 +"arkOptions":{ + "reExportCheckMode":"compatible" +} +``` + +> **说明:** +> +> - 针对以下场景,编译时是否进行拦截报错:使用lazy import导入的变量,在同文件中被再次导出。 +> - noCheck(缺省默认值):不检查,不报错。 +> - compatible:兼容模式,报Warning。 +> - strict:严格模式,报Error。 +> - 该字段从DevEco Studio 5.0.13.200版本开始支持。 + +这种方式导出的变量c未在B.ets中使用,因此B.ets不触发执行。在A.ets中使用变量c时,该变量未初始化,会抛出JavaScript异常。 +```typescript +// A.ets +import { c } from "./B"; +console.info(c); + +// B.ets +import lazy { c } from "./C"; // 从"C"内获取c对象,标记为延迟加载 +export { c } + +// C.ets +let c = "c"; +export { c } +``` +执行结果: +```typescript +ReferenceError: c is not initialized + at func_main_0 (A.ets:2:13) +``` + +```typescript +// A_ns.ets +import * as ns from "./B"; +console.info(ns.c); + +// B.ets +import lazy { c } from "./C"; // 从"C"内获取c对象,标记为延迟加载 +export { c } + +// C.ets +let c = "c"; +export { c } +``` +执行结果: +```typescript +ReferenceError: module environment is undefined + at func_main_0 (A_ns.js:2:13) +``` ### 开发者应评估使用延迟加载可能产生的影响 - 不依赖该模块执行的副作用(如初始化全局变量,挂载globalThis等)。可参考:[模块加载副作用及优化](./arkts-module-side-effects.md)。 - 使用导出对象时,触发延迟加载的耗时导致对应特性的功能劣化。 - 使用lazy特性导致模块未执行,从而引发bug。 + -- Gitee