HarmonyOS 如何在har类型的组件中定义单例

如何在har类型的自定义组件中定义单例

arkts-no-globalthis由于无法为globalThis添加静态类型,只能通过查找的方式访问globalThis的属性,造成额外的性能开销。

另外,无法为globalThis的属性标记类型,无法保证对这些属性操作的安全和高性能。因此ArkTS不支持globalThis。

建议按照业务逻辑根据import/export语法实现数据在不同模块的传递。

必要情况下,可以通过构造的单例对象来实现全局对象的功能。(说明:不能在har中定义单例对象,har在打包时会在不同的hap中打包两份,无法实现单例。)

HarmonyOS
2024-08-23 12:31:54
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

HAR中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝。

因此har无法实现单例。参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/application-package-overview-0000001820999513

如果想要实现单例的话,在多hap工程中har无法实现单例,这边建议将公共能力模块har封装成成hsp包,减少har的重复编译打包,

可以参考文档,多Hap工程 中 包含公共能力模块 以APP SIze优先的方案,缺点是无法跨应用共享,启动性能相对较差.

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/bpta-modular-design-0000001678046862#section64326249113

如果只是实现功能,而不用考虑单例等因素,可以直接使用har包。

关于如何开发har包和hsp包,可以参考文档中,开发静态共享包 和 开发动态共享包

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/ide-creating-har-api9-0000001518082393

HAR 中的代码和资源跟随使用方编译,如果有多个使用方,它们的编译产物中会存在多份相同拷贝;

创建整个应用全局唯一的单例:

如果是持久化轻量级数据,可以使用用户首选项功能:

参考文档:

https://developer.huawei.com/consumer/cn/doc/atomic-references/js-apis-data-preferences-0000001824697893

如果是应用全局的UI状态存储,可以使用AppStorage:

参考文档:

https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-appstorage-0000001774279622以上两种均可用于持久化存储,建议参考文档中的推荐,讲数据内容类的存储进用户首选项,将ui状态类的,存储到AppStorage中。

目前确实存在hsp和hap都引用har中的static变量,hsp中变量地址值不一致的问题。了解到目前有需求正在跟踪中,请耐心等待目前有个规避方案,适用于您给的demo

1. 将RouterModule模块单独编译成.har

2. 在工程级新建lib目录,将RouterModule.har放入

3. 将项目中所有依赖RouterModule的模块的oh-package.json5改成

"@ohos/routermodule": "file:../lib/RouterModule.har
分享
微博
QQ
微信
回复
2024-08-23 15:32:16
相关问题
关于文档har不能用疑惑
1809浏览 • 1回复 待解决
HarmonyOS 对象如何实现
393浏览 • 1回复 待解决
HarmonyOS Entry和Hsp创建失效
410浏览 • 1回复 待解决
HarmonyOS 如何构建跨动态库
303浏览 • 1回复 待解决
在hsp存在多个情况
249浏览 • 1回复 待解决
如何获取为undefined
433浏览 • 1回复 待解决
HarmonyOS 模式拿不到类对象
306浏览 • 1回复 待解决
实现模式下数据存储
1010浏览 • 1回复 待解决
创建换了页面后不生效问题
2163浏览 • 3回复 待解决
ArkTS层实例化与介绍
2798浏览 • 1回复 待解决
首选项获取实例,实例是否为
1940浏览 • 1回复 待解决
如何在HAR获取targetname?
154浏览 • 1回复 待解决