HarmonyOS鸿蒙Next中ArkTS能否在编译期执行某些代码?

HarmonyOS鸿蒙Next中ArkTS能否在编译期执行某些代码? arkts能否在编译期执行某些代码?

比如说像c一样在编译期记录__attribute__来写入数据到data区

自定义路由实现自注册功能有没有什么好的方法

3 回复

arkts能否在编译期执行某些代码?==》 目前不支持。

针对动态自动注册的方案,可参考以下实现:(补充说明:reflect-metadata非必要,TS的注解已可达到目的)

  1. 注册类实例化:注解回调中的target为类定义,实例化方法可参考:

    let abc : IShape = new (getImplementations("Square") as ESObject)() as IShape;
    
  2. 类动态自动注册:为了保证所有依赖har包的类全部加载,需要借助动态import的能力在业务使用注解前完成har包加载。以您提供的Demo为例,library_other中的Test2PlugModule如果在entry模块没有主动使用过,则注解不会被识别并注册到Map中,解决此问题方法,entry模块依赖的library_other配置成动态HAR模块,并在entry的EntryAbility的onCreate方法中增加import(‘library_other’)完成加载,注意这会导致APP启动时间因全量加载har而有所增长。

最小样代码参考:

// 注册登记Map
const implementMap = new Map<string, Function>(); 

export function myImplements(className: string) : Function { //注解定义及Class注册
return (target: Function) => {
implementMap.set(className, target)
};
}

export interface IShape { //接口定义
draw(): void;
}

export function getImplementations(className: string): Function | undefined { // 根据类名获取实现类定义
return implementMap.get(className) ;
}

export function getImplementationMap():Map<string, Function>{ //获取所有类注册的实现类
return implementMap;
}

// 使用注解的实现类:
@myImplements("Square")
export class Square implements IShape {
draw() {
console.log("Drawing a square");
}
}

// 使用
let abc : IShape = new (getImplementations("Square") as ESObject)() as IShape;
abc.draw();

// entry模块oh-package.json5增加配置:
"buildOption": {
"arkOptions": {
"runtimeOnly": {
"packages": [ "xxx" ] // 配置本模块变量动态import其他模块名,要求与dependencies中配置的名字一致。
}
}
}

更多关于HarmonyOS鸿蒙Next中ArkTS能否在编译期执行某些代码?的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,ArkTS(Ark TypeScript)是一种基于TypeScript的语言,主要用于开发鸿蒙应用。ArkTS本身并不支持在编译期执行代码。编译期执行代码通常是指在代码编译阶段执行某些操作或逻辑,而ArkTS的设计重点在于运行时的性能和开发效率。

ArkTS的编译过程主要是将TypeScript代码转换为JavaScript,然后通过鸿蒙的运行时环境执行。编译期的任务主要是语法检查、类型检查和代码优化,而不是执行具体的业务逻辑。因此,ArkTS无法在编译期执行代码。

如果需要实现类似编译期执行代码的功能,通常需要借助构建工具或预处理器在编译前进行代码生成或转换,但这已经超出了ArkTS语言本身的范围。

在HarmonyOS鸿蒙Next中,ArkTS暂时不支持在编译期执行代码。ArkTS主要基于TypeScript,其编译过程主要是将TypeScript代码转换为JavaScript代码,再通过引擎执行。编译期的代码执行通常需要语言或框架提供特定的元编程能力,如宏或编译期函数,而ArkTS目前并未提供此类功能。开发者需要在运行时处理逻辑和动态行为。

回到顶部