往期鸿蒙全套实战文章必看:(附带鸿蒙全栈学习资料)


模块间循环依赖导致运行时未初始化异常问题定位

问题场景

模块间循环依赖可能导致应用运行时模块依赖的变量未初始化,如下示例。index.ets文件执行前,会先执行依赖的page.ets文件,page.ets文件执行时又循环依赖了index.ets导出的foo符号。此时index.ets文件未执行,foo变量尚未完成初始化,会导致运行时异常。

// index.ets
import { bar } from './page'

export function foo() {
  bar()
}

// page.ets
import { foo } from './index'

export function bar() {
  foo()
}
bar()

问题现象

运行时发生js crash, crash日志中报错信息为:Error message: foo is not initialized

解决措施

开发者可以通过IDE中Code Linter检查工具识别应用代码中的循环依赖并进行代码重构,消除循环依赖影响,工具详情请参考代码Code Linter检查。操作步骤如下:

  1. 在工程根目录下创建code-linter.json5配置文件,配置如下:
    {
      "files": [ // 用于表示配置适用的文件范围的 glob 模式数组。
      "**/*.js",
      "**/*.ts",
      "**/*.ets"
      ],
      "rules": {
      "@security/no-cycle": "error" // 配置循环依赖检查规则。
      }
    }
  2. 在工程管理窗口中鼠标选中工程根目录,右键选择Code Linter > Full Linter执行代码全量检查。
  3. 根据检查结果,对应用代码中的循环依赖部分进行代码重构。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐